next up previous contents
Successivo: Un attacco al DES Su: Possibili attacchi al DES Precedente: Attacchi non specifici per

Crittoanalisi differenziale

Il miglior attacco al DES conosciuto è senza dubbio quello definito dal metodo della Crittoanalisi differenziale, introdotto da E. Biham e A. Shamir [4]. Esso, come vedremo, definisce un attacco di tipo Chosen Plaintext, che si presta con successo alla rottura del DES nell'ipotesi che il numero di iterazioni sia ridotto (il DES a 8 iterazioni puó essere rotto in un paio di minuti su un personal computer).

Tuttavia quando il numero di iterazioni sale a 16 o piú, attacchi di questo tipo hanno complessità uguale a quella che si avrebbe con un algoritmo di ricerca nello spazio delle chiavi.

Questa potrebbe essere una motivazione al fatto che siano state scelte proprio 16 iterazioni nel DES standard e non meno. Si dice infatti che i due ideatori della crittoanalisi differenziale -- di cui uno è proprio lo Shamir noto per l'RSA -- quando pubblicarono questo tipo di attacco si consultarono con uno degli ideatori del DES. Quest'ultimo dichiarò poi che il sistema fu progettato in modo da resistere a questo tipo di attacco.

Nella nostra analisi ci limiteremo quindi ad illustrare un attacco con sole tre iterazioni. In esso supporremo per semplicità che le permutazioni, iniziale IP e finale tex2html_wrap_inline2550 , non vengano considerate in quanto esse non hanno effetto sulla crittoanalisi.

Si considererà inizialmente un attacco di tipo Known Plaintext, cioè si considereranno note delle coppie, testo in chiaro - testo cifrato, con chiave segreta K uguale per tutte.

Una versione piú semplice si ha quando è possibile scegliere quelli che sono i testi da cifrare in modo da velocizzare l'attacco. In mancanza di tale possibilità, bisogna aspettare che vengano scelti un maggior numero di testi affinché vengano scoperte certe proprietà (con un peggioramento di un fattore di circa tex2html_wrap_inline3186 per la velocità dell'attacco).

Ciò su cui si basa la crittoanalisi differenziale è il confronto tra lo xor bit a bit di due testi in chiaro e lo xor bit a bit dei corrispondenti testi cifrati, o meglio delle differenze (da cui deriva anche il nome di questo tipo di attacco), al fine di scoprire la chiave utilizzata.

Nel testo che segue ci riferiremo a stringhe binarie; in particolare quelle marcate con un apice indicheranno lo xor bit a bit di altre due stringhe, ad esempio tex2html_wrap_inline3230 .

Per illustrare la crittoanalisi differenziale ci serviremo delle seguenti definizioni:

defin921

defin932

Tale insieme ha cardinalità tex2html_wrap_inline3252 , cioè uguale alla cardinalità di tex2html_wrap_inline3254 . Infatti, considerando fissata la prima componente tex2html_wrap_inline3256 , l'altra tex2html_wrap_inline3258 (dove tex2html_wrap_inline3260 ) è definita in maniera univoca (dato che entrambi gli operandi sono a loro volta fissati). Quindi poiché le possibili stringhe tex2html_wrap_inline3256 a 6 bit sono tex2html_wrap_inline3252 , risulta che tex2html_wrap_inline3266 . Consideriamo quindi due coppie tex2html_wrap_inline3268 , tex2html_wrap_inline3270 con tex2html_wrap_inline3272 , tex2html_wrap_inline3274 testi in chiaro e tex2html_wrap_inline3276 , tex2html_wrap_inline3278 i corrispondenti testi cifrati, cioè:

displaymath3280

consideriamo per la nostra analisi le stringhe

displaymath3282

e

displaymath3284

Testiamo quindi le differenze (xor) tra le coppie di testi considerando una singola iterazione dell'algoritmo DES (Figura 4).

Riportiamo quindi lo schema della funzione f in Figura 10.

   figure975
Figura 10: Schema della funzione f.

L'attacco differenziale si concentra sulle S-box, che rappresentano l'unico punto non lineare dell'algoritmo.

Supponiamo di considerare una particolare S-box tex2html_wrap_inline3290 , con tex2html_wrap_inline3292 . Dati quindi due possibili input ad essa, definiti da tex2html_wrap_inline3256 e tex2html_wrap_inline3258 (di 6 bit ciascuno), avremo un input xor definito da: tex2html_wrap_inline3298 ; considerando invece gli output all'S-box tex2html_wrap_inline3290 , cioè tex2html_wrap_inline3302 e tex2html_wrap_inline3304 avremo un output xor definito da: tex2html_wrap_inline3306 .

A questo punto per ogni coppia in tex2html_wrap_inline3308 possiamo calcolare l'output xor di tex2html_wrap_inline3290 , tex2html_wrap_inline3306 , determinando cosí una distribuzione del numero di occorrenze per l'output xorgif, cioè possiamo determinare quante coppie in tex2html_wrap_inline3308 hanno output xor uguale a y con tex2html_wrap_inline3320 .

