Il cifrario di Cesare in PHP
- Ottobre 19, 2010
- by
- Donatantonio
In un articolo precedente si è vista la crittografia con algoritmo Blowfish in PHP.
Esistono però molteplici algoritmi di cifratura, alcuni utilizzati durante le guerre mondiali, altri ancora più antichi utilizzati nel lontano medioevo.
Uno degli algoritmi più antichi di cui si abbia traccia storica è il “Cifrario di Cesare”. È un cifrario a sostituzione monoalfabetica in cui ogni lettera del testo in chiaro è sostituita nel testo cifrato dalla lettera che si trova un certo numero di posizioni dopo nell’alfabeto. Questi tipi di cifrari sono detti anche cifrari a sostituzione: la sostituzione avviene lettera per lettera, scorrendo il testo dall’inizio alla fine.
Grazie allo studio di alcuni storici sappiamo che Giulio Cesare utilizzava in genere una chiave di 3 per la cifratura.
In generale quindi la seguente frase in chiaro:
CIAO MAMMA
grazie al Cifrario di Cesare con chiave 3, diventa:
FLDR PDPPD
Realizzeremo quindi una classe PHP che chiameremo Cesare; implementeremo la logica di cifratura e decifratura con un valore della chiave arbitrario acquisito in fase di istanziamento.
In fondo all’articolo è possibile provare e scaricare il codice completo.
Vediamo innanzitutto la classe cesare.php:
<?php class Cesare{ var $alfabeto = array('A','B','C','D','E','F','G','H','I','J','K','L','M','N', 'O','P','Q','R','S','T','U','V','W','X','Y','Z'); var $chiave; // La chiave è un valore numerico da 1 a 25 function Cesare($chiave){ if($chiave>25){ $this->chiave = $chiave % 26; }else{ $this->chiave = $chiave; } } // Metodo per sostituzione lettera in fase di cifratura function sostituisciLettera($lettera){ if(in_array(strtoupper($lettera),$this->alfabeto)){ $posizione = array_search(strtoupper($lettera),$this->alfabeto); return strtolower($this->alfabeto[($posizione+$this->chiave) % 26]); }else{ return $lettera; } } // Metodo per sostituzione lettera in fase di decifratura function ripristinaLettera($lettera){ if(in_array(strtoupper($lettera),$this->alfabeto)){ $posizione = array_search(strtoupper($lettera),$this->alfabeto); if(($posizione - $this->chiave) >= 0){ return strtolower($this->alfabeto[($posizione - $this->chiave)]); }else{ return strtolower($this->alfabeto[(count($this->alfabeto) + ($posizione - $this->chiave))]); } }else{ return $lettera; } } // Metodo per cifratura di un testo in chiaro function cifratura($testo){ $txt_cifrato = ""; for($i=0; $i<strlen($testo); $i++){ $carattere = substr($testo,$i,1); $carattere_cifrato = $this->sostituisciLettera($carattere); $txt_cifrato = $txt_cifrato.$carattere_cifrato; } return $txt_cifrato; } // Metodo per decifratura di un testo cifrato function decifratura($testo){ $txt_chiaro = ""; for($i=0; $i<strlen($testo); $i++){ $carattere = substr($testo,$i,1); $carattere_chiaro = $this->ripristinaLettera($carattere); $txt_chiaro = $txt_chiaro.$carattere_chiaro; } return $txt_chiaro; } } ?>
La classe fa uso di un array denominato alfabeto che contiene appunto le lettere dell’alfabeto. Il costruttore imposta il valore della chiave che sarà un valore compreso tra 0 e 25, tenendo comunque presente che una chiave uguale a 0 produrrà un testo cifrato uguale a quello in chiaro.
I metodi:
– sistituisciLettera
– ripristinaLettera
si occupano di sostituire un carattere con un altro in relazione al valore della chiave. Il primo metodo sarà utilizzato in fase di cifratura, sostituendo quindi una lettera con la successiva di n posizioni. Viceversa il metodo ripristinaLettera sarà utilizzato in fase di decifratura sostituendo la lettera in input con la precedente di n posizioni.
Infine i metodi cifratura e decifratura hanno il compito di scorrere il testo in chiaro o cifrato per convertire una lettera alla volta.
La classe va così invocata:
require_once 'cesare.php'; $cifrario = new Cesare($chiave); $txt_cifrato = $cifrario->cifratura($testo); $txt_chiaro = $cifrario->decifratura($txt_cifrato);
All’interno della cartella contenente il codice completo sono presenti i seguenti file:
- cesare.php (la classe vista sopra)
- 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.
1 Comment
Il cifrario di Vigenère in PHP | Fabio Donatantonio
18th Lug 2011 - 23:22[…] due articoli precedenti abbiamo analizzato, grazie a PHP, due algoritmi di cifratura: Cesare e Blowfish. Il primo al solo scopo didattico-storico, mentre il secondo pienamente utilizzabile […]