CIFRARIO DI CESARE AVANZATO (PHP)

Uno strabigliante algoritmo relativamente semplice scritto in PHP per criptare e decriptare testo.

DOWNLOAD

Cifrario di Cesare: Una Breve Storia

Il cifrario di Cesare è uno dei più antichi e semplici metodi di cifratura conosciuti. Utilizzato da Giulio Cesare per proteggere i suoi messaggi segreti, questo metodo di cifratura prevede lo spostamento di ogni lettera del messaggio originale di un numero fisso di posizioni nell’alfabeto. Ad esempio, con uno spostamento di 3 posizioni, ‘A’ diventa ‘D’, ‘B’ diventa ‘E’, e così via. Se si supera la fine dell’alfabeto, si ricomincia dall’inizio (‘X’ diventa ‘A’, ‘Y’ diventa ‘B’, ‘Z’ diventa ‘C’).

Esempio:

  • Testo originale: “CIAO”
  • Chiave di spostamento: 3
  • Testo cifrato: “FLDR”

Evoluzione con il Nuovo Codice di Cifratura

Il codice di cifratura che vi presento, è una versione più complessa e robusta rispetto al semplice cifrario di Cesare. Questa evoluzione sfrutta una chiave variabile e diversi pattern di caratteri predefiniti, offrendo un livello di sicurezza molto più elevato.

A differenza della versione originale, il nuovo cifrario si basa su una serie di pattern definiti dall’utente. L’algoritmo che seleziona quale pattern della serie utilizzare è casuale. La lunghezza della chiave di criptazione e decriptazione che determina i salti di carattere nei pattern è stabilita dall’utente.

Un ottimo compromesso per offuscare stringhe di testo che contengono dati personali e sensibili, o per generare codici, e password alfanumerici e variabili da pubblicare sul web.

Vediamo come funziona

1. Caratteri di Controllo

La funzione get_ctl_char_pattern() restituisce una stringa di caratteri di controllo che vengono utilizzati per selezionare un pattern di cifratura restituito dalla funzione get_array_pattern()

function get_ctl_char_pattern() {
    $ctl_char_pattern = '1234567890abcdefghimno';
    return $ctl_char_pattern;
}

2. Array di Pattern

La funzione get_array_pattern($index) restituisce uno specifico pattern di cifratura basato su un indice fornito. Questi pattern sono utilizzati per sostituire i caratteri del messaggio originale durante la cifratura.

function get_array_pattern($index = 0) {
    $array_pattern = array(
        'iLAKoRDFHju75G69sx40S3zvQOwMNptdqg1lekChrXyYTJ2E8mancWZfUIBPbV',
        // ...altri pattern...
    );
    return $array_pattern[$index];
}

3. Funzione di Cifratura

La funzione encrypt_tk($stringa, $chiave) cifra il messaggio originale utilizzando un pattern selezionato casualmente e la chiave fornita. La $chiave deve essere un valore numerico di lunghezza variabile senza separatori. Ad esempio: ‘12345’, ‘847284737237’, ‘3411493’ e così via.

NB: Ogni numero della chiave rappresenta il numero di caratteri da saltare nel pattern fisso selezionato. Vale sia in fase di criptazione che decriptazione.

function encrypt_tk($stringa, $chiave) {
    // $stringa => Stringa da criptare
    // $chiave => Chiave numerica
    $ctl_char_pattern = get_ctl_char_pattern();
    $pattern_index = mt_rand(0, strlen($ctl_char_pattern)-1);
    $ctl_char = $ctl_char_pattern[$pattern_index];	
    $array_pattern = get_array_pattern($pattern_index); 
    $lunghezzaArray = strlen($array_pattern);
    $lunghezzaChiave = strlen($chiave);
    $stringaCriptata = '';
	
    for ($i = 0; $i < strlen($stringa); $i++) {
        $posizione = (strpos($array_pattern, $stringa[$i]) + intval($chiave[$i % $lunghezzaChiave])) % $lunghezzaArray;
        $stringaCriptata .= $array_pattern[$posizione];
    }
	
    return $ctl_char . $stringaCriptata;
}

