Estoy intentando que el cifrado/descifrado simple funcione con AesManaged, pero sigo obteniendo una excepción cuando intento cerrar la secuencia de descifrado. La cadena aquí se cifra y descifra correctamente, y luego aparece CryptographicException "El relleno no era válido y no se puede eliminar" después de Console.WriteLine imprime la cadena correcta."El relleno no es válido y no se puede eliminar" con AesManaged
¿Alguna 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);
}
}
Tuve el mismo problema, pero usando RijndaelManaged (también simétrico) y no tenía idea de lo que estaba sucediendo. Resulta que 'MemoryStream.GetBuffer()' obtenía una * versión * no eliminada * de los datos, y la mayoría de los bloques finales de datos eran nulos, lo que estaba jugando con mi relleno. 'MemoryStream.ToArray()' obtiene la matriz real. Muchas gracias por esta solución! – Codesleuth
Esta es la implementación mejor/más pequeña que he visto hasta ahora. – tmanthey
Buena llamada en 'Dispose'. Estaba llamando 'ms.ToArray()' antes de eliminar CryptoStream. Moviendo esa línea fuera del uso lo arregló para mí. – cadrell0