In questo articolo vedremo come utilizzare l’algoritmo Blowfish per cifrare un testo in chiaro.
Innazitutto Blowfish è un algoritmo a chiave simmetrica a blocchi, ideato nel 1993 da Bruce Schneier e implementato in molti software di crittografia.
Quest’algoritmo utilizza varie tecniche tra le quali la rete Feistel, le S-box dipendenti da chiavi e funzioni F non invertibili che lo rendono, forse, l’algoritmo più sicuro attualmente disponibile. Le chiavi utilizzate sono di dimensioni variabili fino ad un massimo di 448 bit e i blocchi utilizzati per la cifratura sono 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). Blowfish non è brevettato ed è di dominio pubblico.
Evitando di entrare nel cuore dell’algoritmo (troppo complesso per essere spiegato in questa sede), realizzeremo una classe php che inglobi l’algoritmo fornendoci essenzialmente solo i metodi che ci interessano:
- Impostare la chiave
- Cifrare un testo
- Decifrare un testo
Inoltre realizzeremo uno script di test e un form html per verificare il risultato finale.
Di seguito il codice della classe Crittografia:
03 | require_once ( 'blowfish.php' ); |
10 | function Crittografia( $stringa ){ |
11 | $this ->chiave = $stringa ; |
15 | function cifratura( $stringa ){ |
16 | $this ->blowfish = new Horde_Cipher_blowfish; |
18 | $mod = strlen ( $stringa ) % 8; |
20 | $stringa .= str_repeat ( "\0" , 8 - $mod ); |
22 | foreach ( str_split ( $stringa , 8 ) as $chunk ){ |
23 | $encrypt .= $this ->blowfish->encryptBlock( $chunk , $this ->getChiave()); |
25 | return base64_encode ( $encrypt ); |
29 | function decifratura( $stringa ){ |
30 | $this ->blowfish = new Horde_Cipher_blowfish; |
32 | $data = base64_decode ( $stringa ); |
33 | foreach ( str_split ( $data , 8 ) as $chunk ){ |
34 | $decrypt .= $this ->blowfish->decryptBlock( $chunk , $this ->getChiave()); |
36 | return trim( $decrypt ); |
La classe Crittografia farà uso dei metodi dell’algoritmo Blowfish, quindi il codice inizia con il require della classe.
Il costruttore della classe è molto semplice, infatti acquisisce in input una stringa che sarà la chiave utilizzata per la cifratura/decifratura.
Di seguito i metodi fondamentali, cifratura e decifratura. Entrambi prendono come parametro una stringa e restituiscono una nuova stringa che nel primo caso sarà il testo cifrato e viceversa nel secondo caso sarà il testo in chiaro.
All’interno di entrambi i metodi viene istanziato l’oggetto Horde_Cipher_blowfish e viene suddivisa la stringa di input in gruppi di 8 caratteri per effettuare la cifratura/decifratura un blocco per volta.
Vediamo quindi in che modo richiamare la classe Crittografia:
03 | require_once 'crittografia.php' ; |
06 | $blowfish = new Crittografia( $chiave ); |
09 | $txt_cifrato = $blowfish ->cifratura( $txt ); |
12 | $txt_originale = $blowfish ->decifratura( $txt_cifrato ); |
All’interno della cartella contenente il codice completo sono presenti i seguenti file:
- blowfish.php (l’algoritmo di cifratura)
- crittografia.php (la classe che inbloba l’algoritmo blowfish)
- test.php (lo script che effettua la cifratura/decifratura)
- index.html (un form per il test di coppie chiave-testo in chiaro)
Cliccando qui è possibile vedere in azione il codice.
Cliccando qui è possibile scaricare il codice.