4. Funzione di Decifratura

La funzione decrypt_tk($stringaCriptata, $chiave) decifra il messaggio cifrato utilizzando il carattere di controllo iniziale per selezionare il pattern corretto e la chiave fornita.

function decrypt_tk($stringaCriptata, $chiave) {
  
    $ctl_char_pattern = get_ctl_char_pattern(); 
    $ctl_char = $stringaCriptata[0];	
    $ctl_char_pos = strpos($ctl_char_pattern, $ctl_char);
    $array_pattern = get_array_pattern($ctl_char_pos);
    $lunghezzaArray = strlen($array_pattern);
    $lunghezzaChiave = strlen($chiave);
    $stringaDecriptata = '';
    $stringaCriptata = substr($stringaCriptata, 1); 
	
    for ($i = 0; $i < strlen($stringaCriptata); $i++) {
        $posizione = (strpos($array_pattern, $stringaCriptata[$i]) - intval($chiave[$i % $lunghezzaChiave]) + $lunghezzaArray) % $lunghezzaArray;
        $stringaDecriptata .= $array_pattern[$posizione];
    }

    return $stringaDecriptata;
}

Utilizzo e Modifica dei Pattern e delle Chiavi

  • Modifica dei Pattern: Puoi modificare i pattern di cifratura nel codice, assicurandoti che non ci siano caratteri ripetuti. Ad esempio, se vuoi usare un nuovo pattern, aggiungilo alla lista $array_pattern della funzione get_array_pattern() assicurandoti che contenga solo caratteri unici (con maiuscole e minuscole insieme ma senza ulteriori ripetizioni). Devono essere presenti tutte le lettere dell’alfabeto e i numeri da 0 a 9. Ogni pattern deve essere diverso con lettere e numeri posizionati in modo differente nella stringa.
  • Aggiunta di Nuovi Pattern: Puoi aggiungere nuovi pattern all’array get_array_pattern() per aumentare la sicurezza. Ogni nuovo pattern dovrebbe seguire le stesse regole di unicità.
  • Modifica delle Chiavi: La chiave può essere qualsiasi sequenza numerica. Più lunga è la chiave, più sicuro sarà il processo di cifratura ma allo stesso tempo aumenteranno i tempi di esecuzione del codice.
  • Come anticipato in precedenza, la $chiave deve essere un valore numerico di lunghezza variabile senza separatori. Ad esempio: ‘12345’, ‘847284737237’, ‘3411493’ e così via.

Codice di esempio e test concreto della funzionalità

Per testare il codice diamo per scontato che l’ambiente con il webserver sia stato impostato localmente sul PC in precedenza per l’interpretazione di codice PHP. Oppure, il test sarà eseguito direttamente su uno spazio hosting online opportunamente configurato per funzionare con PHP.

Crea un file “test.php” e copia questo codice al suo interno.

<?php

