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

5 投票
3 回答
2404 浏览
提问于 2025-04-17 16:32

我最近在一个项目中使用PyCrypto写了自己的加密方法,采用的是AES加密。我用一个哈希函数生成了一个32字节的密码,然后把这个密码用在AES-256位加密中,使用的是CBC模式。输入文件在加密前会用PKCS#7填充,以确保文件大小能被16整除。

我可以顺利地加密和解密文件,原始加密的输入文件和输出文件的SHA-256哈希值是一样的。

不过我遇到的唯一问题是,如果我输入了错误的密码,解密仍然会成功。这对我来说是个问题,因为我需要在密码错误时,解密能快速失败。

我该怎么做才能实现这个功能呢?我听说过其他的AES加密方法,但似乎PyCrypto只支持ECB、CBC、CFB、OFB、CTR和OpenPGP。我该如何实现一个在没有正确密码时会失败的强加密AES呢?

3 个回答

0

为了实现快速失败的特性,你需要在要加密的数据前面加一个头部。我建议使用一个随机的“干扰器”nonce(类似于加密中的),然后再加上一个已知的常量“魔数”。这个干扰器的存在,就像盐一样,可以帮助抵御一些基于预计算表的攻击。

有了这样的头部后,你只需要解码这个头部并验证魔数字段;如果它和已知的常量不匹配,那这个密钥就不行。如果匹配,就丢掉头部,继续处理剩下的数据。

5

确保你的密文在被修改后无法解密的最好方法是添加一个认证标签。认证标签的作用是保证密文的真实性和完整性。

这个标签可以是对密文进行的消息认证码(MAC),比如使用AES-CMAC或SHA-256的HMAC。不过,这样做需要一个额外的密钥来保证安全。

另一种方法是使用认证加密,比如GCM。GCM只需要一个密钥,并且会生成一个认证标签(标签的大小可以设置)。

确保你使用的是正确生成的初始化向量(IV)。IV可以放在密文前面,并且应该在计算认证标签时包含在内。同时,记住你的明文大小可能是无法隐藏的。

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

需要注意的是,通常情况下你不应该加密密码,除非你需要在以后准确访问这个密码。对于密码的验证,建议使用PBKDF2。

3

AES或者其他加密算法本身并不能告诉你你是否拥有正确的密钥。虽然如此,这在你想要在数学以外的地方使用加密时是个很有用的功能。

你需要做的是在消息的开头添加一个已知值的块,这样在解密第一个块后,你就可以把它和已知值进行比较,从而知道你是否用错了密钥。如果你要加密的数据有一个已知的头部信息,你也可以用这个来替代。

另外,你还可以把密钥的加密哈希值(比如SHA-256)和消息一起发送,攻击者只有在能够破解这个哈希的情况下,才能恢复出密钥。

撰写回答