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