如果密码无效,则AES解密失败

时间:2013-02-20 19:51:18

标签: python encryption aes

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

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

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

我怎样才能实现这一目标?我听说过AES加密的其他方法,但似乎PyCrypto只支持ECB,CBC,CFB,OFB,CTR和OpenPGP。如何在没有正确密码的情况下实现加密强AES,解密失败?

3 个答案:

答案 0 :(得分:4)

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

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

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

确保使用正确生成的IV。 IV可以作为密文加前缀,计算认证标记时应该包含,并且不要忘记明文的大小可能不会被隐藏。

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

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

答案 1 :(得分:1)

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

您需要做的是在邮件开头添加一个已知值的块,这样在解密第一个块后,您可以将其与已知值进行比较,并知道您是否有错误的密钥。如果您正在加密的数据具有已知标题,则可以使用此标记。

或者,您可以发送密钥的加密哈希值(例如SHA-256)以及消息,攻击者只有在可以破坏哈希值时才能恢复密钥。

答案 2 :(得分:0)

要提供所需的故障快速属性,您需要在正在加密的数据前面添加标头。我建议使用与已知常量“nonce”连接的随机“混淆”salt(类似于加密magic number);混淆器的存在将像盐一样,提供一种防御措施来防御基于预先计算的表格的攻击。<​​/ p>

如果存在这样的标题,您只需要解密标题并验证幻数字段;如果它与已知常数不匹配,则关键是不好的。如果匹配,则丢弃标题并处理输入的其余部分。