/*
 * Questo programma implementa un algoritmo di criptazione e decriptazione basato sul cifrario di Cesare.
 * È distribuito con licenza GNU General Public License v3.0 o successiva.
 *
 * @author Marco Malvicini
 * @copyright Copyright (c) Marco Malvicini
 * @license https://www.gnu.org/licenses/gpl-3.0.html GNU General Public License v3.0
 *
 * ISTRUZIONI PER L'UTILIZZO:
 *		L'algoritmo è un'evoluzione del cifrario di Cesare e serve a criptare e decriptare stringhe alfanumeriche senza caratteri speciali e senza spazi
 *		Indicato per creare codici alfanumerici criptati da esporre sul web
 *
 * 		get_ctl_char_pattern()
 * 		+ Restituisce il pattern predefinito che contiene i caratteri di controllo.
 * 			- Il numero di caratteri deve essere uguale al numero di elementi(pattern fissi predefiniti) definiti in get_array_pattern()
 * 			- Non sono consentiti caratteri uguali. E' possibile utilizzare due lettere uguali ma una deve essere maiuscola e l'altra minuscola
 *			- Esempio: Se il numero di pattern in get_array_pattern() è 22 la stringa in get_ctl_char_pattern() dovrà avere 22 caratteri alfanumerici diversi.
 *			- '1234567890abcdefghimno' oppure 'qwertyuiop3k5n6m7vVQ0M' oppure 'mMnNbB7651023fFghHjJkz' ecc.
 *
 *		get_array_pattern()
 *		+ Restituisce un array di pattern predefiniti(stringhe fisse) che comprende tutti i caratteri dell'alfabeto (maiuscoli e minuscoli) e tutti i numeri
 *		SENZA RIPETIZIONI!!
 *			- Il numero di caratteri della chiave di controllo in get_ctl_char_pattern() DEVE essere uguale al numero di pattern presenti in get_array_pattern()
 *			- Esempio: 
 *			$array_pattern = array(
 *				'iLAKoRDFHju75G69sx40S3zvQOwMNptdqg1lekChrXyYTJ2E8mancWZfUIBPbV',  // 1
 *					'roE8v43VdLQJwIH0B7F2Rn9Gp5UgaN6CexZflkMt1XPizubmOTyDhYWKscjqSA'); // 2
 *				return $array_pattern[$index];
 *			}
 *			In questo caso abbiamo 2 pattern, pertanto la chiave con i caratteri di controllo in get_ctl_char_pattern() avrà 2 caratteri, es. 'we' oppure '2N' e così via
 *
 *		encrypt_tk($stringa, $chiave) e decrypt_tk($stringaCriptata, $chiave)
 *		+ Le funzioni criptatura e decriptatura passando la $stringa e la $chiave
 *			- ATTENZIONE: La $chiave è una stringa numerica esempio: '123' oppure '9127348' ecc.
 *			- la $chiave può avere lunghezze diverse e deve contenere caratteri numerici senza separatori.
 *			- la sicurezza e la velocità dell'algoritmo di criptazione varia in funzione della lunghezza della $chiave e al numero di pattern fissi presenti in get_array_pattern()
 *
 *
 */

function get_ctl_char_pattern(){
	// centralizziamo e definiamo il pattern che servirà per ricavare il carattere di controllo che determina
	// la posizione del pattarn principale in array_pattern[]
	// NB: $ctl_char_pattern deve essere un codice alfanumerico di caratteri non ripetuti (anche uguali ma minuscoli e maiuscoli).
	// Il numero di elemanti deve essere uguale al numero di pattern presenti in get_array_pattern()
	// ES: $ctl_char_pattern = '1234567890abcdefghimno'(22 elementi), array_pattern dovrà avere 22 pattern
	$ctl_char_pattern = '1234567890abcdefghimno';
	return $ctl_char_pattern;
}

