AesManaged에서 간단한 암호화/암호 해독 작업을 수행하려고하는데 암호 해독 스트림을 닫으려고 할 때 예외가 계속 발생합니다. 여기서 문자열은 올바르게 암호화되고 해독 된 다음 Console.WriteLine이 올바른 문자열을 출력 한 후 "Padding was invalid and can not be removed"라는 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 * 버전의 데이터를 얻었고, 마지막 데이터 블록의 대부분이 널 (null) 이었기 때문에 내 패딩이 엉망이었습니다. 'MemoryStream.ToArray()'는 실제 배열을 얻습니다. 이 솔루션에 대한 많은 감사를드립니다! – Codesleuth
이것은 지금까지 보아온 가장 우수하거나 작은 구현입니다. – tmanthey
'Dispose'에 호의를 표합니다. CryptoStream을 삭제하기 전에'ms.ToArray() '를 호출했습니다. 그 라인을 사용하여 바깥쪽으로 옮기는 것은 나를 위해 그것을 고쳤다. – cadrell0