# Blowfish

In crittologia, blowfish è un algoritmo a chiave simmetrica a blocchi, ideato nel 1993 da Bruce Schneier e implementato in molti software di crittografia. Sebbene non sia reperibile una crittanalisi di Blowfish, questo algoritmo sta suscitando nuovamente interesse se implementato con una maggior dimensione dei blocchi, come nel caso di AES o Twofish.
Schneier progettò blowfish per essere un algoritmo di utilizzo generale, utile a rimpiazzare l'allora decadente Data Encryption Standard (DES) e libero da problemi caratteristici di altri algoritmi. All'epoca molti altri sistemi di cifratura erano proprietari, coperti da brevetto o da segreti governativi. Schneier dichiarò: «Blowfish è libero da brevetti, e rimarrà tale in tutte le nazioni. L'algoritmo è di pubblico dominio, e può essere usato liberamente da chiunque».
Due delle caratteristiche di rilievo di blowfish sono S-Box dipendenti dalla chiave, e una lista di chiavi estremamente complessa.

## L'algoritmo

Blowfish ha una dimensione blocco a 64bit e una lunghezza di chiave variabile fra i 32 e i 448 bit. Ha una struttura a rete di Feistel a 16 cicli, e usa S-Box grandi e dipendenti dalla chiave. Ha una struttura simile al sistema CAST-128, che usa però S-Box fisse.
Il diagramma a sinistra mostra come opera blowfish. Ogni linea rappresenta 32 bit. L'algoritmo gestisce due tipi di liste di sottochiavi: una lista di 18 elementi, definita P-array, e quattro liste da 256 elementi ciascuna di S-Box (S0, S1, S2 e S3), per un totale di 5 array di sottochiavi. Ciascuna S-Box ha in ingresso 8 bit di informazioni, e produce in uscita 32 bit. A ogni ripetizione del ciclo si usa un elemento diverso del P-array, e dopo l'ultimo ciclo a ogni metà del blocco di dati viene moltiplicata in XOR con uno dei due elementi inutilizzati del P-array.
Il diagramma della didascalia rappresenta la funzione F di blowfish. La funzione divide 32 bit in ingresso in quattro 8 bit, utilizzati a loro volta come ingressi delle S-Box. I risultati sono sommati in modulo 2$^{32}$ e messi in XOR, per ottenere il risultato finale di 32 bit cifrati.
Dato che blowfish è una rete di Feistel, può essere invertito semplicemente mettendo in XOR gli elementi 17 e 18 del P-array, e quindi utilizzando gli elementi del P-array in ordine inverso.
La lista delle chiavi di blowfish viene generata caricando i valori iniziali del P-array e delle S-Box con rappresentazioni esadecimali delle cifre di pi greco, che apparentemente non hanno periodicità o schemi ripetitivi. La chiave segreta viene quindi messa in XOR con ciascun elemento del P-array (ripetendo la chiave, quando necessario). Un blocco da 64bit di valore zero viene criptato con l'algoritmo stesso, e il risultato cifrato sostituisce gli elementi P-1 e P-2. Il risultato cifrato viene quindi codificato nuovamente con le nuove sottochiavi, e va a sostituire gli elementi P-3 e P-4. Questo procedimento continua fino a rimpiazzare tutti gli elementi del P-array e delle S-Box. In tutto, l'algoritmo di cifratura di blowfish viene eseguito 521 volte in modo da generare tutte le sottochiavi, ed elaborando circa 4Kb di dati.

## Crittanalisi di blowfish

Non esistono, o perlomeno non sono conosciute, crittanalisi di blowfish, almeno fino al 2004, dato che una dimensione di blocco di 64bit è oggi considerata troppo piccola, e codificando più di 2$^{32}$ blocchi si potrebbero rivelare alcuni frammenti del testo originale, a causa del paradosso del compleanno. Nonostante questo, blowfish fino ad oggi sembra abbastanza sicuro. Mentre la ridotta dimensione del blocco non crea problemi per applicazioni tradizionali come l'e-mail, potrebbe rendere inutilizzabile blowfish per la cifratura di testi di grandi dimensioni, come ad esempio in caso di archivi.
Nel 1996 Serge Vaudenay escogitò un attacco che permetteva di forzare la cifratura di un testo conoscendo 2$^{8r+1}$ testi in chiaro con la stessa chiave, dove r identifica il numero di cicli (rounds). Inoltre trovò una classe di chiavi deboli che possono essere identificate e rotte, con lo stesso attacco, conoscendo solo 2$^{4r+1}$ testi in chiaro. Questo attacco non può essere usato contro il blowfish implementato con tutti i 16 cicli. Vaudenay utilizzò una variante basata su meno cicli di cifratura. Vincent Rijmen, nella sua tesi di dottorato, introdusse un attacco differenziale di secondo grado in grado di forzare non più di 4 cicli. Non rimane quindi nessuna via conosciuta per forzare un testo codificato con 16 cicli, tranne ovviamente la forza bruta.
Nel 2005 Dieter Schmidt studiò la lista delle chiavi di blowfish e notò che le sottochiavi del terzo e quarto ciclo sono indipendenti dai primi 64 bit della chiave utente .

## Blowfish in pratica

Blowfish è uno degli algoritmi di codifica a blocchi più veloci in circolazione, eccetto quando si cambi la chiave. Ogni nuova chiave richiede un tempo di elaborazione equivalente alla codifica di 4 kB di testo, che è molto se confrontato con altri sistemi di cifratura a blocchi. Questo impedisce che venga usato in alcune applicazioni, ma non è un problema in altre. In un caso, è addirittura un vantaggio: il metodo di hashing basato su password utilizzato in OpenBSD usa un algoritmo derivato dal blowfish che sfrutta la lentezza di elaborazione delle chiavi; l'idea è che il maggior tempo di calcolo necessario migliori la protezione nei confronti di un attacco basato su dizionario.
In alcune implementazioni blowfish usa un'area di memoria molto superiore ai 4 kB teorici di RAM. Questo non è un problema nemmeno per i personal computer più vecchi, ma ne impedisce l'uso in piccoli sistemi integrati come le prime smart card.
Blowfish non è soggetto a nessun brevetto ed è quindi liberamente utilizzabile da chiunque. Questo ha contribuito alla sua popolarità nei software di crittografia.