function get_array_pattern($index = 0) {
	// centralizziamo e definiamo i pattern casuali fissi composti da caratteri alfanumerici non ripetuti (con maiuscole e minuscole)
	// per consentire la codifica/decodifica, ogni pattern deve contenere tutte le lettere dell'alfabeto (maiuscole e minuscole) e tutti i numeri da 0 a 9
	// NB: Il numero di elementi di $array_pattern deve essere uguale al numero di elementi di $ctl_char_pattern
	
    $array_pattern = array(
        'iLAKoRDFHju75G69sx40S3zvQOwMNptdqg1lekChrXyYTJ2E8mancWZfUIBPbV',
        'roE8v43VdLQJwIH0B7F2Rn9Gp5UgaN6CexZflkMt1XPizubmOTyDhYWKscjqSA',
        'jSzVpdJBF8eLhTZr0gHbPInKsx2tYwkW1A7vf9oa4uXQUDNyE6GcRli5Om3qCM',
        'tFafQ2hc8CGNIU9XBM0AsuiJzKPdxnpRY5gbjVZky36OreWSD1TELHq4mwov7l',
        '68VmzLlXtNsYpFwjD2aOSWIH0crPf5MeZ4KbGu1xoQnkJTvEdB7RhCg9yiA3qU',
        'xY7AvzZG5j4Hub29KgcPWdtOLSq6IX38sBy1QVmwEiCeRaoNUTMlr0pnJkhfDF',
        'ib15IphWKqRauxmsjflVo4zJ0c8ZSwgCLtyHYU67DAMTPQEFGvnNder9OBX23k',
        'voag6eQ45kswChbWmBZSxGOV08uNI29jlFMAdKyPEXn7D1HLf3zRpqiJcYtTrU',
        'xTCoIGry5wPWpBg9qhzE4t6e1vNiYR37JcXSKnZmDAabkOU0Hls2dfFL8MujVQ',
        'xF3jYfI6HdJiSaNTBrvDpu0U14eX7ZcCytgn8kRq9wLPG5AK2hWEzbsomMQlOV',
        '0Sn6fJet41hgN3aPkZbFDTc2sr9ulUwM8OyCWEdpzj5GVLAmHQq7YRviKXIBxo',
        '4TujZpq2MeO6nxVg9BrLkdwy3zUI0YSsbJN1cR78lAWGHQXCoPaFKEmvhfitD5',
        'JRCLKI0QFa59GAXYwzM6cNP4iuTDdUsymfHZnOb7qh2vWSkorE1tBg3p8Vjelx',
        'hiw1RKr024bcVSuZGTmBAafMjYsU938qzXvCo5ekNldWDEHtxOgQIpFP67ynJL',
        'fksWCza9Rjmhg3pc7rGIvSiloEQ0FZ6dPTq8KJBt1yxuw5ONA4HbDXeVMYUnL2',
        'fJIZ7ALkwFmqSPhp96xQ4zrtEay1KnbXvdWRciu2GCD5O8gsT0U3olHYeBMVjN',
        'sfA5dRCbByhYKLuP410N9reDJqE7tzv3gF8ZcoTnjpX2QIkxiSOa6wmMGWUVlH',
        'CtZnQmSdEDf8JgypbAkYG04UVhTFRjwcqs51IBuMHeXairLlox3v97NW6z2POK',
        'N6310QtcxDh7TerWOB8PpjCS9KsZlLMoEXGvmi4kJzHUqbdgRYFAwafuVyIn25',
        'ZC0Pvb6uQK2D1RYOFIfNMaWGBieVS8rJLmo5Tntlzs7H4U9jkwEpxcX3gyqhdA',
        'KFH04pETuyzhU3Agk5DvrWx8jmCJ6ciQYfw2tqRlVBGdeZIaP17LsObSo9NnMX',
        'yNUJDf4rmbCTuAqtFBX6oPYpEOzeS7csvwHMgQ0ij25hLkaZ93Il1RndWKVxG8'
    );
    return $array_pattern[$index];
}

function encrypt_tk($stringa, $chiave) {
	// $stringa => Stringa da criptare
	// $chiave => Chiave numerica
    $ctl_char_pattern = get_ctl_char_pattern();
    $pattern_index = mt_rand(0, strlen($ctl_char_pattern)-1);	//ricavo l'indice del pattern principale scegliendone uno a caso tra quelli predefiniti
    $ctl_char = $ctl_char_pattern[$pattern_index];	// ricavo il carattere di controllo che servirà per la decodifica
    $array_pattern = get_array_pattern($pattern_index); // ricavo la stringa di codifica/decodifica (il pattern principale selezionato a caso)
    $lunghezzaArray = strlen($array_pattern);
    $lunghezzaChiave = strlen($chiave);
    $stringaCriptata = '';
	
	// Scorro la stringa da criptare, il pattern e mi sposto di n caratteri (ogni ciclo) in base alla chiave numerica passata
    for ($i = 0; $i < strlen($stringa); $i++) {
        $posizione = (strpos($array_pattern, $stringa[$i]) + intval($chiave[$i % $lunghezzaChiave])) % $lunghezzaArray;
        $stringaCriptata .= $array_pattern[$posizione];
    }
	// Restituisco la stringa criptata e aggiungo all'inizio il carattere di controllo.
    return $ctl_char . $stringaCriptata;
}

