我使用AesCryptoServiceProvider
和CryptoStream
来加密某些数据,并且当我使用相同的密钥进行解密时,似乎工作正常。但是,如果我试图用错误的密钥解密它,我不会得到一个例外,只是垃圾数据。我找不到.NET文档在任何它说什么是应该发生的,但是根据这样的:AesCryptoServiceProvider尝试使用错误的密钥进行解密时的行为
http://books.google.co.uk/books?id=_Y0rWd-Q2xkC&pg=PA631
这:
Why does a bad password cause "Padding is invalid and cannot be removed"?
我应该得到一个CryptographicException 。我做错了吗?我的功能是这样的:
public static byte[] Encrypt(byte[] data, string password, string salt, bool decrypt)
{
SymmetricAlgorithm aes = new AesCryptoServiceProvider();
Rfc2898DeriveBytes rfc2898 = new Rfc2898DeriveBytes(password, Encoding.UTF8.GetBytes(salt));
aes.IV = rfc2898.GetBytes(aes.BlockSize/8);
aes.Key = rfc2898.GetBytes(256/8);
ICryptoTransform enc;
if (decrypt) {
enc = aes.CreateDecryptor();
} else {
enc = aes.CreateEncryptor();
}
using (enc) {
using (MemoryStream ms = new MemoryStream()) {
using (CryptoStream cs = new CryptoStream(ms, enc, CryptoStreamMode.Write)) {
cs.Write(data, 0, data.Length);
return ms.ToArray();
}
}
}
我不是想在这种情况下防止被修改的文档,我只是想给当用户输入错误的密码而不是崩溃时,用户大部分时间都会收到明显的错误消息。因此,似乎PKCS7填充应该是足够的,但我已经检查,它已经使用PKCS7作为默认,所以我仍然不知道为什么我的程序不会给出例外 – Andy
PKCS填充将无法检测到垃圾约1/256分之一的时间。不要依靠违约,明确表示。您似乎也正在生成一个用于解密的新密码(字节)。在aes.Key中打印出确切字节的检查 - 您需要检查* byte-for-byte *中的解密密码与加密密码相同,而不是character-for-character。 – rossum