BLOWFISH Introduzione Algoritmo Prestazioni Cryptanalysis of

BLOWFISH
Introduzione
l
lIntroduzione
l
lAlgoritmo
l
lPrestazioni
l
lCryptanalysis
l
of Vaundenay
l
Egizio Raffaele
l
E’un cifrario a blocchi a chiave simmetrica
Utilizza varie tecniche tra le quali la rete Feistel, le S-box
dipendenti da chiavi e funzioni F non invertibili
Le chiavi utilizzate sono di dimensioni variabili fino ad un
max. di 448 bit
Lavora su blocchi di 64 bit
Non si conoscono al momento tecniche di attacco valide nei
suoi confronti
E' considerato uno degli algoritmi di cifratura a blocchi più
veloce (risulta più veloce di DES e IDEA)
Non è brevettato ed è di dominio pubblico
Algoritmo
Algoritmo
l
l
l
l
l
La procedura consiste in due fasi: una fase di espansione
della chiave e una fase di cifratura dei dati
L'espansione chiave converte una chiave di al più 448 bit in
un’array di sottochiavi per un totale di 4168 byte
La cifratura dei dati avviene attraverso 16 round
Le sole operazioni usate sono XOR, somme su parole a 32bit e quattro letture per round in array di dati indicizzati
Dalla chiave simmetrica vengono ricavati il P-array con 18
sottochiavi a 32 bit (P1, P2,..., P18) e 4 S-box ognuna
costituita da 256 sottochiavi a 32 bit
P1
P2
…………. P18
S-BOX
CHIAVE (lunghezza compresa tra 64 e 448 bit)
Codifica
l
Blowfish è una rete di Feistel che consiste di 16 round
Funzione F
l
l
Dividere xL in quattro blocchi di 8 bit: a, b, c e d
F(xL)=[(S1(a)+ S2(b)) ⊕ S3(c))] + S4(d)
+ addizione modulo 232
1
Espansione chiave
l
Espansione chiave
l
Passo 1)
– Inizializzare nell’ordine il P-array e, a seguire, le quattro S-
– Inizializzare nell’ordine il P-array e, a seguire, le quattro S-
box con una stringa fissa
l
Passo 1)
box con una stringa fissa
l
Passo 2)
Passo 2)
– Fare lo XOR tra il P-array e la chiave
– Fare lo XOR tra il P-array e la chiave
P1
…………..
P2
……………. Pk
……………………. P18
…….
C1
C2
CHIAVE
P-array
|C i|=32 bit
2<=k<=14
|Pi |=32 bit
Pik+1
…………..
P(i+1)k ……..……
…….
……………. Ck
C1
Espansione chiave
l
Pik+2
C2
……………. Ck
Espansione chiave
l
Passo 1)
– Inizializzare nell’ordine il P-array e, a seguire, le quattro S-
Passo 3)
(00…….00)
P-array
del passo 2)
box con una stringa fissa
P1
l
Passo 2)
P2
P3
P4
………
x L1
BLOWFISH
xR 1
P3
P4
………
BLOWFISH
x L1
xR 1
x L2
xR 2
………
BLOWFISH
– Fare lo XOR tra il P-array e la chiave
S-BOX
Ottenute nel passo 1)
……………………………. Pjk
Pjk+1
Pjk+2
S-BOX
Ottenute nel passo 1)
S-BOX
Ottenute nel passo 1)
……. P18
(xL1,xR1)
….
(xL2,xR2)
(xL3,xR3)
– Si itera la procedura fino a quando non vengono sostituite
tutte le chiavi del P-array ottenendo:
C1
C2
……. Cs
……. Ck
xL1
Espansione chiave
l
l
xL2
xR2
………….. xL17 xR17 xL18 xR18
Decodifica
Passo 4)
–
l
xR1
Si procede come nel passo 3) partendo dalla codifica di
(xL17 ,xR18 ) e utilizzando il P-array ottenuto alla fine del
medesimo passo. Ad ogni iterazione si sostituiscono le
sottochiavi delle S-box invece di quelle del P-array e le Sbox così modificate vengono utilizzate nell’iterazione
successiva
l
La decodifica avviene allo stesso modo della codifica ad
eccezione dell’ordine in cui vengono usate le sottochiavi P1,
P2,..., P18 che è invertito
Ogni iterazione genera due sottochiavi
Sono necessarie 521 iterazioni per generare tutte le
sottochiavi (18/2 iterazioni per generare il P-array e
256/2 iterazioni per ognuna delle quattro S-box)
2
Prestazioni
l
Fase di inizializzazione molto complessa
(costruzione P-array e S-box) ma può essere
precomputata
l Codifica e decodifica dei dati molto veloci
Sicurezza
l
l
l
Cryptanalysis
S-Box conosciute: weak key attack
S-Box conosciute: weak key attack
l
Una "weak key" (chiave debole) è una chiave per cui
almeno una delle 4 S-Box generate, ad esempio S1, ha
almeno una collisione
l
Mediamente esiste una weak key ogni 215 chiavi
Assumeremo che l'attaccante conosce la parte di chiave
privata che descrive la funzione F, cioè partiremo dal
presupposto che l'attaccante conosce tutte le entrate delle SBox ma non le chiavi P1, P2,..., P18
Assumeremo che la chiave sia una weak-key con d = xor
della collisione per S1
Il Blowfish è stato presentato per la prima volta da B.
Schneier sulle pagine del noto dr. Dobb's journal nel 1994
La stessa rivista ha poi sponsorizzato una gara di
crittoanalisi (1000 dollari di premio per il vincitore)
terminata nell'aprile del 1995
I risultati più interessanti sono stati ottenuti da Serge
Vaundenay che, oltre a definire attacchi a versioni
modificate del Blowfish, ha evidenziato la presenza di
chiavi deboli nell'algoritmo
l
Siano P1, P2,..., P18 le sottochiavi generate dalla weak key e
consideriamo la seguente figura
l
Assumendo una sola collisione per S1, con differenza d, la
probabilità che si verifichi questo risultato è 2-7
– Per S1 esistono due byte diversi, a ed a', tali che S1(a)=S1(a')
l
l
– d = a xor a’, a diverso da a’ e S1(a)=S1(a')
S-Box conosciute: weak key attack
S-Box conosciute: weak key attack
l
Iterando il precedente procedimento per tre volte si ottiene
Blowfish su otto round
l
l
l
l
Sempre assumendo una sola collisione per S1, con
differenza d, la probabilità che si verifichi questo risultato è
2-21 ( 2-7 *2-7 *2-7 )
Provando 221 coppie di chosen plaintex con xor [0000d000],
è facile trovare una coppia di ciphertext (C,C’) con xor
[d000xyzt]
Sia C=(L,R). Abbiamo: F(L xor P10) xor F(L xor P10 xor
[d000])=[xyzt]
Provando tutte le 232 possibili combinazioni riusciamo a
calcolare il valore di P10 che verifica la precedente
equazione
3
S-Box conosciute: weak key attack
S-Box conosciute: weak key attack
l
l
l
l
l
Per il Blowfish con t round che usa una weak key, è
possibile calcolare Pt+2 provando 27*t-2/2 coppie di chosen
plaintex
Una coppia casuale di ciphertext ha xor=[d000xyzt] con
probabilità 2-32
Per essere sicuri che il risultato sia valido, è conveniente
verificarlo con più coppie di ciphertext con tale xor
E’ possibile dimostrare che con t < 11 una sola coppia è
sufficiente a garantire, con buona probabilità, che il risultato
sia corretto
Con t >=11 è possibile trovare circa 27*t-2/223− coppie di
ciphertext con xor = [d000xyzt] che ci porterebbero ad un
risultato errato per Pt+2
l
l
l
l
l
S-Box conosciute: random key attack
l
l
l
La chiave privata è una chiave qualsiasi e non
necessariamente una “weak key”
La funzione (a,b) in S1(a)+S2(b) è un’espansione da 16 a 32
bit che può portare ad una collisione S1(a)+S2(b) =
S1(a’)+S2(b’) con probabilità relativamente alta
Sia d = a xor a’, µ = b xor b’
Quando t >= 11 bisogna trovare almeno tre coppie di
ciphertext che diano lo stesso risultato, il che implica che
bisogna tentare mediamente con 3*27*t-2/2 coppie di di
chosen plaintex con xor = [0000d000]
Una volta scoperta la sottochiave Pt+2 è possibile attaccare
la chiave Pt+1 usando lo stesso metodo sul Blowfish con t1 round
Usando questo metodo in modo iterativo possiamo risalire a
tutte le t+2 sottochiavi
Poiché ,se t è pari,la complessità dell’attacco su t round è la
stessa che su t-1 round, la ricerca di tutte le sottochiavi
richiede 3*22+7*t-2/2 coppie di chosen plaintex
Per t=16 ,tale valore è 3*251 . Per t=8 ,poiché 8<11, il
numero di chosen plaintex richiesto per tale attacco è 223
S-Box conosciute: random key attack
l
l
Assumendo una sola collisione per S1+S2, con differenza d
µ, la probabilità che si verifichi questo risultato è 2-15
Iterando il precedente procedimento per tre volte si ottiene
Blowfish su otto round
S-Box conosciute: random key attack
l
l
l
Sempre assumendo una sola collisione per S1+S2, la
probabilità che si verifichi questo risultato è 2-45 ( 2-15 *215 *2-15 )
Il numero di chosen plaintex richiesto per attaccare P10 è
246 (vogliamo due coppie di ciphertext con xor = [d000xyzt]
in modo da poter verificare il risultato ottenuto con la prima
coppia) e 248 coppie per ottenere tutte le sottochiavi
Per Blowfish con più di otto round tale attacco è impossibile
perché richiede di provare un numero eccessivo di chosen
plaintex
S-Box non conosciute
l
Senza assumere che le S-box siano conosciute, è possibile
solo scoprire se la chiave utilizzata è una weak key o meno
– non è possibile risalire al P-array, alle S-box né alla chiave
stessa
l
l
Scegliendo a caso i byte B1, B2, B3, B4, B6, B7, e B8 (non
B5 quindi), nella matrice MB di tutte le 28 possibili
combinazioni di [B1, B2, B3, B4, B5, B6, B7, B8], abbiamo
27 coppie con buono xor (cioè 27 coppie con xor uguale a
[0000d000] dove d è il valore dell’eventuale collisione per
S1)
Sia MC la matrice dei corrispondenti ciphertext [C1, C2,
C3, C4, C5, C6, C7, C8]
4
S-Box non conosciute
l
l
E’possibile dimostrare che in ogni coppia buna il valore
þ=[(B5 xor C5), C6, C7, C8] è lo stesso per entrambi i
messaggi della coppia dove, per coppia buona, si intende la
coppia (Bi,Bj) tale che Bi xor Bj = [0000d000] e i rispettivi
ciphertext hanno xor uguale =[d000xyzt]
Per trovare una buona coppia, ci basta verificare se nella
matrice ci sono delle coppie per cui è presente una
collisione per il valore þ. Se non ci sono buone coppie, cioè
se non ci sono collisioni per nessuna delle quattro S-Box, la
probabilità di avere una collisione per þ è molto bassa (circa
2-17 )
S-Box non conosciute
l
l
Con 214 matrici esiste un’alta probabilità di trovare una
buona coppia, sempre che ci sia almeno una collisione per
almeno una delle S-box. Quindi con 222 chosen plaintex
(214 matrici con 28 chosen plaintex ciascuna ) siamo in
grado, con buona probabilità, di scoprire se ci sono
collisioni per le S-box , cioè di scoprire se la chiave
utilizzata è una weak key
Lo stesso attacco, però, non è attuabile sul Blowfish
completo in quanto richiederebbe un numero enorme di
chosen plaintex
5