2010-08-09 12 views
6

Ho intenzione di farla breve. È da un po 'che voglio implementare il mio programma di crittografia/decrittografia AES. Il programma di crittografia è andato bene e ha crittografato senza errori o strani output (dal momento che ho confrontato l'output del mio programma con uno commerciale funzionante e il risultato è stato lo stesso).Algoritmo di decrittografia AES

Wikipedia era (è) la mia guida in questa implementazione all'interno della quale ho letto "Un insieme di cicli inversi vengono applicati per trasformare il testo cifrato indietro nel testo in chiaro originale utilizzando la stessa chiave di crittografia."

Ci sono un paio di moduli che ho implementato:

  1. Aggiungere tondo chiave
  2. righe di scorrimento
  3. Sub byte
  4. Mix Colonna

ho paio implementato anche di implementazione inversa dei moduli di cui sopra:

  1. righe retromarcia
  2. Reverse Byte sub
  3. Reverse Mix Colonna

NOTA: non ho implementano tasto rotondo inverso in quanto, E 'XOR ing il testo in chiaro con la chiave di crittografia, e invertire di XOR è XOR stesso (correggetemi se sbaglio)

Così ho putted questo moduli nell'ordine inverso che ho fatto la crittografia, ma mai ho avuto il mio testo in chiaro di nuovo:

expandkey128(key); 
rev_subbytes(data); 
rev_shiftrows(data); 
addroundkey(data,key,10); 

for(int i = 9; i>= 1; i--) { 
    rev_subbytes(data); 
    rev_shiftrows(data); 
    rev_mixColum(data); 
    addroundkey(data,key,i); 
} 

addroundkey(data,key,0); 

// Please note that I also did from 0 to 10 , 
// instead of 10 to 0 and didn't workout 

E anche io ho pensato, forse non dovrei implementare il modello inverso dei moduli, forse devo usare quei moduli con i quali ho fatto crittografia, solo in ordine inverso; beh, indovina cosa? non ha funzionato! :

expandkey128(key); 
addroundkey(data,key,0); 

for(int i = 1; i<= 9; i++) { 
    subbytes(data); 
    shiftrows(data); 
    mixColum(data); 
    addroundkey(data,key,i); 
} 

subbytes(data); 
shiftrows(data); 
addroundkey(data,key,10); 

Quindi, ecco la domanda: cosa c'è che non va? || qual è la sequenza corretta di applicare questi cosiddetti moduli o funzioni se lo farai?

+1

hai calcolato correttamente la tua s-box, perché non puoi usare la stessa che stai usando per la crittografia. http://en.wikipedia.org/wiki/S-box Questo commento non é presente nella versione inglese di wikipedia. dai un'occhiata direttamente alle specifiche: http://csrc.nist.gov/publications/fips/fips197/fips-197.pdf Hai calcolato la s-box inversa per decifrare. – evildead

+0

Sì effettivamente a rev_subbytes Ho S-box inverso di Rijndael –

+1

c'è un grande strumento di là: http://www.cryptool.de/ In questo puoi fare qualsiasi trasformazione a mano.Forse devi eseguire il debug di ogni passaggio, forse lo strumento ti aiuterà a verificare ogni passaggio. – evildead

risposta

7

L'ordine delle operazioni sembra errato. Penso che si desidera questo:

expandkey128(key); 

addroundkey(data,key,10); 
rev_shiftrows(data); 
rev_subbytes(data); 

for(int i = 9; i>= 1; i--) { 
    addroundkey(data,key,i); 
    rev_mixColumn(data); 
    rev_shiftrows(data); 
    rev_subbytes(data); 
} 

addroundkey(data,key,0); 

Per maggiori dettagli, vedere my stick figure explanation of AES con la sua implementazione di riferimento di accompagnamento.

ATTENZIONE: Come accennato in Act 3, Scene 2, there be dragons nello scrivere la propria implementazione AES per l'uso in produzione.

+0

Non utilizzerei nemmeno un'implementazione per AES. Nice Agreement;) – evildead

+0

Beh, non ho intenzione di usarlo ovunque, era solo per divertimento! e ho provato il tuo ordine che non ha funzionato, inoltre ho controllato il link (http://csrc.nist.gov/publications/fips/fips197/fips-197.pdf), dice diverso ordine –

+1

Funziona sulla mia macchina e nella mia implementazione :). Se hai un po 'di tempo, scarica la mia implementazione C# e sfogliala e confronta ogni fase con la tua implementazione. Si noti che l'ordine che ho dato è effettivamente lo stesso della Figura 12. Lo preferisco semplicemente nell'ordine che ho dato per chiarire che sta invertendo tutto. Mi ci sono volute alcune prove per confrontare la mia produzione con l'output round-by-round del libro di Rijndael per assicurarmi di avere le cose a posto. Potresti semplicemente avere un piccolo errore in una delle tue funzioni inverse. Consiglierei di andare lentamente per ogni round come passo successivo. –

Problemi correlati