我试图使用AesManaged获得简单的加密/解密,但在尝试关闭解密流时我不断收到异常。这里的字符串被正确加密和解密,然后在Console.WriteLine打印正确的字符串后,我得到CryptographicException“填充无效且无法删除”。“填充无效,无法删除”使用AesManaged
任何想法?
MemoryStream ms = new MemoryStream();
byte[] rawPlaintext = Encoding.Unicode.GetBytes("This is annoying!");
using (Aes aes = new AesManaged())
{
aes.Padding = PaddingMode.PKCS7;
aes.Key = new byte[128/8];
aes.IV = new byte[128/8];
using (CryptoStream cs = new CryptoStream(ms, aes.CreateEncryptor(),
CryptoStreamMode.Write))
{
cs.Write(rawPlaintext, 0, rawPlaintext.Length);
cs.FlushFinalBlock();
}
ms = new MemoryStream(ms.GetBuffer());
using (CryptoStream cs = new CryptoStream(ms, aes.CreateDecryptor(),
CryptoStreamMode.Read))
{
byte[] rawData = new byte[rawPlaintext.Length];
int len = cs.Read(rawData, 0, rawPlaintext.Length);
string s = Encoding.Unicode.GetString(rawData);
Console.WriteLine(s);
}
}
我有同样的问题,但使用RijndaelManaged(也对称),并不知道发生了什么。结果是`MemoryStream.GetBuffer()`得到了一个* unflushed *版本的数据,并且大部分最后的数据块都是空的,这与我的填充有关。 `MemoryStream.ToArray()`获取真正的数组。非常感谢这个解决方案! – Codesleuth 2009-12-17 15:23:36
这是迄今为止我所见过的最好的/最小的实现。 – tmanthey 2013-05-25 09:37:05