我正在玩PyCrypto的AES和DES实现。每次,我解密一个密文,我从纯文本加密,它给出随机字符串。
我尝试了以下方法:
from Crypto.Cipher import AES,DES
from Crypto import Random
iv_AES = Random.new().read(AES.block_size)
iv_DES = Random.get_random_bytes(8)
key_AES = 'abcdefghijklmnop'
key_DES = 'abcdefgh'
aes = AES.new(key_AES,AES.MODE_CFB,iv_AES)
aes1 = AES.new(key_AES,AES.MODE_CFB,iv_AES)
des = DES.new(key_DES,DES.MODE_CFB,iv_DES)
des1 = DES.new(key_DES,DES.MODE_CFB,iv_DES)
plaintext = 'Hello! World'
print plaintext == aes.decrypt(aes.encrypt(plaintext))
print plaintext == des.decrypt(des.encrypt(plaintext))
print plaintext == aes1.decrypt(aes.encrypt(plaintext))
print plaintext == des1.decrypt(des.encrypt(plaintext))
结果:
False
False
True
True
我不明白为什么会这样。
你能解释一下这里到底发生了什么,为什么会这样吗?
来自 PyCrypto 文档:
这也意味着您不能重复使用一个对象来加密或解密具有相同密钥的其他数据。
问题是您必须重新初始化密码,或者 - 可能更好 - 构造单独的对象实例以进行加密和解密。
from Crypto.Cipher import AES,DES
from Crypto import Random
iv_AES = Random.new().read(AES.block_size)
iv_DES = Random.get_random_bytes(8)
key_AES = 'abcdefghijklmnop'
key_DES = 'abcdefgh'
aese = AES.new(key_AES,AES.MODE_CFB,iv_AES)
aesd = AES.new(key_AES,AES.MODE_CFB,iv_AES)
dese = DES.new(key_DES,DES.MODE_CFB,iv_DES)
desd = DES.new(key_DES,DES.MODE_CFB,iv_DES)
plaintext = 'Hello! World'
print plaintext == aesd.decrypt(aese.encrypt(plaintext))
print plaintext == desd.decrypt(dese.encrypt(plaintext))