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.


