Próbuję uzyskać proste szyfrowanie/deszyfrowanie działające z AesManaged, ale wciąż otrzymuję wyjątek podczas próby zamknięcia strumienia deszyfrowania. Łańcuch tutaj zostanie poprawnie zaszyfrowany i odszyfrowany, a następnie otrzymam komunikat "Wyszarzanie CryptographicException" i nie można go usunąć po tym, jak Console.WriteLine wypisze poprawny ciąg znaków."Padding jest nieprawidłowy i nie można go usunąć" przy użyciu AesManaged
Wszelkie pomysły?
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);
}
}
Miałem ten sam problem, ale za pomocą RijndaelManaged (również symetryczny) i nie miałem pojęcia, co się dzieje. Okazuje się, że 'MemoryStream.GetBuffer()' otrzymywał * niezamkniętą * wersję danych, a większość końcowych bloków danych miała wartość zerową, co zakłócało moje dopełnianie. 'MemoryStream.ToArray()' pobiera prawdziwą tablicę. Wielkie dzięki za to rozwiązanie! – Codesleuth
To jest najlepsza/najmniejsza implementacja jaką widziałem do tej pory. – tmanthey
Dobre wezwanie do "Dispose". Nazwałem 'ms.ToArray()' przed usunięciem CryptoStream. Przeniesienie tej linii poza obszar użycia spowodowało dla mnie naprawienie. – cadrell0