Questo laboratorio è stato sviluppato per la prima classe del liceo matematico ed è nato da una conversazione con la professoressa Lucilla Galterio.
Materiale didattico a supporto
- Il fascicolo Crittografia 1 (in formato PDF di circa 12MB) in cui sono affrontati alcuni metodi di cifratura per sostituzione, dall’antichità alla fine del XIX secolo;
- Il fascicolo Crittografia 2 (in formato PDF di circa 5.9MB) in cui si giocherella con macchine di cifratura meccaniche e algoritmi;
- La libreria di funzioni sviluppata con Blockly disponibile online su questo stesso blog;
- Procedure e funzioni in Python e XML (così come generata da Blockly, in formato ZIP).
- Le slide con un esempio di criptoanalisi su un testo cifrato con il metodo della frase chiave.
- Le slide con la narrazione degli sforzi fatti per tradurre il Lineare B (questa parte è meno laboratoriale di quanto sia usuale nel progetto, è più un racconto di come siano state utilizzate tecniche simili a quelle usate nella criptoanalisi per l’approccio alla comprensione di una scrittura sconosciuta).
- Lo schema del laboratorio di crittografia sviluppato per il liceo matematico (il laboratorio è stato pensato per una classe prima del liceo matematico e lo schema che qui proponiamo suggerisce un percorso che partendo dalla crittografia più antica arriva fino alle tecniche di traduzione delle lingue antiche ancora sconosciute).
P.S.: le due presentazioni (le slide con l’esempio di criptoanalisi e quelle con il racconto della traduzione del Lineare B) sono nate per l’utilizzo in classe e non per la pubblicazione in pubblico e quindi siamo stati meno attenti del solito al copyright delle immagini presenti, nel caso, su segnalazione, possiamo provvedere a una immediata cancellazione di materiale protetto dalle leggi vigenti.
Il desiderio di svelare segreti è profondamente radicato nella natura umana; la promessa di partecipare a conoscenze negate ad altri eccita anche la mente meno curiosa. Qualcuno ha la fortuna di trovare un lavoro che consiste nella soluzione di misteri, ma la maggior parte di noi è spinta a soddisfare questo desiderio risolvendo enigmi artificiali ideati per il nostro divertimento. I romanzi polizieschi o i cruciverba sono rivolti alla maggioranza; la soluzione di codici segreti può essere l’occupazione di pochi.
John Chadwick, Lineare B: l’enigma della scrittura micenea.
La crittografia è molto antica. Fin dall’inizio dei tempi infatti si è cercato di celare il significato di messaggi e lettere o di rendere oscuro il significato di comunicazioni o dispacci in modo che solo il destinatario potesse interpretare i simboli e chiarire il significato del testo. D’altra parte, accanto a questo bisogno di segretezza, si sono sviluppate tecniche e metodi per carpire i segreti nascosti in quei messaggi. Tecniche evolute, nel corso dei secoli, grazie al contributo di personaggi tra i più disparati e insospettabili come Leon Battista Alberti o, prima di lui, Gaio Giulio Cesare, autore di un metoso che, per quanto semplice, ancora oggi porta il suo nome.
Questo laboratorio è un percorso attraverso alcune delle principali tecniche di crittografia, da quelle più antiche fino agli attuali algoritmi progettati per la sicurezza delle transazioni finanziarie online.
Prerequisiti
Per affrontare questo laboratorio sono necessarie:
- conoscenze elementari di calcolo combinatorio;
- possono essere di aiuto (ma non sono essenziali) anche elementari conoscenze dei concetti di algoritmo, procedura, coding;
- la capacità di usare, anche in modo elementare, un’applicazione per gestire testi (come Microsoft Word o Google Documenti), pur non essendo indispensabile, può tornare utile.
Obiettivi
- la conoscenza di alcuni metodi di crittografia;
- l’applicazione di elementari tecniche di criptoanalisi;
- la costruzione di un simulatore della macchina Enigma;
- la conoscenza dei meccanismi alla base di Enigma;
- la conoscenza di una versione semplificata dell’algoritmo RSA;
- la capacità di valutare, per via empirica, la sicurezza di un metodo di cifratura.
La libreria
Codice di Cesare
CreaAlfabetoCifratoCesare(chiave)
dove chiave è un intero. Crea un alfabeto cifrato con il metodo di Cesare in cui ogni lettera è spostata di chiave posizioni. Restituisce una lista contenente l’alfabeto cifrato.
Usa CreaAlfabetoInChiaro().
CodiceCesareCifra(testoinchiaro, chiave)
dove testoinchiaro è il testo (una stringa) da cifrare e chiave è un intero da usare come chiave per il metodo di Cesare. Cifra il testo in chiaro usando il metodo di Cesare e lo restituisce come stringa di caratteri.
Usa: CreaAlfabetoCifratoCesare(chiave), CreaAlfabetoInChiaro(), PreparaTestoPerCifratura(t).
CodiceCesareDecifra(testocifrato, chiave)
dove testocifrato è una stringa contenente il testo da decifrare e chiave è un intero da usare come chiave. Restituisce il testo decifrato come stringa di caratteri.
Usa: CreaAlfabetoCifratoCesare(chiave), CreaAlfabetoInChiaro().
Metodo di sostituzione
CreaAlfabetoCifratoSostituzione(chiave)
dove chiave è una stringa di caratteri. Crea un alfabeto cifrato con il metodo di sostituzione in cui ogni lettera è sostituita con quella indicata nella chiave. Restituisce una lista contenente l’alfabeto cifrato.
Usa CreaAlfabetoInChiaro().
CreaAlfabetoCifratoFraseChiave(chiave)
dove chiave è una stringa di caratteri contenente una frase da usare come chiave. Crea un alfabeto cifrato con il metodo della frase chiave. Restituisce una lista contenente l’alfabeto cifrato.
Usa PreparaTestoPerCifratura(t), CreaAlfabetoInChiaro().
SostituzioneCifra(testoinchiaro, chiave)
dove testoinchiaro è il testo (una stringa) da cifrare e chiave è una stringa da usare come chiave per il metodo di sostituzione. Cifra il testo in chiaro usando il metodo di sostituzione e lo restituisce come stringa di caratteri.
Usa: CreaAlfabetoCifratoSostituzione(chiave), CreaAlfabetoInChiaro(), PreparaTestoPerCifratura(t).
SostituzioneDecifra(testocifrato, chiave)
dove testocifrato è una stringa contenente il testo da decifrare e chiave è una stringa da usare come chiave per il metodo di sostituzione. Restituisce il testo decifrato come stringa di caratteri.
Usa: CreaAlfabetoCifratoSostituzione(chiave), CreaAlfabetoInChiaro().
FraseChiaveCifra(testoinchiaro, chiave)
dove testoinchiaro è il testo (una stringa) da cifrare e chiave è una frase (stringa) da usare come chiave per il metodo di sostituzione. Cifra il testo in chiaro usando il metodo della frase chiave e lo restituisce come stringa di caratteri.
Usa: CreaAlfabetoCifratoFraseChiave(chiave), CreaAlfabetoInChiaro(), PreparaTestoPerCifratura(t).
FraseChiaveDecifra(testocifrato, chiave)
dove testocifrato è una stringa contenente il testo da decifrare e chiave è una frase (stringa) da usare come chiave. Restituisce il testo decifrato come stringa di caratteri.
Usa: CreaAlfabetoCifratoFraseChiave(chiave), CreaAlfabetoInChiaro().
Metodo di Vigenère
VigenereCifra(testoinchiaro, chiave)
dove testoinchiaro è una stringa contenente il testo da cifrare e chiave è una frase (stringa) da usare come chiave per il metodo di Vigenère.
Usa: CreaAlfabetoCifratoCesare(chiave), PreparaTestoPerCifratura(t).
VigenereDecifra(testocifrato, chiave)
dove testocifrato è una stringa contenente il testo da decifrare e chiave è una frase (stringa) da usare come chiave. Restituisce il testo decifrato come stringa di caratteri.
Usa: CreaAlfabetoInChiaro().
CreaTabellaDiVigenere()
Crea una tabella per la cifratura con il metodo di Vigenère, la tabella non è utilizzata in realtà per la cifratura.
Enigma
…
Algoritmo RSA
RSACifra(testoinchiaro, p, q, e)
dove testoinchiaro è il testo da cifrare, p e q sono due numeri primi ed e è un intero primo con il prodotto (p-1)(q-1). Trasforma il testo in una lista di interi codificando ogni carattere con la corrispondente posizione nell’alfabeto anglosassone e lo cifra usando l’algoritmo RSA. Restituisce una lista di interi positivi, ogni elemento è la cifratura del corrispondente elemento del testo in chiaro.
Usa: CreaAlfabetoInChiaro(chiave), PreparaTestoPerCifratura(t).
RSADecifra(testocifrato, p, q, e)
dove testocifrato è una lista di interi positivi corrispondente al testo da decifrare, p e q sono due numeri primi ed e è un intero primo con il prodotto (p-1)(q-1). Decifra la lista usando l’algoritmo RSA e restituisce una lista di interi positivi corrispondenti al testo decifrato.
Usa: CreaAlfabetoInChiaro(chiave).
Funzioni di utilità e strumenti
Elimina le lettere accentate da un testo
TrasformaAccentate(c)
dove c è il carattere accentato da trasformare. Restituisce un carattere: la lettera corrispondente non accentata.
Prepara un testo per la cifratura
PreparaTestoPerCifratura(t)
dove t è il testo da trasformare. Elimina ogni carattere che non sia alfanumerico e trasforma le accentate nelle corrispondenti lettere accentate. Restituisce una stringa contenente il testo trasformato.
Usa: TrasformaAccentate(c).
Crea una chiave casuale per il metodo di sostituzione
CreaChiaveCasuale()
Crea una chiave casuale per il metodo di sostituzione (sostanzialmente mescola le lettere dell’alfabeto anglosassone). restituisce una lista con le lettere della chiave.
Usa: CreaAlfabetoInChiaro().
Crea un alfabeto in chiaro
CreaAlfabetoInChiaro()
Crea una lista contenente le 26 lettere dell’alfabeto anglosassone e la restituisce.
Conta le occorrenze
ContaOccorrenzeCarattere(c, t)
dove c è un carattere e t è un testo. Conta le occorrenze di c nel testo t e ne restituisce il numero.
ContaOccorrenzeAlfabeto(a, t)
dove a è un alfabeto (una lista di caratteri) e t un testo (una stringa di caratteri). Conta le occorrenze delle lettere dell’alfabeto nel testo e restituisce una lista contenente il numero di occorrenze di ciascuna lettera.
Usa ContaOccorrenzeCarattere(c, t).