All’interno di questo articolo analizzeremo alcuni tra i più importanti cifrari che hanno fatto la storia della crittografia. L’utilizzo di questi cifrari è oggi sconsigliato poiché non più in grado di garantire in alcun modo la sicurezza delle informazioni scambiate. Per la corretta comprensione di alcuni degli esempi contenuti in questo articolo sarà necessario disporre di alcune nozioni di matematica discreta, come ad esempio la conoscenza dell’operazione in modulo n .

Cifrario di Cesare

Il Cifrario di Cesare è oggi considerato uno tra i più antichi sistemi crittografici mai usato. Esso deve il suo nome all’imperatore romano che lo utilizzava per scambiare messaggi in codice con i suoi generali. Il cifrario è basato su un semplice algoritmo a sostituzione mono-alfabetico appartenente alla famiglia degli Shift Cipher. Il funzionamento degli algoritmi a sostituzione mono-alfabetica è abbastanza semplice e può essere così riassunto: ogni lettera di un testo viene rimpiazzata da un’altra lettera di posizione successiva e distanziata dalla precedente di un numero k di caratteri. Nel caso del Cifrario di Cesare veniva eseguito uno shift a destra di 3 posizioni.

Ad esempio:
m = ``ciao'' (plaintext)
c = ``fndr'' (ciphertext)

Possiamo sintetizzare il procedimento di cifratura di un messaggio nel modo seguente, definiamo con la sigla E_k la funzione di encrypt (cifratura) e con D_k la funzione di dencrypt (decifratura):

E_k: c = m+k \pmod{26}
D_k: m = c-k \pmod{26}

Il messaggio m viene trasformato nel messaggio c per mezzo di una funzione E_k , il procedimento inverso (la decifratura) viene eseguito per mezzo della funzione D_k .

Schema completo

Vediamo di seguito lo schema di sostituzione completo che possiamo utilizzare per facilitare le nostre operazioni di cifratura e decifratura.

Cifrario di Cesare:

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
D E F G H I J K L M N O P Q R S T U V W X Y z A B C

La lettera “a” di un generico testo viene sostituita dalla lettera “d” che dista dalla precedente di esattamente 3 caratteri. Di seguito viene riportato uno schema generale che può essere utilizzato per eseguire la cifratura dei messaggi usando valori k diversi da 3.

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
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25

Possibili attacchi

Analizziamo i possibili attacchi a cui sono sensibili i cifrari a sostituzione mono-alfabetica (come il Cifrario di Cesare):

  • Ciphertext only, EVA conosce il testo cifrato c e tenta tutti i possibili valori di k fino a trovare tutte le parole e/o frasi di senso compiuto;
  • Known Plaintext, EVA conosce un testo in chiaro m e un testo cifrato c , da queste informazioni è in grado di ricavare la chiave k ;
  • Chosen Plaintext, EVA ottiene l’accesso al sistema crittografico ed esegui la cifratura di un particolare testo m_1 in modo per facilitare la ricerca del valore k ;
  • Chosen Ciphertext, EVA ottiene l’accesso al sistema crittografico ed esegui la decifratura di un particolare testo c_1 in modo per facilitare la ricerca del valore k .

Cifrari affini al Cifrario di Cesare

Il Cifrario di Cesare è stato successivamente affiancato e sostituito da cifrari simili che tuttavia presentano una struttura interna analiticamente più complessa. Tali cifrari vengono denominati “Cifrari affini al Cifrario di Cesare”.

Ricordiamo la struttura analitica che caratterizza un Cifrario di Cesare:
E_k: c=m+k \pmod{26}
D_k: m=c-k \pmod{26}

Di seguito la struttura analitica di un cifrario affine al Cifrario di Cesare:
E_k: c=a \cdot m+b \pmod{26}
D_k: m=(c-b)/a \pmod{26}

Nel secondo caso la chiave del cifrario sarà rappresentata dalla tupla (a, b).

Considerazioni matematiche

Consideriamo come caso di studio la codifica del messaggio “go” nel messaggio “th” ottenuta mediante un cifrario affine a Cifrario di Cesare:

Testo in chiaro Testo cifrato
“go” “th”
6 14 19 7

Risolviamo il sistema ricavando la chiave (a, b):
6a+b = 19
14a+b = 7

Eseguiamo la sottrazione:
14a-6a+b-b = 7-19

Otteniamo:
8a = -12 (dobbiamo trasformare il valore -12 in base 26)
8a = 14

Se ora decidessimo di calcolare il minimo comune divisore tra il valore 8 e il valore 26 troveremmo il valore 2 e non il valore 1, questo è un problema che potrebbe causare problemi di decodifica dei nostri messaggi. In questo caso, infatti, il sistema può essere risolto mediante due valori distinti:
k_1 = (18, 15)
k_2 = (5, 15)

Non possiamo quindi utilizzare questi valori per definire un cifrario a sostituzione, ogni messaggio avrebbe più di una codifica possibile.

Analizziamo ora un secondo esempio, in questo caso procediamo con la codifica della stringa “ha”:

Testo in chiaro Testo cifrato
“ha” “no”
7 0 13 14

Risolviamo il sistema mediante la sottrazione delle espressioni, trasformiamo il risultato in modulo 26 e otteniamo la chiave: (11, 14). Essendo il valore univoco potremmo usare questa chiave per codificare i nostri messaggi.