function decrypt_tk($stringaCriptata, $chiave) {
    // ricavo il pattern con i caratteri di controllo che serviranno ad identificare 
	// l'indice del pattern fisso da utilizzare per la decriptazione
	$ctl_char_pattern = get_ctl_char_pattern(); 
	// il primo carattere della stringa da decriptare, 
	// corrisponde all'indice da utilizzare per determinare il pattern fisso da usare
    $ctl_char = $stringaCriptata[0];	
    $ctl_char_pos = strpos($ctl_char_pattern, $ctl_char);	// la posizione del carattere di controllo nel pattern di controllo, rappresenta l'indice del pattern fisso da usare
    $array_pattern = get_array_pattern($ctl_char_pos); // ricavo il pattern fisso per la decriptazione passando l'indice del carattere di controllo
    $lunghezzaArray = strlen($array_pattern);
    $lunghezzaChiave = strlen($chiave);
    $stringaDecriptata = '';
    $stringaCriptata = substr($stringaCriptata, 1); // stringa da decriptare (pulita) senza il carattere di controllo.
	
	// come per la criptazione, scorro la tringa criptata e cerco il carattere corrispondente l'array fisso e la chiave per decriptare la stringa
    for ($i = 0; $i < strlen($stringaCriptata); $i++) {
        $posizione = (strpos($array_pattern, $stringaCriptata[$i]) - intval($chiave[$i % $lunghezzaChiave]) + $lunghezzaArray) % $lunghezzaArray;
        $stringaDecriptata .= $array_pattern[$posizione];
    }

    return $stringaDecriptata;
}

// Test delle funzioni
$plaintext = "CiaovirgolaComplimentiFunzionaPuntoEsclamativo";
$key = "12371";

$text1 = encrypt_tk($plaintext, $key);
echo "Cifrato: $text1\n";

$decrypted = decrypt_tk($text1, $key);
echo "Decifrato: $decrypted\n";

?>

Ora, con il tuo browser, richiama la pagina http://localhost/test.php oppure http://nomesito.estensione/test.php

Il testo criptato varierà ogni volta che esegui il refresh del browser, l’algoritmo di criptazione, cripterà casualmente il testo in chiaro selezionando pattern con chiavi casuali ogni volta.

Risultati del test

Cifrato: 7L1mZnbOtZVutJ4hV1f3Ny1nVNJ1JBuQmeD4FfScusxYWn4
Decifrato: CiaovirgolaComplimentiFunzionaPuntoEsclamativo

Cifrato: iSkV4m4OF4Lf9GUjLkkp2ckaN2HkG0fpyNeEXlhvfiuDqmE
Decifrato: CiaovirgolaComplimentiFunzionaPuntoEsclamativo

Cifrato: fD2KVduE0VHy5Y69H2PJbE2S8br2YcyhGvbla02jyq1yOdl
Decifrato: CiaovirgolaComplimentiFunzionaPuntoEsclamativo

In alternativa, è possibile provare il codice direttamente online presso alcuni siti internet che offrono il servizio per testare PHP. Uno di questi è https://www.programiz.com/php/online-compiler/

DOWNLOAD DEL FILE PHP

Cifrario di Cesare avanzato (PHP)
Cifrario di Cesare avanzato (PHP)

Avviso Importante

Grazie per aver scelto di scaricare i nostri software gratuiti! Prima di procedere con il download, ti preghiamo di leggere attentamente quanto segue:

  1. Uso Gratuito: Il software che stai per scaricare è fornito gratuitamente e senza alcun costo.
  2. Nessuna Garanzia: Il software è fornito “così com’è”, senza garanzia di alcun tipo, espressa o implicita.
  3. Limitazione di Responsabilità: Il programmatore e il sito non sono responsabili per eventuali danni diretti, indiretti, incidentali o consequenziali che possano derivare dall’uso o dall’incapacità di usare il software. L’utente utilizza il software a proprio rischio.
  4. Nessun Supporto: Non è previsto alcun tipo di supporto tecnico o assistenza per l’uso del software.
  5. Consigli: Si raccomanda di fare sempre un backup dei propri dati e di verificare il software con un antivirus prima di installarlo.

Procedendo con il download, accetti implicitamente questi termini e condizioni.

Grazie per la comprensione e buon utilizzo!