1

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

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

如果使用了不正确的密钥,它仍然会尝试解密数据,从而使数据更加模糊。我可以做任何测试来证明数据正在被解密到原始状态吗?

4

3 回答 3

8

您可以使用基于密码的消息验证码 (CMAC)HMAC(基于哈希的消息验证码)(如果您有可用的哈希函数)。

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

于 2009-10-31T12:32:44.387 回答
2

我不相信你可以[判断密钥是否正确],仅使用 AES 上下文
即你不能,除了在解码后验证明文的格式和/或一些消息摘要值,这意味着你知道这样的结构或消息摘要。

尽管这仅仅是算法/协议建立方式的结果,但这样做的好处之一是,这使得对此类密码的暴力攻击更加困难,因为需要花时间解码至少部分消息并且还要通过明文检测器。明文检测器是一些对明文性质具有先验/猜测理解的逻辑,它可以判断数据是否符合预期;例如,一个简单的检测器可以检查前 20 个字节是否为 US ASCII)。这对于像三重 DES 这样的多种编码方案特别有用,其中一个人不知道中间“明文”是什么样的(密码分析天才可能有一个温和的想法……)。

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

17 个随机字节
此标头的 2 字节长度(允许具有可变长度标头)
“指纹”的 1 个字节偏移量
x 随机字节
指纹 = 一个简短的二进制(最好)或 ascii 常量文本“MyDataIsOk”
[可选:有效载荷的长度和/或它的 CRC / MD5 / 分类摘要]
y 个随机字节
其次是实际的消息

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

于 2009-10-30T20:35:24.640 回答
0

看看这篇博文,它包含了做你需要做的事情的示例代码(即 CRC)
使用 CRC 的 Python 对称加密

于 2010-03-17T19:25:38.700 回答