J'essaye d'obtenir le cryptage/décryptage simple fonctionnant avec AesManaged, mais je continue à obtenir une exception en essayant de fermer le flux de déchiffrement. La chaîne ici est cryptée et décryptée correctement, et puis j'obtiens le CryptographicException "Padding était invalide et ne peut pas être enlevé" après Console.WriteLine imprime la chaîne correcte."Le remplissage est invalide et ne peut pas être retiré" using AesManaged
Des idées?
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);
}
}
J'ai eu le même problème, mais en utilisant RijndaelManaged (également symétrique) et n'avais aucune idée de ce qui se passait. Il s'avère que 'MemoryStream.GetBuffer()' obtenait une version * non vidée * des données, et la plupart des derniers blocs de données étaient null, ce qui perturbait mon remplissage. 'MemoryStream.ToArray()' obtient le tableau réel. Merci beaucoup pour cette solution! – Codesleuth
C'est la meilleure/la plus petite implémentation que j'ai vue jusqu'ici. – tmanthey
Bon appel sur 'Dispose'. J'appelais 'ms.ToArray()' avant de disposer de CryptoStream. Déplacer cette ligne en dehors de l'utilisation l'a corrigé pour moi. – cadrell0