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.