Crittografia con Php/Blowfish
- Ottobre 18, 2010
- by
- Donatantonio
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:
<?php // Richiamo il codice che implementa Blowfish require_once('blowfish.php'); class Crittografia{ var $chiave; var $blowfish; // Costruttore della classe Crittografia - prende in input la chiave in chiaro function Crittografia($stringa){ $this->chiave = $stringa; } // Funzione di codifica di un testo in chiaro function cifratura($stringa){ $this->blowfish = new Horde_Cipher_blowfish; $encrypt = ''; $mod = strlen($stringa) % 8; if ($mod > 0) { $stringa .= str_repeat("\0", 8 - $mod); } foreach (str_split( $stringa, 8 ) as $chunk){ $encrypt .= $this->blowfish->encryptBlock($chunk, $this->getChiave()); } return base64_encode($encrypt); } // Funzione di decodifica di un testo cifrato function decifratura($stringa){ $this->blowfish = new Horde_Cipher_blowfish; $decrypt = ''; $data = base64_decode($stringa); foreach (str_split( $data, 8 ) as $chunk){ $decrypt .= $this->blowfish->decryptBlock($chunk, $this->getChiave()); } return trim($decrypt); } // Funzione per restituzione della chiave function getChiave(){ return $this->chiave; } } ?>
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:
<?php // Richiamo la classe require_once 'crittografia.php'; // Istanzio l'oggetto Crittografia con chiave $chiave $blowfish = new Crittografia($chiave); // Cifro un testo $txt $txt_cifrato = $blowfish->cifratura($txt); // Decifro il testo ottenuto dalla cifratura $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.