2012-07-24 82 views
2

我試圖使用AES安全地存儲一些自制密碼安全的密碼,但由於某種原因,我沒有從AES.decrypt得到原始數據。這是我與測試代碼:爲什麼AES.decrypt沒有返回我的原始文本?

from Crypto.Cipher import AES 
from Crypto.Hash import SHA256 

def sha1(text): 
    s = SHA256.new() 
    s.update(text) 
    return s.hexdigest() 

aes = AES.new('JG9A90cqiveJ8K7n', AES.MODE_CFB, 'g4vhFIR1KncRIyvO') 

text = 'This is some text that will be encrypted' 
encrypted_text = aes.encrypt(text) 
decrypted_text = aes.decrypt(encrypted_text) 

print 'Original:\t' + sha1(text) 
print 'Encrypted:\t' + sha1(encrypted_text) 
print 'Decrypted:\t' + sha1(decrypted_text) 

它的輸出:

Original: 099e17130a9c796c8b7f21f269a790e877c7f49b6a39deda33d4e7b63b80c049 
Encrypted: 71006ff5dc695a32c020dbb27c45b4861ec10a76e40d349bf078bca56b57d5bb 
Decrypted: 2683455f4ae01e3cd1cba6c2537712fee8783621f32c865b8d4526130ff0096d

我使用的暗號反饋模式,因爲我希望能夠加密和解密任何長度的字符串,加上它不會打擾我,因爲我只打算加密小字符串,因此它可以逐字節地工作。

我在這裏做錯了什麼?

+0

對於使用相同密鑰的每次加密,IV必須不同(讀取:隨機)。不要使用靜態IV,因爲這會使密碼具有確定性,並允許攻擊者在觀察到多個密文時推斷明文。這就是所謂的許多時間墊(或[兩次墊(https://twitter.com/angealbertini/status/425561082841690112/photo/1))。 IV不是祕密的,所以你可以把它和密文一起發送。通常,它只是在密文前面加上,然後在解密之前切掉。 – 2017-04-26 05:27:51

回答

7

因爲您正在使用相同的aes對象進行加密和解密。加密後,初始值已更改。所以你沒有使用相同的初始值進行解密。以下工作(redeclaring aes):

from Crypto.Cipher import AES 
from Crypto.Hash import SHA256 

def sha1(text): 
    s = SHA256.new() 
    s.update(text) 
    return s.hexdigest() 

aes = AES.new('JG9A90cqiveJ8K7n', AES.MODE_CFB, 'g4vhFIR1KncRIyvO') 

text = 'This is some text that will be encrypted' 
encrypted_text = aes.encrypt(text) 

aes = AES.new('JG9A90cqiveJ8K7n', AES.MODE_CFB, 'g4vhFIR1KncRIyvO') 
decrypted_text = aes.decrypt(encrypted_text) 

print 'Original:\t' + sha1(text) 
print 'Encrypted:\t' + sha1(encrypted_text) 
print 'Decrypted:\t' + sha1(decrypted_text) 
+0

奇怪的嘗試它。我正在關注[官方文檔中的示例](https://www.dlitz.net/software/pycrypto/doc/#crypto-cipher-encryption-algorithms),它不會重新創建密碼。我猜這是在某個地方提到的,AES密碼必須被使用***只有一次***,但我沒有發現它。 – Hubro 2012-07-24 11:45:51

+1

@Codemonkey它似乎只對Crypto.Cipher提到以下內容:'IV:包含將用於啓動密碼反饋模式的初始值。加密或解密字符串後,此值將反映修改後的反饋文本;它將始終是一個塊。它是隻讀的,不能被分配一個新的值 – klennepette 2012-07-24 11:52:43

0

不知道爲什麼,但這個工程:

key = b"JG9A90cqiveJ8K7n" 
mode = AES.MODE_CFB 
iv = b"g4vhFIR1KncRIyvO" 

text = 'This is some text that will be encrypted' 

aes_enc = AES.new(key, mode, iv) 
enc = aes_enc.encrypt(text) 

aes_dec = AES.new(key, mode) 
dec = aes_dec.decrypt(iv + enc) 

assert text == dec[16:] 

我得查查IV和填充的細節,太:)

編輯:

http://packages.python.org/pycrypto/Crypto.Cipher.blockalgo-module.html#MODE_CFB

+1

IV需要與密文一起存儲才能解密。這通常是通過簡單地將IV添加到密文中來完成的。我的假設是,你的例子的工作原理是因爲你完成了將IV加密到密文的手動步驟(** aes_dec.decrypt(iv + enc)**)。 你的例子沒有工作,當我在Python 2.7.11 – Mark 2016-04-22 00:11:25

相關問題