Già le civiltà antiche hanno sentito il bisogno di comunicare informazioni in maniera sicura, senza la possibilità di essere carpite da terzi.

Uno dei possibili strumenti per raggiungere questo risultato è la crittografia a chiave simmetrica. Ogni tipo di crittografia a chiave simmetrica è composta da questi elementi:

  • Il messaggio che si vuole scambiare (testo in chiaro) [m]
  • Un chiave, a volte chiamata segreto, condivisa dalle parti che vogliono comunicare, è il motivo per cui si definisce simmetrica [k]
  • Un algoritmo di cifratura [c(m, k)]
  • Il messaggio criptato [m']
  • Un algoritmo di decodifica [d(m', k)]

Fra parentesi quadre ho introdotto una notazione un pó più formale, che però ci permetterà di essere più chiari in seguito. Se non sai cosa voglia dire algoritmo, in realtà è molto semplice: un algoritmo è una sequenza ordinata e finita di passi che dato un input produce un output. L'esempio più semplice di algoritmo con cui tutti siamo venuti in contatto sono le ricette di cucina: una serie ordinata e finita di passi che dato un input (gli ingredienti) produce un output (la pietanza). Nel caso delle ricette l'esecutore è umano, ma dal punto di vista dell'algoritmo non fa alcuna differenza.

Nella notazione che ho appena introdotto i valori fra parentesi tonde sono gli input dell'algoritmo, mentre i valori di output sono:

m' = c(m, k)

m = d(m', k)

La funzione di cifratura [c] crea il messaggio criptato [m'] a partire da quello originale [m] e una chiave [k], mentre quella di decodifica [d] ritorna il messaggio in chiaro [m] a partire da quello criptato [m'] e la chiave [k].

Se sembra tutto molto astratto e teorico è proprio perché lo è, ma in questo modo riusciremo a non entrare in troppi dettagli e potremo applicare queste definizioni ai casi più disparati, come ad esempio l'alfabeto farfallino:

m = hello crypto

k = f

c(m, k) = dopo ogni vocale di m, aggiungi k e la vocale stessa

m' = hefellofo cryfyptofo

d(m', k) = dopo ogni vocale, rimuovi k e la vocale stessa che la segue.

Affidare le proprie comunicazioni segrete all'alfabeto farfallino non sembra essere una buona idea. Perché ? Uno dei motivi è che la chiave che dovrebbe essere segreta (f) appare nel testo cifrato, un altro è che il messaggio cifrato non è abbastanza "mescolato" e tutti il testo in chiaro è presente all'interno di quello criptato.

Possiamo fare di meglio ? Proviamo a definire una nuova serie di algoritmi, chiamati cifrario a sostituzione (nel caso particolare il prossimo è un cifrario di Cesare):

m = hello crypto

k = 3

c(m, k) = sostituisci ogni lettera con quella che viene dopo k lettere in ordine alfabetico (ricomincia da A dopo la Z)

m' = khoor fubswr

d(m', k) = sostituisci ogni lettere con quella che viene k lettere prima in ordine alfabetico (usa la Z prima della A)

Questo è sicuramente un algoritmo migliore e senza conoscere la chiave non è immediato quale sia il messaggio originale.

Ci sono però delle piccole briciole che un crittoanalista può usare per violare un cifrario a sostituzione senza conoscere la chiave:

  • Le parole hanno la stessa lunghezza sia nel messaggio originale che in quello criptato
  • Una lettera del messaggio originale sarà sempre codificata nella stessa lettera del messaggio criptato.
  • Nelle lingue reali alcune lettere sono più frequenti di altre
  • Ci sono solo 26 diverse chiavi sensate (le lettere dell'alfabeto)

Con queste considerazioni si può attaccare un messaggio con cifrario a sostituzione con le regole che abbiamo specificato in maniera abbastanza semplice.

Es:

m' = WAKYZU SKYYGMMOU TUT SO YKSHXG SURZU YOIAXU SG VUZXKO GTINK YHGMROGXSO

andando su https://www.boxentriq.com/code-breaking/frequency-analysis risulta che la lettera più frequente nel testo è la U, seguita a parimerito da Y S G e O.

Considerando che le lettere più frequenti nella lingua italiana sono E, A, I, O, N facciamo qualche prova:

Se U = E allora k = 16:

m = GKUIJE CUIIQWWYE DED CY IUCRHQ CEBJE IYSKHE CQ FEJHUY QDSXU IRQWBYQHCY

Non ci siamo.

Proviamo con U = A k = 20

m = CGQEFA YQEEMSSUA ZAZ YU EQYNDM YAXFA EUOGDA YM BAFDQU MZOTQ ENMSXUMDYU

Ancora niente

U = I k = 12

m = KOYMNI GYMMUAACI HIH GC MYGVLU GIFNI MCWOLI GU JINLYC UHWBY MVUAFCULGC

U = O k = 6

m = QUESTO MESSAGGIO NON MI SEMBRA MOLTO SICURO MA POTREI ANCHE SBAGLIARMI

BINGO

Vediamo se è possibile modificare il nostro algoritmo di cifratura per risolvere i problemi descritti sopra.

Per mitigare la lunghezza fissa delle parole, se il messaggio è abbastanza chiaro, potremmo semplicemente decidere di rimuovere dal testo originale spazi e segni di punteggiatura particolari. In fondo "ATTACCAREALBA" ha la stessa chiarezza di "Attaccare all'alba". In alternativa potremmo decidere di estendere il nostro alfabeto per includere lo spazio e altri segni di puntegiatura. Ad esempio possiamo stabilire che dopo la lettera "Z" ci sia lo spazio " ", dopo ancora la virgola "," e così via per poi tornare alla lettera "A".

m = hello crypto

k = 3

alfabeto: 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 " " , ! ;

m' = khoorafubswr

Gli altri problemi possiamo invece risolverli complicando un pò la nostra chiave.

Pensa adesso alla chiave k come se fosse una coppia di numeri, ovvero:

k = (k1, k2)

k1 sarà il numero di lettere da contare per sostituire la prima lettera del messaggio, mentre k2 sarà un numero che incrementerà k1 dopo ogni lettera.

Provo a fare un esempio per chiarire meglio il concetto.

m = hello crypto

k = (3, 1)

La "h" diventa "k" come nell'esempio precedente, però la "e" non la sostituiremo con quella 3 lettere più avanti, ma con 4:

m' = ki

Adesso la "l" sarà sostituita con la quinta lettera successiva

m' = kiq

La seconda "l" verrà rimpiazzata dalla sesta lettera successiva

m' = kiqr

Alla fine ottengo il messaggio cifrato

m' = kiqrvel, b,

Wov, non solo le due "l" consecutive di "hello" hanno caratteri diversi, ma nel messaggio criptato le due virgole corrispondono a due lettere diverse! Per di più, usando i simboli dell'alfabeto esteso e una coppia di valori, non dovresti provare solo 25 combinazioni, per indovinare il messaggio ma 30 * 30 = 900 combinazioni. Aggiungendo ulteriori regole di cambio della chiave è possibile rendere ancora più difficile forzare il messaggio richiedendo un numero esponenziale di tentativi.

Senza saperlo abbiamo descritto una versione semplificata della macchina Enigma usata dai tedeschi durante la seconda guerra mondiale. La versione in uso dall'esercito è stata violata grazie ad intuizioni sul contenuto del messaggio in chiaro.

L'esempio più famoso è il bollettino meterologico del mattino, che permetteva di provare ad indovinare delle parole (pioggia, sole etc.) e provare da quelle a ricostruire l'intero messaggio.

Ad esempio:

m' = emgwgy!;ve

Se sapessi che la prima parola del messaggio sia "ciao" potrei provare a far "combaciare" i pezzi.

Fra la "c" e la "e" ci sono 2 lettere, fra la "i" e la "m" 4, fra la "a" e la "g" 6 e infine fra la "o" e la "w" 8, possiamo quindi ipotizzare che la chiave sia k = (2,2) ottenendo così

m = ciao mondo

Resta un unico svantaggio intrinseco nella crittografia a chiave simmetrica, che quindi non possiamo risolvere.

Se per mandare messaggi sicuri ho bisogno di una chiave condivisa fra le parti, come posso condividerla in maniera sicura ? Nella maggior parte dei casi si può usare un altro mezzo cosiderato sicuro per il contesto di utilizzo, come ad esempio conversazioni di presenza, messaggi etc., per gli altri casi invece è possibile usare la crittografia a chiave asimmetrica, ma questa è tutta un'altra storia.

Come simpatico esercizio, ti lascio un messaggio a sostituzione con chiave semplice da craccare:

HTRUQNRJSYN MFN IJHNKWFYT NQ RJXXFLLNT HTRJ ZS AJWT HWNYYTFSFQNXYF

Tag crittografia

BLOG.ITEM.PREV_POST