我使用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