Esta pregunta también se hizo en StackOverflow, pero sin respuestas, y pensé que este podría ser un mejor intercambio, ya que tengo la misma pregunta.
Usando AESCryptoServiceProvider, noté que antes de implementar cualquier lógica para pasar la IV desde la parte de cifrado a la parte de descifrado, mi archivo zip grande se descifraba con éxito (por lo que pude ver). Así que escribí una pequeña prueba para ver por qué funcionaba esto, ya que no esperaba que lo hiciera.
Usando las funciones cifrar ... y descifrar ... encontradas en: enlace
Y la siguiente prueba:
static void TestIV()
{
string plainText = "abcdefghijklmnopqrstuvwxyz0123456789asdfqwerfdsareqw";
byte[] key;
string roundTrip = "";
byte[] encrypted = null;
using (AesCryptoServiceProvider aes = new AesCryptoServiceProvider())
{
key = aes.Key;
Console.WriteLine("encryption Key = " + System.Convert.ToBase64String(aes.Key));
Console.WriteLine("encryption IV = " + System.Convert.ToBase64String(aes.IV));
encrypted = EncryptStringToBytes_Aes(plainText, aes.Key, aes.IV);
Console.WriteLine("cipherText = " + System.Convert.ToBase64String(encrypted));
}
using (AesCryptoServiceProvider aes = new AesCryptoServiceProvider())
{
aes.Key = key;
Console.WriteLine("decryption Key = " + System.Convert.ToBase64String(aes.Key));
Console.WriteLine("decryption IV = " + System.Convert.ToBase64String(aes.IV));
roundTrip = DecryptStringFromBytes_Aes(encrypted, aes.Key, aes.IV);
}
Console.WriteLine("Original: " + plainText);
Console.WriteLine("Round Trip: " + roundTrip);
}
Esta fue mi salida:
encryption Key = 0Fnvwk0qzbn6sQ+qUbGDyz0MmpBt5e3vkA+7YCUYTzc=
encryption IV = 7E5iw+226INZNzA6y7wWjQ==
cipherText = YVj3ZsSx9nbOKor6ZGqzyGFxdnaR6KM+qSeQj322+2QyhU9Iu1G3d4xPnj7n0X/wpObvjpFBlHf+9rRFWtPodA==
decryption Key = 0Fnvwk0qzbn6sQ+qUbGDyz0MmpBt5e3vkA+7YCUYTzc=
decryption IV = o//BGrMnXatF5po9dUEnug==
Original: abcdefghijklmnopqrstuvwxyz0123456789asdfqwerfdsareqw
Round Trip: .???;??@u??k?^Gqrstuvwxyz0123456789asdfqwerfdsareqw
Resulta que el primer bloque de mi archivo zip probablemente se dañó, pero se descomprimió con éxito de todos modos, y los archivos que miré no deben haber sido parte del primer bloque.
Ejecutando esto varias veces obtengo los siguientes cipherTexts:
cipherText = ZsvLpvVucn0ekx393Fmk5R/UrzzPmzH4dY32EqVlpHJvAKGRERIUY7LLPGHIuyPikHcGKUWL/mt8eP6RI/Qqcw==
cipherText = 0i5tZ1vQvmU5zMimCBIqCWsQzze8PDEOuOxVYekq8T/IGKu4VuHuZWJ6H4aPjRqmSBQYRDbWff6o3Odjl8Qg8A==
cipherText = En/I32AeAASiq10j7ChNPzclWdj8uc6hdBUk/sp8S9G7ly6QBCPAzJFJCR1c9TWjb1gUbzrCEghUgCoRnlJbGA==
Entonces, parece que el IV está creando con éxito un texto de cifrado diferente para el mismo texto que se esperaba. Entonces, al descifrar con un IV incorrecto, ¿se espera que solo el primer bloque sea destrozado?
Tenga en cuenta que AesCryptoServiceProvider utiliza el modo CBC de forma predeterminada, pero vi este mismo comportamiento utilizando CFB, y cuando utilizaba el BCE, el texto plano era completamente el mismo (el primer bloque no está dañado).