Pycryptodome 无法解密数据
Pycryptodome can't decrypt data
为什么cipher3不能解密密码数据?
- cipher2 和 cipher3 使用相同的随机数,但 cipher3 无法解密数据
代码:
>>> from Crypto.Cipher import AES
>>> cipher = AES.new(b"M"*16, AES.MODE_EAX)
>>> cipher2 = AES.new(b"M"*16, AES.MODE_EAX, cipher.nonce)
>>> cipher3 = AES.new(b"M"*16, AES.MODE_EAX, cipher.nonce)
>>> data = cipher.encrypt(b"Hello")
>>> data2 = cipher.encrypt(b"World")
>>> cipher2.decrypt(data)
b'Hello'
>>> cipher3.decrypt(data2)
b'S\xa5\x92\xa2\x9a'
>>> cipher2.decrypt(data2)
b'World'
问题是您用于解密的密码对象(cipher2
,在您的情况下为 cipher3
)必须按照生成密文的顺序 提供密文(在你的情况下 cipher
)。
相反,您将 data2
作为第一段密文传递给 cipher3
,即使它是第二段生成的。
这适用于其他几种密码模式,而不仅仅是 EAX。
另请注意,EAX 是一种经过身份验证的密码模式:您应该使用方法decrypt_and_verify()
,除非您有充分的理由不这样做。
为什么cipher3不能解密密码数据?
- cipher2 和 cipher3 使用相同的随机数,但 cipher3 无法解密数据
代码:
>>> from Crypto.Cipher import AES
>>> cipher = AES.new(b"M"*16, AES.MODE_EAX)
>>> cipher2 = AES.new(b"M"*16, AES.MODE_EAX, cipher.nonce)
>>> cipher3 = AES.new(b"M"*16, AES.MODE_EAX, cipher.nonce)
>>> data = cipher.encrypt(b"Hello")
>>> data2 = cipher.encrypt(b"World")
>>> cipher2.decrypt(data)
b'Hello'
>>> cipher3.decrypt(data2)
b'S\xa5\x92\xa2\x9a'
>>> cipher2.decrypt(data2)
b'World'
问题是您用于解密的密码对象(cipher2
,在您的情况下为 cipher3
)必须按照生成密文的顺序 提供密文(在你的情况下 cipher
)。
相反,您将 data2
作为第一段密文传递给 cipher3
,即使它是第二段生成的。
这适用于其他几种密码模式,而不仅仅是 EAX。
另请注意,EAX 是一种经过身份验证的密码模式:您应该使用方法decrypt_and_verify()
,除非您有充分的理由不这样做。