【发布时间】:2012-07-24 11:21:38
【问题描述】:
我正在尝试使用 AES 将一些密码安全地存储在自制密码保险箱中,但由于某种原因,我没有从 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)
它的输出:
原文:099e17130a9c796c8b7f21f269a790e877c7f49b6a39deda33d4e7b63b80c049 加密:71006ff5dc695a32c020dbb27c45b4861ec10a76e40d349bf078bca56b57d5bb 解密:2683455f4ae01e3cd1cba6c2537712fee8783621f32c865b8d4526130ff0096d
我使用密码反馈模式是因为我希望能够加密和解密任何长度的字符串,而且它不会打扰我,因为我只是在计划关于加密小字符串。
我在这里做错了什么?
【问题讨论】:
-
对于使用相同密钥的每个加密,IV 必须不同(读取:随机)。不要使用静态 IV,因为这会使密码具有确定性,并允许攻击者在观察到多个密文时推断出明文。这称为多次填充(或two-time pad)。 IV 不是秘密,因此您可以将其与密文一起发送。通常,它只是简单地添加到密文中,并在解密之前被切掉。