使用pyCrypto AES解密验证密钥正确性

1 投票
3 回答
4915 浏览
提问于 2025-04-15 15:32

我该如何确认在使用pyCrypto AES解密AES加密的数据时,使用的是正确的密钥呢?

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

如果使用了错误的密钥,它仍然会尝试解密数据,但解密后的数据会变得更加混乱。我可以做什么测试来证明数据已经被解密回原来的状态呢?

3 个回答

0

看看这篇博客,它里面有你需要的示例代码(比如说,CRC)。
Python对称加密与CRC

2

我不相信你能 [判断密钥是否正确],仅凭AES上下文
也就是说,除了通过验证格式和/或解码后明文的一些消息摘要值之外,你无法做到这一点,这意味着你需要知道这样的结构或消息摘要。

虽然这只是算法/协议建立方式的一个结果,但其中一个好处是,这使得对这种加密方式的暴力破解变得更加困难,因为你需要花时间解码至少部分消息,并且还要通过一个明文检测器。明文检测器是一种逻辑,它对明文的性质有先验的或猜测的理解,可以判断数据是否符合这个预期;例如,一个简单的检测器可能会检查前20个字节是否是美国ASCII码。这在多种编码方案中尤其有用,比如三重DES,因为你根本不知道(好吧,密码分析天才可能有一点想法……)中间的“明文”是什么样子的。

编辑: 为了回答OP在笔记中的问题
是的,如果你不确定密钥,你需要在尝试解码之前备份密文。如果用错误的密钥解码,它将返回真正的乱码(而且不容易反向恢复,甚至根本无法恢复)。
为了引入一种检测解码消息有效性的方法,无论是二进制还是ASCII/文本消息,你可以使用以下“信封”概念的变体。
注意:这可能会[轻微]削弱你的加密设置的强度。
这假设你对编码过程有控制或合作。这适用于ASCII和二进制内容。
这个想法很简单,就是在消息前面加一个前缀(“头部”),可能还要加一个后缀(“尾部”)。为了在加密上更安全,这个前缀应该足够长(比如500字节?),并且大部分内容应该是随机的。然后你需要把实际消息放入这个“信封”中,并在解密后验证信封的有效性/完整性。一个初步的例子:

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

一个简单(但对加密有点“危险”)的方法就是在数据前面加上,比如“我的数据很好123ABC”。在解密时,你会验证解密后的数据流是否以这16个字节开头,然后去掉它们以获取实际消息。

8

你可以使用 基于密码的消息认证码 (CMAC),或者也可以用 HMAC(基于哈希的消息认证码)(如果你有可用的哈希函数的话)。

有一些明确的方法可以把加密和认证结合起来。可以看看 认证加密 (AE)

撰写回答