Ad esempio consideriamo la prima S-box tex2html_wrap_inline2512 e supponiamo tex2html_wrap_inline3324 . Avremo che

displaymath3326

Per ogni coppia in tex2html_wrap_inline3328 calcoliamo quindi l'output xor relativamente a tex2html_wrap_inline2512 . Considerando per esempio la coppia (000000,110100), abbiamo:

displaymath3334

e

displaymath3336

allora l'output xor per la coppia (000000,110100) è data da:

displaymath3338

Se tali operazioni vengono eseguite per tutte le 64 coppie in tex2html_wrap_inline3328 si ottiene la seguente distribuzione del numero di occorrenze per l'output xor:

 

0000 0001 0010 0011 0100 0101 0110 0111
0 8 16 6 2 0 0 12
Tabella 11: Distribuzione del numero di occorrenze per l'output xor tex2html_wrap_inline2512 .

1000 1001 1010 1011 1100 1101 1110 1111
6 0 0 0 0 8 0 6

 

Come si puó notare, per alcuni valori di output xor (0000, 0101, etc.) non vi sono coppie corrispondenti in tex2html_wrap_inline3328 . La cosa importante mostrata dalla Tabella 11 è che in realtà non tutte le possibili stringhe di 4 bit sono possibili come valori di output xor. Nell'esempio considerato solo la metà dei valori sono possibili (anche se questo rappresenta un caso estremo), tuttavia in generale solo il 75-80 % dei possibili output xor si possono effettivamente presentare.

Cerchiamo ora di sfruttare la non uniforme distribuzione degli output xor, ed in particolare il fatto che alcuni di tali valori sono possibili ed altri no. L'idea è quella di collezionare abbastanza statistiche in modo da conoscere poi i valori possibili degli output xor relativi ad una particolare stringa tex2html_wrap_inline3346 , e cosí per ogni altra stringa.

Diamo ora alcune definizioni per meglio descrivere queste distribuzioni:

  defin1027

tex2html_wrap_inline3358 rappresenta, relativamente alla S-box j, l'insieme delle stringhe binarie di lunghezza sei tali che l'input xor di tale stringa con un'altra è tex2html_wrap_inline3362 e l'output xor da tex2html_wrap_inline3364 .

Fissati i valori tex2html_wrap_inline3362 e tex2html_wrap_inline3364 , la definizione data sarà utile per cercare le coppie di stringhe tex2html_wrap_inline3370 che godono della proprietà che il loro input xor è tex2html_wrap_inline3362 , ed il loro output xor è tex2html_wrap_inline3364 , senza dover analizzare necessariamente tutte le coppie possibili. Infatti dalla definizione, basterà effettuare la ricerca sul solo valore tex2html_wrap_inline3256 , in quanto fissato un tex2html_wrap_inline3256 tale che tex2html_wrap_inline3380 , la seconda componente della coppia che si vuole trovare è univocamente determinata da tex2html_wrap_inline3260 .

Ad esempio, con i valori:

displaymath3384

e

displaymath3386

si ottengono i valori di tex2html_wrap_inline2524 riportati in Tabella 12 (con tex2html_wrap_inline3390 ).

Ci chiediamo a questo punto quante diverse tabelle di questo tipo si possono avere.
Consideriamo l'insieme definito da IN(z,x), abbiamo già visto che per un fissato valore di z, al variare di x, otteniamo una particolare tabella. Sapendo che il valore z puó essere scelto in tex2html_wrap_inline3252 modi diversi ( tex2html_wrap_inline3402 ), si possono costruire tex2html_wrap_inline3252 tabelle di questo tipo per ogni S-box tex2html_wrap_inline3290 .

Ripetendo quindi il discorso fatto per tutte le 8 S-box si ottengono tex2html_wrap_inline3408 tabelle totali (distribuzioni), che possono essere calcolate agevolmente anche con un PC.

Cerchiamo ora di trovare quelle che sono le possibili stringhe B che possono presentarsi come input alle S-box.

 

output xor possibili input
0000
0001 000011, 001111, 011110, 011111
101010, 101011, 110100, 111011
0010 000100, 000101, 001110, 010001
010010, 010100, 011010, 011011
100000, 100101, 010110, 101110
101111, 110000, 110001, 111010
0011 000001, 000010, 010101, 100001
110101, 110110
0100 010011, 100111
0101
0110
0111 000000, 001000, 001101, 010111
011000, 011101, 100011, 101001
101100, 110100, 111000, 111100
1000 001001, 001100, 011001, 101101
111000, 111101
1001
1010
1011
1100
1101 000110, 010000, 010110, 011100
100010, 100100, 101000, 110010
1110
1111 000111, 001010, 010110, 011100
111110, 111111
Tabella 12: Valori di tex2html_wrap_inline2524 .

 

