Fabio Donatantonio

Crittografia con Php/Blowfish  

realizzato da , il 18 ott. 2010, categoria PHP

PHP

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.

Leggi gli articoli correlati:

  1. Il cifrario di Cesare in PHP
  2. Il cifrario di Vigenère in PHP
  3. Il disco cifrante di Alberti in PHP

Invia questo articolo Invia ad un amico (Send this to a friend)
 Stampa questo articolo (Print now)  Stampa questo articolo (Print now)
:, , , ,
Ti � piaciuto? Ti è piaciuto quest'articolo, guida o riflessione? Scoprine tanti altri nel menu articoli.

Torna sopra ↑

Spazio Pubblicitario

Commenta l'articolo - Ti risponderò in privato

Compila il modulo anti-spam sottostante

 

Fabio Donatantonio - Salerno - Città di Castello (PG) - fabio@donatantonio.net
Torna sopra ↑