5

我最近使用 PyCrypto 在一个项目中使用 AES 编写了自己的加密方法。我使用哈希生成一个 32 字节的密码,并使用 CBC 将其提供给 AES-256 位加密。文件输入是使用 PKCS#7 填充以符合可被 16 整除的填充。

我可以毫无意外地加密和解密文件,并且最初与输出文件一起加密的输入文件具有相同的 SHA-256 哈希值。

我发现的唯一问题是,如果我提供了错误的密码,解密仍然会发生。这是我正在做的事情的一个问题,因为如果密码错误,我需要快速解密失败。

我怎样才能做到这一点?我听说过其他 AES 加密方法,但 PyCrypto 似乎只支持 ECB、CBC、CFB、OFB、CTR 和 OpenPGP。如何实现加密的强 AES,如果没有正确的密码,它将无法解密?

4

3 回答 3

5

确保密文在更改后不会解密的最佳方法是添加身份验证标签。身份验证标签用于提供密文的身份验证和完整性。

该标签可以由密文上的 MAC(例如,使用 SHA-256 的 AES-CMAC 或 HMAC)组成。然而,这需要第二个密钥是安全的。

另一种方法是使用经过身份验证的加密,例如 GCM。GCM 使用单个密钥并生成身份验证标签(大小可配置)。

确保使用正确生成的 IV。IV 可以作为密文的前缀,并且在计算身份验证标签时应该包括在内),并且不要忘记您的纯文本的大小可能不会被隐藏。

您应该在解密密文之前验证标签的正确性。

请注意,一般情况下,您不应该对密码进行加密,除非您以后需要访问准确的密码。要验证密码,请改用 PBKDF2。

于 2013-02-20T21:09:39.610 回答
3

AES(或任何其他加密算法)没有任何东西可以让您知道您是否拥有正确的密钥。也就是说,当您真正想要在数学领域之外使用密码学时,这是一个非常有用的功能。

您需要做的是在消息的开头添加一个具有已知值的块,这样在解密第一个块后,您可以将其与已知值进行比较,并知道您是否拥有错误的密钥。如果您要加密的数据有一个已知的标头,您可以改用它。

或者,您可以将密钥的加密哈希(例如 SHA-256)与消息一起发送,攻击者只有在破解哈希的情况下才能恢复密钥。

于 2013-02-20T20:12:47.063 回答
0

要提供所需的快速失败属性,您需要在被加密的数据前添加一个标头。我建议使用与已知常数“幻数”连接的随机“混杂”随机数(类似于加密) ;混杂因素的存在,就像盐一样,提供了一种针对基于预先计算表的攻击的防御措施。

有了这样的标头,您只需解密标头并验证幻数字段;如果它与已知常数不匹配,则密钥无效。如果匹配,则丢弃标头并处理输入的其余部分。

于 2013-02-21T01:25:15.780 回答