如果密码无效则使AES解密失败
我最近在一个项目中使用PyCrypto写了自己的加密方法,采用的是AES加密。我用一个哈希函数生成了一个32字节的密码,然后把这个密码用在AES-256位加密中,使用的是CBC模式。输入文件在加密前会用PKCS#7填充,以确保文件大小能被16整除。
我可以顺利地加密和解密文件,原始加密的输入文件和输出文件的SHA-256哈希值是一样的。
不过我遇到的唯一问题是,如果我输入了错误的密码,解密仍然会成功。这对我来说是个问题,因为我需要在密码错误时,解密能快速失败。
我该怎么做才能实现这个功能呢?我听说过其他的AES加密方法,但似乎PyCrypto只支持ECB、CBC、CFB、OFB、CTR和OpenPGP。我该如何实现一个在没有正确密码时会失败的强加密AES呢?
3 个回答
确保你的密文在被修改后无法解密的最好方法是添加一个认证标签。认证标签的作用是保证密文的真实性和完整性。
这个标签可以是对密文进行的消息认证码(MAC),比如使用AES-CMAC或SHA-256的HMAC。不过,这样做需要一个额外的密钥来保证安全。
另一种方法是使用认证加密,比如GCM。GCM只需要一个密钥,并且会生成一个认证标签(标签的大小可以设置)。
确保你使用的是正确生成的初始化向量(IV)。IV可以放在密文前面,并且应该在计算认证标签时包含在内。同时,记住你的明文大小可能是无法隐藏的。
你应该在解密密文之前验证标签的正确性。
需要注意的是,通常情况下你不应该加密密码,除非你需要在以后准确访问这个密码。对于密码的验证,建议使用PBKDF2。
AES或者其他加密算法本身并不能告诉你你是否拥有正确的密钥。虽然如此,这在你想要在数学以外的地方使用加密时是个很有用的功能。
你需要做的是在消息的开头添加一个已知值的块,这样在解密第一个块后,你就可以把它和已知值进行比较,从而知道你是否用错了密钥。如果你要加密的数据有一个已知的头部信息,你也可以用这个来替代。
另外,你还可以把密钥的加密哈希值(比如SHA-256)和消息一起发送,攻击者只有在能够破解这个哈希的情况下,才能恢复出密钥。