使用pyCrypto AES解密验证密钥是否正确

时间:2009-10-30 20:31:11

标签: python cryptography aes encryption

如何使用pyCrypto AES验证正确的密钥是否用于解密AES加密数据?

cipher = AES.new(key, AES.MODE_CFB)
cipher.decrypt(s)

如果使用了错误的密钥,它仍会尝试解密数据,对其进行更多的混淆。我是否可以做任何测试来证明数据被解密为原始状态?

3 个答案:

答案 0 :(得分:8)

您可以使用Cipher-based Message Authentication Code (CMAC)HMAC (Hash-based Message Authentication Code)(如果您有哈希函数可用)。

有定义的方法来组合加密和身份验证。请参阅Authenticated Encryption (AE)

答案 1 :(得分:2)

我认为你不能 [告诉密钥是否正确],仅使用AES上下文
也就是说,除了通过验证解码后的明文格式和/或某些消息摘要值之外,你不能这样做,这意味着你知道这样的结构或消息摘要。

虽然这仅仅是算法/协议建立方式的结果,但其中一个好处是,这使得对这些密码的暴力攻击更加困难,因为需要花费时间并解码至少部分消息,并通过明文检测器传递。明文检测器是一种逻辑,它具有对明文性质的先验/猜测的理解,并且可以判断数据是否满足这种期望;例如,简单的检测器可以检查前20个字节是否为US ASCII)。这对于多重编码方案特别有用,例如三重DES,其中一个人没有线索(好的密码分析天才可能有一个温和的想法......)中间的“明文”看起来像。

编辑:在笔记中回答OP的问题 是的,如果您不确定密钥,则需要复制密文,然后再尝试解密。如果使用错误的密钥解码,它将返回真正的乱码(如果有的话,并不容易逆转)。
要为二进制和ASCII /文本消息引入检测解码消息的有效性的方法,您可以使用以下“ envellope 的变体“概念。
注意:这可能[温和地]削弱了加密设置的强度 这假设您也可以控制或协作编码过程。这适用于ASCII和二进制内容
这个想法只是为消息添加一个前缀(“标题”),可能还有一个后缀(“预告片”)。为了加密更安全,这样的前缀应该足够长(比如500字节?)并且其大部分内容本质上是随机的。然后,您需要在此“enveloppe”中插入实际消息,并在解密后声明信封的有效性/完整性。试探性的例子:

17 random bytes
2 bytes length of this header  (allows to have a variable length header)
1 byte offset to "fingerprint"
x random bytes
fingerprint = a short binary (preferably) or ascii constant text  "MyDataIsOk"
[optionally: length of the payload and/or a CRC / MD5 / digest-of-sort for it]
y random bytes
followed by the actual message

简化(但对于加密有点“危险”)只是在数据前添加“MyDataIsGood123ABC”。在解密时,您将验证解密的流是以这16个字节的字节开头的,并且您将删除它们以获取实际的消息。

答案 2 :(得分:0)

看一下这篇博客文章,它包含了做你需要的示例代码(即CRC) Python symmetric encryption with CRC