Sto cercando di ottenere una semplice crittografia/decrittografia che funziona con AesManaged, ma continuo a ricevere un'eccezione quando provo a chiudere il flusso di decrittografia. La stringa qui viene crittografata e decrittografata correttamente, quindi viene visualizzato CryptographicException "Padding non valido e non può essere rimosso" dopo che Console.WriteLine stampa la stringa corretta."Padding non valido e non può essere rimosso" utilizzando AesManaged
Qualche idea?
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);
}
}
Ho avuto lo stesso problema, ma utilizzando RijndaelManaged (anche simmetrico) e non avevo idea di cosa stesse succedendo. Si scopre che 'MemoryStream.GetBuffer()' stava ottenendo una * versione non scarica * dei dati, e la maggior parte dei blocchi finali di dati erano nulli, il che stava scherzando con il mio padding. 'MemoryStream.ToArray()' ottiene il vero array. Mille grazie per questa soluzione! – Codesleuth
Questa è l'implementazione migliore/minima che ho visto finora. – tmanthey
Buona chiamata su 'Dispose'. Stavo chiamando 'ms.ToArray()' prima di smaltire CryptoStream. Spostare quella linea al di fuori dell'uso l'ha risolto per me. – cadrell0