我試圖使用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
我使用的暗號反饋模式,因爲我希望能夠加密和解密任何長度的字符串,加上它不會打擾我,因爲我只打算加密小字符串,因此它可以逐字節地工作。
我在這裏做錯了什麼?
對於使用相同密鑰的每次加密,IV必須不同(讀取:隨機)。不要使用靜態IV,因爲這會使密碼具有確定性,並允許攻擊者在觀察到多個密文時推斷明文。這就是所謂的許多時間墊(或[兩次墊(https://twitter.com/angealbertini/status/425561082841690112/photo/1))。 IV不是祕密的,所以你可以把它和密文一起發送。通常,它只是在密文前面加上,然後在解密之前切掉。 – 2017-04-26 05:27:51