我一直在使用AesManaged类来加密某些数据,并且在提供正确的密码时我能正常工作。但是,如果提供了用于解密的错误密码,即使它的长度相同,我也会收到错误"填充无效且无法删除"。
我的问题是:如果我提供了错误的密码,我是否会收到此消息?如果没有,有没有办法判断数据是否被正确解密而不知道原始数据是什么?
答案 0 :(得分:0)
错误的填充错误消息通常意味着解密失败,这是一个非常糟糕的错误消息。填充是错误的,因为解密失败,因此加密的填充是不正确的。但是,正如bartonjs指出的那样,encreyption可能会因为没有填充错误而失败(通过chnace)。
如果您需要检测不正确的解密,则需要添加身份验证,这通常意味着加密数据的HMAC。然后在解密之前,HMAC在加密数据上运行并进行比较。
有关实施示例,请参阅RNCryptor-Spec。
答案 1 :(得分:0)
如果我提供了错误的密码,我是否会收到此消息?
不,256个密钥中的1个将导致具有有效PKCS#7填充的垃圾。 (真的是1/2 ^ 8 + 1 ^ 2 ^ 16 + 1/2 ^ 24 + ... + 1/2 ^ 128)。所以异常总是意味着"关键是错误的" (假设你以某种方式知道其他一切是正确的),但并非所有"关键是错误的"产生例外。
如果没有,是否可以在不知道原始数据的情况下判断数据是否被正确解密?
如果您不考虑选择密文填充oracle的攻击向量,那么您可以使用in-the-message前缀解决此问题。 4字节前缀对齐和1 +字节填充对齐的几率从1 ^ 2 ^ 40开始。
或者你可以(如zaph所指出的)使用从相同密码派生的不同密钥来加密MAC。如果MAC运行完毕,则内容不会被篡改,密码正确。
通过MAC保护邮件是更好的选择,虽然它稍微复杂一些。