2017-04-26 426 views
0

這裏得到不同的結果是我的代碼:AES使用相同的密鑰和IV加密明文一樣反覆

from Crypto.Cipher import AES 
import binascii 

def encrypt(secret_key, sign, raw): 
    key = md5(secret_key).hexdigest()[::-2] 
    iv = md5(sign).hexdigest()[::-2] 
    raw += (16 - len(raw) % 16) * '\0' 
    generator = AES.new(key, AES.MODE_CBC, IV=iv) 

    #*********************************************** 
    #Problems occur at here ! 
    #If I execute "generator.encrypt(raw)" 
    #The results are not same every time 

    print generator.encrypt(raw) # result_1 
    print generator.encrypt(raw) # result_2 
    print generator.encrypt(raw) # result_3 

    #*********************************************** 

    return binascii.b2a_hex(generator.encrypt(raw)) 

我會得到不同的結果時,我每次執行「generator.encrypt(生) 「 這對我來說非常混亂,因爲我使用了相同的KEY和IV。

我想建立一個API-系統,我需要別人發佈他們的加密數據,不管他們使用哪種語言,只是想在AES中得到相同的結果。

如何在使用AES時獲得穩定的結果?

我的意思是我想在使用相同的KEY和IV來加密相同的明文時得到相同的結果。

+0

某處,您的IV正在重新初始化。我在Golang AES實施中發生了這種情況。您需要閱讀文檔以瞭解每一步的功能。 –

+0

將AES.new(key,AES.MODE_CBC,IV = iv)更改爲generator = AES.new(key,AES.MODE_CBC,iv)並參見 –

回答

0

pycrypto中的AES實現是CBC模式的有狀態。這種狀態可以通過IV值來模擬。爲了簡單起見,我們假設raw比16字節短。

在這種情況下,代碼

raw += (16 - len(raw) % 16) * '\0' 
generator = AES.new(key, AES.MODE_CBC, IV=iv) 

print generator.encrypt(raw) # result_1 
print generator.encrypt(raw) # result_2 
print generator.encrypt(raw) # result_3 

相當於

raw += (16 - len(raw) % 16) * '\0' 
generator = AES.new(key, AES.MODE_CBC, IV=iv) 
ct1 = generator.encrypt(raw) 
print ct1 # result_1 

generator = AES.new(key, AES.MODE_CBC, IV=ct1) 
ct2 = generator.encrypt(raw) 
print ct2 # result_2 

generator = AES.new(key, AES.MODE_CBC, IV=ct2) 
ct3 = generator.encrypt(raw) 
print ct3 # result_3 

的原因是,IV根據CBC mode的定義內部前進。這意味着IV被設置爲最後一個完整的密文塊。

如果raw被認爲是任何長度,那麼下面就等於只有密文的最後一塊被用作IV下一個加密:如果你不

raw += (16 - len(raw) % 16) * '\0' 
generator = AES.new(key, AES.MODE_CBC, IV=iv) 
ct1 = generator.encrypt(raw) 
print ct1 # result_1 

generator = AES.new(key, AES.MODE_CBC, IV=ct1[-16:]) 
ct2 = generator.encrypt(raw) 
print ct2 # result_2 

generator = AES.new(key, AES.MODE_CBC, IV=ct2[-16:]) 
ct3 = generator.encrypt(raw) 
print ct3 # result_3 

想要的話,那麼你需要用原來的IV初始化generator

+0

謝謝!它真的解決了我的問題! – Jolly23

相關問題