Soy bastante nuevo en C#, así que tenga paciencia conmigo. Sé que esta pregunta se hizo mucho si las veces, pero no pude encontrar una respuesta a mi problema.C#: error de AES: el relleno no es válido y no se puede eliminar. La misma clave y todo, ayuda
Estoy guardando algunos datos y antes de escribirlo en un archivo lo convierto en binario y lo almaceno en una matriz, que cifro y luego escribo en un archivo. Encripto los datos en fragmentos (32 bytes). De la misma manera, leo los datos en fragmentos de 32 bytes y luego los descifro y luego los repito hasta el final del archivo. Pero cuando se trata de descifrado el siguiente error se lanza:
Padding is invalid and cannot be removed.
Puedo usar el mismo iv llave y (hardcoded sólo hasta que lo consigo trabajo)
Aquí está mi código de encriptación, que funciona sin problemas:
//result
byte[] data = new byte[32];
//setup encryption (AES)
SymmetricAlgorithm aes = Aes.Create();
byte[] key = { 145, 12, 32, 245, 98, 132, 98, 214, 6, 77, 131, 44, 221, 3, 9,50};
byte[] iv = { 15, 122, 132, 5, 93, 198, 44, 31, 9, 39, 241, 49, 250, 188, 80, 7 };
ICryptoTransform encryptor = aes.CreateEncryptor(key, iv);
FileStream fStream = new FileStream(file, FileMode.OpenOrCreate, FileAccess.Write, FileShare.Read, 1024, false);
//prepare data to write (byte array 'data') ...
//encrypt
MemoryStream m = new MemoryStream();
using (Stream c = new CryptoStream(m, encryptor, CryptoStreamMode.Write))
c.Write(data, 0, data.Length);
data = m.ToArray();
fStream.Write(data, 0, data.Length);
Y aquí es mi código de descifrado:
FileStream fStream = new FileStream(fileName, FileMode.Open, FileAccess.Read, FileShare.Read, 4096, false);
//setup encryption (AES)
SymmetricAlgorithm aes = Aes.Create();
byte[] key = { 145, 12, 32, 245, 98, 132, 98, 214, 6, 77, 131, 44, 221, 3, 9, 50 };
byte[] iv = { 15, 122, 132, 5, 93, 198, 44, 31, 9, 39, 241, 49, 250, 188, 80, 7 };
ICryptoTransform decryptor = aes.CreateDecryptor(key, iv);
//result
byte[] data = new byte[32];
//loop for reading the whole file ...
int len = fStream.Read(data, 0, 32);
//decrypt
MemoryStream m = new MemoryStream();
using (Stream c = new CryptoStream(m, decryptor, CryptoStreamMode.Write))
c.Write(data, 0, data.Length); //The exception is thrown in this line
data = m.ToArray();
//using the decrypted data and then looping back to reading and decrypting...
intenté todo lo que pude t Hink of (que no es mucho porque soy muy nuevo en la criptografía), busqué en todas partes y no pude encontrar una solución a mi problema. También me ayudé con el libro C# en Nutshell.
Si alguien tiene ideas sobre por qué esto podría suceder, estaré muy agradecido porque no tengo ideas.
Gracias por su tiempo y sus respuestas.
EDIT: Parece que el tamaño de los datos cifrados es de 48 bytes (12 bytes más que el original). ¿Por qué es así? Pensé que solo agrega bytes si no son un múltiplo del tamaño del bloque (16 bytes, mis datos son 32 bytes). Los datos son siempre más grandes y con un aumento constante (necesito saberlo para leer y descifrar correctamente).
Nota: No puedo usar directamente otras transmisiones porque necesito tener control sobre el formato de salida y creo que también es más seguro y más rápido encriptar en la memoria.
Creo que Ben está aquí, se puede comprobar el archivo para ver la salida de los datos encriptados (es decir, es el mayor archivo binario de 32 bytes?). Querrá leer todo el archivo y descifrarlo. – SwDevMan81
otro @Ben: 48 bytes es 16 bytes más que su entrada, no 12. ¿Qué le impide simplemente usar la longitud de la secuencia cifrada? Solo debería tomar un par de bytes adicionales para guardar la longitud en cualquier envoltura/envoltura de estructura/envoltura en la que estén incrustados los datos cifrados. –
@ SwDevMan81 Comprobé la matriz después del cifrado y justo antes de escribir en el archivo y tenía 48 bytes de tamaño, sí, 16 más, no 12 =). No puedo porque a veces los archivos pueden ser muy grandes y necesito solo una porción especial de datos de una ubicación que voy a calcular y, por lo tanto, debo ser capaz de descifrar el archivo en forma de fragmento. @Ben Voigt, si siempre (para el mismo tamaño de porción) crea el mismo "incremento" en el tamaño, entonces puedo adaptarme, pero encuentro un desperdicio de espacio ya que estas cosas se suman rápidamente. – Ben