Usando AesCryptoServiceProvider en C #, ¿debería usar un IV mangle incorrecto solo el primer bloque?

4

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.

enlace

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).

    
pregunta BrightLight 25.10.2013 - 18:11
fuente

2 respuestas

7

Primero quiero aclarar un par de cosas:

  1. Lo que estás viendo es el comportamiento deseado y correcto.

  2. El BCE no usa el encadenamiento y aplica el cifrado de bloque al bloque de texto sin formato por separado, por lo que no tiene sentido discutir IV y BCE porque los dos realmente no funcionan entre sí.

Comencemos con cifrado CBC . Es bastante simple; tome el primer bloque de texto simple y XOR con el IV, aplique el cifrado del bloque en él, tome el texto cifrado resultante y XOR con el segundo texto simple, aplique el cifrado del bloque, XOR el resultado con el tercer bloque de texto simple, y así sucesivamente.

Ahoraveamoseldescifrado.Tomeelprimerbloquedetextocifrado,apliqueelcifradodelbloqueenél,yluegoXORconelIV,(presteatenciónaquí)luegomuevaalsiguientebloquedetextocifradoyapliqueelcifradodelbloqueenélyluegoXORconelanteriorbloquedetextocifrado,yasísucesivamente.

Ahora, ¿puedes verlo? El IV solo se usa cuando se trabaja en el primer bloque, y es por eso que usar el IV incorrecto para el descifrado solo dará el primer bloque incorrecto y todos los bloques siguientes se descifran bien.

La misma lógica se puede utilizar para desencriptación CFB

Enarasdelasimplicidad,puedepensarlodeestamanera:ElIVdelprimerbloqueeselIVreal,mientrasqueel"IV" del siguiente bloque es el texto cifrado del primer bloque, y el "IV" para el tercer bloque es el texto cifrado del segundo bloque y así sucesivamente. ¿Adivina qué? Cuando intenta descifrar sin el IV correcto, ya tiene el texto cifrado, por lo que ya tiene los "IV" para todos los bloques excepto el primero.

    
respondido por el Adi 25.10.2013 - 19:25
fuente
5

No es una cuestión de C #: es intrínseco a modo CBC . En CBC, en cifrado , cada bloque se procesa primero con XOR con el bloque cifrado anterior (con el IV para el primer bloque), y luego el resultado XOR se procesa con el cifrado de bloque. Esto implica que, para descifrado , usted procesa un bloque con el cifrado del bloque, luego XOR con el bloque cifrado anterior. Por lo tanto, el proceso de descifrado del bloque n solo depende de los bloques cifrados n y n-1 ("bloque n-1 "siendo el IV cuando" block n "es el primer bloque). El esquema de la página de Wikipedia lo aclara:

RecuerdequeelmodoCBCnuncatuvolaintencióndeproducirladestruccióndetodoslosarchivosninadadeeso.Sufunciónessimplementeevitarquesefiltreinformaciónsobrequébloquesdeorigeneranidénticosentresí.

EncuantoaladescompresiónZipexitosa,estosedebeaqueenel Formato de archivo Zip , la "central el directorio "(que hace referencia a los archivos dentro del archivo) se encuentra al final del archivo, no al principio. Manejar los primeros 16 bytes dañará el encabezado de un solo archivo (el que está al principio del archivo). Los otros archivos deben estar ilesos.

    
respondido por el Tom Leek 25.10.2013 - 19:23
fuente

Lea otras preguntas en las etiquetas