Fabio Donatantonio

Il cifrario di Cesare in PHP  

realizzato da , il 19 ott. 2010, categoria PHP

PHP

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.

Leggi gli articoli correlati:

  1. Il cifrario di Vigenère in PHP
  2. Il disco cifrante di Alberti in PHP
  3. Crittografia con Php/Blowfish

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

1 Trackback or Pingback for this entry

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 ↑