Ricordiamo che l'input alle S-box, per una qualunque iterazione i, è definito da tex2html_wrap_inline3416 , dove tex2html_wrap_inline3418 E tex2html_wrap_inline3420 rappresenta l'espansione della stringa tex2html_wrap_inline2574 e J=k (vedi Figura 5), quindi l'input xor a tutte le S-box puó essere calcolato come segue:

displaymath3426

Si vede che l'input xor non dipende dai valori della chiave mentre l'output xor sí, come si puó notare dalla sua definizione:

displaymath3428

Scriviamo ora B, E e J come concatenazione di stringhe binarie di lunghezza sei cioè:

displaymath3436

displaymath3438

displaymath3440

cosí come

displaymath3442

displaymath3444

displaymath3446

Supponiamo ad un certo punto dell'algoritmo di conoscere: tex2html_wrap_inline3448 e tex2html_wrap_inline3450 per qualche j (j è l'indice della S-box su cui stiamo lavorando), e supponiamo che sia noto anche il valore dell'output xor per tex2html_wrap_inline3290 , cioè:

  equation1153

Si possono fare ora delle considerazioni circa la chiave. Innanzitutto si puó calcolare:

displaymath3458

da cui

  equation1167

Quindi dalla definizione (1) e dalle relazioni definite dalla (2) e (3), si puó concludere che

displaymath3460

dove in realtà tex2html_wrap_inline3256 è ottenuto come lo xor bit a bit dei valori tex2html_wrap_inline3448 e tex2html_wrap_inline3466 (vedi Figura 5), e quindi abbiamo:

  equation1181

L'idea dell'algoritmo che andremo a definire è quella di sfruttare proprio quest'ultima relazione per arrivare a scoprire i bit della chiave tex2html_wrap_inline3468 . In particolare:

Introduciamo a questo punto la seguente:

defin1197

Questo insieme altro non è che un insieme di possibili chiavi tex2html_wrap_inline3466 (dato che tex2html_wrap_inline3496 ) per le quali, supponendo di partire dai valori tex2html_wrap_inline3498 , si ottiene un output xor che vale tex2html_wrap_inline3364 , cioè:

displaymath3502

Supponendo quindi che: tex2html_wrap_inline3448 e tex2html_wrap_inline3450 siano due input all'S-box tex2html_wrap_inline3290 ; l'output xor per tex2html_wrap_inline3290 è tex2html_wrap_inline3364 ; e conoscendo l'insieme tex2html_wrap_inline3514 da cui prendere i valori tex2html_wrap_inline3256 , utili al calcolo delle chiavi tex2html_wrap_inline3466 ( tex2html_wrap_inline3520 ); allora si ha che:

displaymath3522

cioè

displaymath3524

Quest'insieme definisce i possibili valori che tex2html_wrap_inline3466 puó assumere relativamente alla tripla tex2html_wrap_inline3528 . Al variare della tripla avremo un altro insieme di possibili valori per tex2html_wrap_inline3466 .

Tuttavia poiché la chiave J usata è sempre la stessa, allora il j-esimo blocco tex2html_wrap_inline3466 dovrà appartenere a tutti gli insiemi corrispondenti alle varie triple, e quindi alla loro intersezione.

È da notare che in ognuno degli insiemi sopra definiti solo un blocco è realmente utilizzato, e quindi dall' intersezione degli insiemi si otterrà sempre un solo valore.

Ad esempio siano:

displaymath3538

allora tex2html_wrap_inline3540 e i valori di tex2html_wrap_inline3256 sono quelli che si possono leggere in Tabella 12, cioè tex2html_wrap_inline3544

Quindi risulta che:

eqnarray1286

Con diverse triple possiamo determinare i valori di tex2html_wrap_inline3466 . Poiché i possibili valori di tex2html_wrap_inline3466 sono 64 utilizziamo allora un array di 64 contatori, e ogni volta che calcoliamo i valori nell'insieme tex2html_wrap_inline3550 incrementiamo i contatori corrispondenti a tali valori nell'array definito. Dopo t tentativi (t scelte di triple) il contatore che assume valore t (cioè che appartiene a tutti gli insiemi) ci indicherà il valore di tex2html_wrap_inline3466 .

Se, ad esempio, il secondo contatore dell'array vale t allora il valore 000001 è il vero valore di tex2html_wrap_inline3466 corrispondente all'intersezione dei vari insiemi tex2html_wrap_inline3550 . Poiché tex2html_wrap_inline3466 è solo un blocco della sottochiave, con 8 array riusciamo a calcolare l'intera sottochiave.


next up previous contents
Successivo: Un attacco al DES Su: Possibili attacchi al DES Precedente: Attacchi non specifici per

Aniello Castiglione e Gerardo Maiorano < anicas,germai@zoo.diaedu.unisa.it >