Usando AesCryptoServiceProvider in C #, dovresti usare un IV manipo errato solo nel primo blocco?

4

Questa domanda è stata anche posta su StackOverflow, ma senza risposte, e ho pensato che questo potesse essere uno scambio migliore, dal momento che ho la stessa domanda.

link

Usando AESCryptoServiceProvider, ho notato che prima di implementare qualsiasi logica per passare l'IV dalla parte di crittografia alla parte decrittante, il mio file zip di grandi dimensioni è stato decrittografato correttamente (per quanto ne so). Così ho scritto un piccolo test per capire perché questo ha funzionato, come non me l'aspettavo.

Utilizzo delle funzioni di crittografia ... e decrittografia ... trovate su: link

E il seguente test:

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);
}

Questo è stato il mio risultato:

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

Risulta che probabilmente il primo blocco del mio file zip è stato storpiato, ma è stato decompresso con successo e i file che ho visto non devono far parte del primo blocco.

Eseguendo questo più volte ottengo i seguenti cipherTexts:

cipherText = ZsvLpvVucn0ekx393Fmk5R/UrzzPmzH4dY32EqVlpHJvAKGRERIUY7LLPGHIuyPikHcGKUWL/mt8eP6RI/Qqcw==
cipherText = 0i5tZ1vQvmU5zMimCBIqCWsQzze8PDEOuOxVYekq8T/IGKu4VuHuZWJ6H4aPjRqmSBQYRDbWff6o3Odjl8Qg8A==
cipherText = En/I32AeAASiq10j7ChNPzclWdj8uc6hdBUk/sp8S9G7ly6QBCPAzJFJCR1c9TWjb1gUbzrCEghUgCoRnlJbGA==

Quindi sembra che l'IV stia creando con successo un cipherText diverso per lo stesso testo del previsto. Quindi, quando decifri con una IV errata, è previsto che solo il primo blocco verrà alterato?

Si noti che AesCryptoServiceProvider utilizza la modalità CBC per impostazione predefinita, ma ho visto questo stesso comportamento utilizzando CFB e, quando si utilizza ECB, il testo in chiaro era completamente lo stesso (primo blocco non alterato).

    
posta BrightLight 25.10.2013 - 18:11
fonte

2 risposte

7

Prima voglio chiarire un paio di cose:

  1. Quello che vedi è il comportamento previsto e corretto.

  2. ECB non usa il concatenamento e applica la cifratura a blocchi al testo in chiaro blocco per blocco separatamente, quindi non c'è motivo di discutere IV e ECB perché i due non funzionano realmente tra loro.

Iniziamo con Crittografia CBC . È abbastanza semplice; prendi il primo blocco in chiaro e XOR con l'IV, applica il codice a blocchi su di esso, prendi il testo cifrato risultante e XOR con il secondo testo in chiaro, applica il codice a blocchi, XOR il risultato con il terzo blocco di testo in chiaro e così via.

Oradiamoun'occhiataalladecrittazione.Prendiilprimobloccoditestocifrato,applicailcodicedibloccosudiesso,quindiXORconilIV,(faiattenzionequi)quindipassaalsuccessivobloccoditestocifratoeapplicailcodicedibloccosudiessoepoiXORconilprecedentebloccoditestocifratoecosìvia.

Ora, puoi vederlo? L'IV è usato solo quando si lavora sul primo blocco, ed è per questo che usare l'IV sbagliato per la decifrazione darà solo il primo blocco sbagliato con tutti i blocchi successivi che decifrano semplicemente.

La stessa logica può essere utilizzata per Decrittazione CFB

Persemplicità,puoipensareinquestomodo:laIVdelprimobloccoèlaIVeffettiva,mentrela"IV" per il blocco successivo è il testo cifrato del primo blocco, e la "IV" per il terzo blocco è il testo cifrato del secondo blocco e così via. Indovina un po? Quando provi a decifrare senza IV corretto, hai già il testo cifrato, quindi hai già gli "IV" per tutti i blocchi tranne il primo.

    
risposta data 25.10.2013 - 19:25
fonte
5

Non è una questione di C # - è intrinseco alla modalità CBC . In CBC, su encryption , ogni blocco viene innanzitutto XORed con il blocco crittografato precedente (con IV per il primo blocco), quindi il risultato XOR viene elaborato con il codice a blocchi. Ciò implica che, per decrittazione , si elabora un blocco con il codice a blocchi, quindi lo si XOR con il blocco crittografato precedente. Quindi, il processo di decodifica del blocco n dipende solo dai blocchi crittografati n e n-1 ("block n-1 "essere IV quando" block n "è il primo blocco). Lo schema sulla pagina di Wikipedia chiarisce:

RicordachelamodalitàCBCnonèmaistatapensataperprodurremanglingdituttiifileoqualcosadelgenere.Ilsuoruoloèsemplicementequellodievitarelafugadiinformazionisuqualiblocchidisorgentieranoidenticitraloro.

PerquantoriguardaladecompressionediZipavvenutaconsuccesso,ciòèdovutoalfattochenel formato di file Zip , la "centrale" directory "(che fa riferimento ai file all'interno dell'archivio) si trova alla fine del file, non all'inizio. Maneggiare i primi 16 byte danneggerà l'intestazione di un solo file (quello che si trova all'inizio del file). Gli altri file devono essere indenni.

    
risposta data 25.10.2013 - 19:23
fonte

Leggi altre domande sui tag