Fabio Donatantonio

Resta connesso

Software Developer / Adjunct Professor

Il cifrario di Cesare in 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.

Fabio Donatantonio

Fabio Donatantonio. Analista e sviluppatore full-stack di applicazioni web in linguaggio PHP. Professore a Contratto per le cattedre di Fondamenti di Informatica e Archivistica Digitale presso Università degli Studi eCampus. Dal 2008 curatore del sito www.donatantonio.net, da sempre appassionato di programmazione, mare, sigari e... musica.

Ti potrebbe piacere anche

1 Comment

  1. 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 […]

Leave a reply

Your email address will not be published. Required fields are marked *

 

Didattica

Università degli Studi eCampus
Data Evento
05/07/2019
11:30
Esame Archivistica Digitale e Informatica per le Scienze Umane - Cds Filologia Moderna - Lettere - Novedrate(CO)
05/07/2019
11:30
Esame Introduzione all'Archivistica Digitale e all'Informatica per le Scienze Umane - Cds Letteratura, Arte, Musica e Spettacolo - Lettere - Novedrate(CO)
05/07/2019
11:30
Esame Abilità Informatiche e Telematiche - Cds Design e Discipline della Moda - Lettere - Novedrate(CO)
12/07/2019
11:30
Esame Introduzione all'Archivistica Digitale e all'Informatica per le Scienze Umane - Cds Letteratura, Arte, Musica e Spettacolo - Lettere - Roma
12/07/2019
11:30
Esame Archivistica Digitale e Informatica per le Scienze Umane - Cds Filologia Moderna - Lettere - Roma
12/07/2019
11:30
Esame Abilità Informatiche e Telematiche - Cds Design e Discipline della Moda - Lettere - Roma
Risorse
Guida HTML/CSS per principianti (link)
Introduzione agli ipertesti (link)
Esercizi guidati in Java (link)
Intelligenza artificiale (link)
Libri
Fondamenti di Informatica (2011) (link)
Informatica per le Scienze Umane (2011) (link)
Fondamenti di Informatica (2014) (link)
Pagina Docente
uniecampus.it - Scheda Docente (link)
Contatti
fabio.donatantonio[at]uniecampus.it

JWhisper, sviluppato presso il Dipartimento di Informatica Applicata dell'Università degli Studi di Salerno:

Stay Connected

Twitter

Le mie foto

Foto di Fabio Donatantonio
×