Tesina per il corso di Elementi di Crittografia Due finalisti dell’AES: Serpent e Twofish Valentina Sanna Emanuele Zingale Anno Accademico 2009/2010 Il processo di selezione dell’AES Necessità di un nuovo Standard Debolezze del precedente sistema di cifratura, il DES, sempre più evidenti: insufficiente lunghezza della chiave (solo56 bit); debolezze nella struttura delle S-box (possibile presenza di trapdoor); per violare l‟algoritmo si passò dai 39 giorni impiegati nel 1997 alle sole 22 ore impiegate nel 1999; applicare tre volte il DES (TRIPLE-DES) rappresentava solo una soluzione temporanea poichè questo comportava un‟eccessiva lentezza delll‟algoritmo di cifratura. Nascita dell‟AES Come inevitabile conseguenza, nel 1997 il NIST (National Institute for Security and Technology) bandì un concorso pubblico per la proclamazione di un nuovo cifrario, l‟AES (Advanced Encryption Standard). Il processo di selezione dell’AES Documentazione richiesta Il NIST richiese ai partrecipanti di fornire: una descrizione completa dell‟algoritmo; una stima dell‟efficienza computazionale; un‟analisi dell‟algoritmo rispetto agli attacchi di crittoanalisi più noti; un elenco di vantaggi e svantaggi dell‟algoritmo; un‟implementazione dell‟algoritmo in C e in Java. Specifiche per il nuovo cifrario 1. Cifrario a chiave simmetrica 2. Cifrario a blocchi 3. Lunghezza chiave di 128 o 256 bit 4. Blocchi di testo in chiaro di 64, 128 o 256 bit 5. Implementabile su Smart Card 6. Implementabile in C o in Java 7. Distribuzione dell‟algoritmo a livello mondiale senza esclusive Il processo di selezione dell’AES Il processo di selezione dell‟algoritmo durò fino al 2000 coinvolgendo l‟intera comunità crittografica internazionale e articolandosi in tre fasi: ROUND 1, ROUND2 e ROUND 3. Ogni candidato venne sottoposto ad una serie di test ed analisi finalizzati a valutare la validità dell‟algoritmo proposto. Si individuarono tre categorie principali di analisi: >> sicurezza; >> costo computazionale; >> caratteristiche di implementazione (adattabilità e semplicità). Il 20 Agosto 1998, in California, si tenne la prima conferenza First AES Candidate Conference per la candidatura all‟ AES, durante la quale, il NIST annunciò 15 candidati ufficiali. Il processo di selezione dell’AES 15 candidati dopo il Round 1 MARS RC6 IBM RSA Laboratories RIJDAEL SERPENT TWOFISH Joan Daemen, Vincent Rijmen Ross Anderson, Eli Biham, Lars Knudsen B. Schneier, J. Kelsey, D. Whiting, D. Wagner, C. Hall, N. Ferguson Entrust Technologies,INC. Future System, INC. R.Outerbridge, L.Knudsen CNRS Nippon Telegraf and Telephone Corp. TecApro International S. A. L.Brown, J.Pieprzyk, J.Seberry L.Brown, J.Pieprzyk, J.Seberry Detsche Telekom AG Cylink Corp. CAST-256 CRYPTON DEAL DFC E2 FROG HPC LOKI97 MAGENTA SAFER + Il processo di selezione dell’AES Round 2 Una seconda conferenza si tenne a Roma il 22 Marzo 1999 per discutere i risultati delle analisi condotte dalla comunità crittografica mondiale sugli algoritmi candidati. Utilizzando le analisi ed i commenti ricevuti, il NIST selezionò i 5 finalisti MARS, RC6, Rijndael, Serpent e Twofish. Round 3 La Third AES Candidate Conference si svolse nell‟aprile del 2000: gli autori degli algoritmi finalisti furono invitati ad assistere e partecipare alla discussione sui rispettivi algoritmi. Il NIST studiò tutte le informazioni disponibili e nell‟ottobre del 2000 selezionò Rijndael quale algoritmo vincitore con 86 voti ricevuti. Seguirono nell‟ordine Serpent con 59 voti, Twofish con 31 voti, RC6 con 23 voti e MARS con 13 voti. Il processo di selezione dell’AES Processo di standardizzazione e motivazioni della scelta Dopo quest‟ultima fase, il Segretario del Dipartimento del Commercio Americano approvò, nel Novembre 2001, in via definitiva Rijndael come nuovo standard AES. Il NIST indicò che non furono trovate debolezze crittografiche in nessuno degli algoritmi finalisti. Fu scelto come nuovo standard il Rijndael perchè offriva la migliore combinazione in termini di sicurezza e semplicità di implementazione. TABELLA DI POSSIBILI CONFRONTI Rijndael Serpent Twofish MARS RC6 General Security 2 3 3 3 2 Implementation Difficulty 3 3 2 1 1 Software Performance 3 1 1 2 2 Smart Card Performance 3 3 2 1 1 Hardware Performance 3 3 2 1 2 Design Feature 2 1 3 2 1 Total 16 14 13 10 9 Il cifrario Serpent Introduzione al cifrario Serpent è un cifrario a blocchi a chiave simmetrica progettato da Ross Anderson, Eli Biham e Lars Knudsen E‟ un algoritmo conservativo rispetto al DES in quanto sfrutta delle S-box molto simili, permettendo però un‟implementazione molto più rapida e una sicurezza decisamente maggiore Il cifrario opera su blocchi di 128 bit e supporta una chiave con dimensione variabile di 128, 192,e 256 bit. Chiavi più corte vengono riportate alla lunghezza prestabilita tramite una tecnica di padding. La notevole semplificazione apportata alla struttura del cifrario lo predispone ad una semplice analisi in modo da poter dimostrare facilmente l‟invulnerabilità nei confronti dei vari attacchi. Il cifrario Serpent Il cifrario si basa su una rete a sostituzione e permutazione con 32 round che opera su gruppi di 4 parole di testo in chiaro P di 32 bit ciascuna. In uscita viene generato un blocco di testo cifrato C di 128 bit attraverso 33 sottochiavi Kˆ 0 , Kˆ1 ,..., Kˆ 32 anch‟esse di 128 bit ciascuna. I Passi del cifrario 1. Si applica una permutazione iniziale IP (Initial Permutation) 2. Vengono eseguiti i 32 round; ogni round è composto da una funzione di mescolamento della chiave, dal passaggio attraverso le S-box e da una trasformazione lineare. 3. Si applica una permutazione finale FP (Final Permutation) La permutazione iniziale IP è applicata al testo in chiaro P, generando in uscita B̂0 che rappresenta l‟input del primo round. L‟uscita del primo round (round 0) è B̂1 , quella dell‟ultimo round B̂32 . Il cifrario Serpent Le S-box Ogni funzione associata al singolo round è indicata con Ri con i {0, … , 31} e utilizza soltanto una S-box replicandola. Ad esempio, R0 utilizza la S0 e 32 copie di S0 sono applicate in parallelo (32 x 4 = 128bit). La prima copia di S0 riceve in input i bit di posizione 0, 1, 2, 3 ottenuti tramite la seguente operazione B̂0 K̂0 e restituisce come output i primi quattro bit di un vettore intermedio. Le rimanenti copie di S0 forniscono in uscita i bit rimanenti che permettono di completare tale vettore. Il vettore intermedio è poi trasformato attraverso una trasformazione lineare generando in uscita B̂1 . Vengono utilizzate otto diverse S-box, ognuna delle quali viene utilizzata quattro volte: dopo aver utilizzato S7 per il round 7, nel round 8 viene nuovamente utilizzato S0, poi nel round 9 viene usato S1, e così via reiterando continuamente la procedura. Le 8 S-box Initial Permutation Final Permutation Il cifrario Twofish Il cifrario Serpent Initial Permutation e Final Permutation Formalmente il cifrario può essere descritto dalle seguenti relazioni: Bˆ0 Bˆi C IP( P) 1 Ri ( Bˆi ) FP( Bˆ32 ) dove Ri ( X ) L(Sˆi ( X Ri ( X ) Sˆi ( X Kˆ i )) Kˆ i ) Kˆ 32 i = 0, 1, ..., 30 i = 31 Sˆi : rappresenta l‟applicazione dell‟S-box L : rappresenta la trasformazione lineare Come accadeva nel DES, la permutazione finale è l‟inversa della permutazione iniziale. Il cifrario Serpent La funzione di mescolamento lineare del Serpent Per ogni round, dopo aver applicato le S-box i 32 bit relativi alle parole ottenute in output sono trasformati linearmente, attraverso le operazioni seguenti: X0, X1, X2, X3 = Si (Bi Ki) X0 = X0 <<< 13 X2 = X2 <<< 3 X1 = X1 X0 X2 X3 = X3 X2 ( X0 << 3) X1 = X1 <<< 1 X3 = X3 <<< 7 X0 = X0 X1 X3 X2 = X2 X3 (X1 << 7) X0 = X0 <<< 5 X2 = X2 <<< 22 Bi+1 = X0, X1, X2, X3 Il cifrario Serpent La funzione di mescolamento lineare del Serpent Per ogni round, dopo aver applicato le S-box i 32 bit relativi alle parole ottenute in output sono trasformati linearmente, attraverso le operazioni seguenti: Nell‟ultimo round la trasformazione lineare è sostituita dall‟operazione: B32 = S7 (B31 K31 ) K32 Il cifrario Serpent Sicurezza del cifrario Sedici round di Serpent risultano sicuri quanto il triplo DES, e due volte più veloci del DES. Tuttavia, dal momento che l‟AES doveva essere in grado di sopravvivere per circa 25 anni, doveva essere proggettato in modo da resistere a tutti i possibili attacchi futuri nella crittoanalisi per tutta la durata richiesta. Per questo, sono stati proposti ben 32 round. Gli studi effettuati indicano che il numero di known/chosen plaintext richiesti per un attacco sono più di 2100 Utilizzando inoltre le otto nuove S-box invece delle 32, si riduce decisamente il peso computazionale nell‟implementazione hardware. Il cifrario Twofish Twofish è stato presentato da Bruce Scheiner, John Kelsey, Doug Whiting, DavidWagner, Chris Hall, e Niels Ferguson. Elementi chiave Rete di Feistel Matrici MDS S-box Pseudo-Hadamard Transform Whitening Il cifrario Twofish Elementi chiave S-box: Twofish usa 4 differenti Sbox 8x8 dipendenti dai bit della chiave. Matrici MDS: Twofish usa una singola matrice 4x4 su GF (28 ). Pseudo-Hadamard Transform: Twofish utilizza una PHT di 32-bit Whitening: Twofish esegue lo XOR su 128 bit della sottochiave prima del round Feistel, e su altri 128 bit dopo l'ultimo round Feistel. Un codice MDS su un campo è una mappatura lineare dagli elementi del campo „a‟ a quelli di „b‟, producendo un vettore composto di a+b elementi, con la proprietà che il minimo numero di elementi diversi da zero in ogni vettore non nullo è almeno b+1. In altre parole la distanza fra due distinti vettori prodotti dalla mappatura MDS è almeno b+1. Dati due ingressi, a e b, la PHT a 32-bit è definita come: Prima parola di 32-bit Le due chiavi dipendono dal round r. Rotazione di 8-bit Struttura del cifraro Twofish Il cifrario Twofish Più formalmente: I 16 byte di testo in chiaro p0,...,p15 sono prima divisi in quattro parole P0,...P3 ognuna di 32 bit attraverso la seguente operazione: i = 0 ,…,3 Nel passo di whitening iniziale, queste parole sono combinate mediante XOR con quattro parole della chiave espansa: Il cifrario Twofish Più formalmente: In ognuno dei 16 round, le prime due parole sono usate come input della funzione F, che prende in ingresso anche il numero di round. La terza parola viene combinata tramite XOR alla prima uscita di F e quindi ruotata a destra di 1-bit. La quarta parola è ruotata verso sinistra di un bit e poi inserita in uno XOR insieme alla seconda parola in output a F. Alla fine le due metà vengono scambiate. Il cifrario Twofish Più formalmente: All‟ultimo round le due metà non vengono scambiate di posizioni, ma vengono inserite in uno XOR con quattro parole della chiave espansa, secondo l‟operazione di whitening: Le quattro parole del testo cifrato vengono poi riscritte come 16 byte c0, … , c15 usando la stessa conversione utilizzata per il testo in chiaro: La funzione F: Il cifrario Twofish Più formalmente: la funzione g La funzione g è il nucleo dell‟algoritmo Twofish. Il cifrario Twofish Più formalmente: la funzione g La parola in ingresso X viene suddivisa in quattro byte. I quattro risultati sono interpretati come un vettore di lunghezza quattro su GF(28) e moltiplicati con una matrice MDS 4 4. Il vettore risultante è una parola di 32 bit, che rappresenta l‟uscita della funzione g. 01 EF 5B 5B MDS 5B EF EF 01 EF 5B 01 EF EF 01 EF 5B Il cifrario Twofish Il key schedule Il key schedule è il meccanismo di generazione delle chiavi di round. L‟algoritmo è in grado di prendere in ingresso i bit della chiave e trasformarli in tante sottochiavi quante sono necessarie durante l‟algoritmo, effettuando un‟espansione della chiave. Deve quindi generare le 40 parole K0, … , K39 che rappresentano le chiavi utilizzate all‟interno dei vari round e le quattro S-box dipendenti dalla chiave usate nella funzione g. Twofish è definito per lunghezze di chiave N=128, N=192 e N=256. Chiavi di lunghezza minore di 256 bit possono essere usate inserendo tanti zero fino a raggiungere la lunghezza di 256. La funzione h La funzione h prende due input in ingresso (una parola X a 32 bit e un vettore L = (L0, … , Lk-1) i cui elementi sono parole di 32 bit) e produce come uscita una parola. Questa funzione viene suddivisa in k passi. Ad ogni passo i quattro byte vengono passati singolarmente all‟interno delle S-box e vengono poi sommati tramite XOR con i vari byte del vettore L. Infine i quattro byte sono nuovamente passati attraverso le S-box e poi moltiplicati per la matrice MDS, la stessa utilizzata all‟interno della funzione g. Più formalmente: la funzione h Per prima cosa le parole vengono divise in byte: Poi si applica l‟S-box e viene fatto lo XOR: y k,j = x j j = 0, … ,3 Ad ogni passo, secondo particolari operazione si ottiene yi. Il vettore risultante costituito dagli elementi yi è moltiplicato per la matrice MDS. Il cifrario Twofish La funzione h La figura seguente mostra con maggior dettaglio come la funzione F è organizzata per ogni round nel caso in cui la lunghezza della chiave è 128 bit. Confronto tra i cinque finalisti “A Performance Comparison of the Five AES Finalist” In seguito vengono mostrati i confronti tra i cinque algoritmi arrivati in finale effettuati da un gruppo di crittoanalisti, Bruce Schneier e Doug Whiting, nel 2000. Lunghezza della chiave La velocità di MARS, RC6 e Serpent è indipendente dalla lunghezza della chiave, ovvero il tempo richiesto per generare una chiave e cifrare un testo in chiaro è sempre lo stesso, sia che la chiave è lunga 128, 192 o 256 bit . Twofish cifra e decifra ad una velocità indipendente dalla chiave ma impiega più tempo per generare chiavi più lunghe. RRRijindael infine cifra e decifra più lentamente nel caso di chiavi più lunghe e impiega più tempo per generare chiavi più lunghe. Confronto tra i cinque finalisti Performance nell‟implementazione software Performance nell‟implementazione software L‟efficienza dell‟algoritmo su una CPU a 32 bit è uno dei criteri dettati dal NIST. Dal momento che tutti i finalisti dell‟AES utilizzano parole di dimensione pari a 32 bit, non sorprende che questi cifrari siano molto efficienti se implementati su queste architetture. Vengono mostrate in seguito alcuni grafici in cui vengono confrontati i cinque finalisti sulle differenti CPU. Velocità di cifratura per chiavi di 128 bit in Assembly Velocità di cifratura per chiavi di 192 bit in Assembly Confronto tra i cinque finalisti Performance nell‟implementazione software Velocità di cifratura per chiavi di 256 bit in C Velocità di cifratura per chiavi di 128 bit in C Velocità di cifratura per chiavi di 192 bit in C Confronto tra i cinque finalisti Performance nell‟implementazione software: osservazioni. La performance dei vari algoritmi è circa uguale sia al variare della lunghezza della chiave ma soprattutto al variare delle CPU (Pentium, Pentium II, IA 64, …). Fanno eccezione MARS e RC6 che utilizzano particolari operazioni che li rendono in generale molto lenti e quindi pesanti in quasi tutti i contesti, ad eccezione dell‟implementazione in Pentium Pro, Pentium II e Pentium III. Nel caso di chiavi a 128 bit, Rijndael e Twofish sono gli algoritmi più veloci, MARS e RC6 sono a metà classifica mentre Serpent risulta il più lento. Per lunghezze di chiave maggiori Rijndael diventa progressivamente più lento e per alcune implementazioni diventa anche più lento di MARS. Queste affermazioni risultano vere sia in C che nel linguaggio assembly. Confronto tra i cinque finalisti Performance nella cifratura di piccoli blocchi di testo in chiaro Key setup e tasso di cifratura, per Byte, su un Pentium II in assembly per chiavi di 256 bit. Key setup e tasso di cifratura, per Byte, su un Pentium II in assembly per chiavi di 128 bit. Key setup e tasso di cifratura, per Byte, su un Pentium II in assembly per chiavi di 192 bit. Confronto tra i cinque finalisti Performance valutata su smart card a memoria limitata a 8 bit Byte di RAM occupati dai diversi finalisti. Osservazioni Anche se un algoritmo può essere implementato su una smart card, tuttavia è possibile che il processo di cifratura non avrà abbastanza spazio per essere effettuato per mancanza di capacità della RAM. Quindi nel caso in cui si ha la necessità di avere RAM con non più di 64 byte, l‟implementazione non è ragionevolmente possibile. Per questi motivi, gli algoritmi che sembrano andare bene per un‟implementazione sulle smart card a raggio più esteso guardando la tabella sono: Rijndael, Serpent e Twofish.