CRITTOGRAFIA

Transcript

CRITTOGRAFIA
CRITTOGRAFIA
Sommario
1.
2.
3.
LA STORIA .................................................................................................................................................................... 3
1.1.
Il RE DI MILETO .................................................................................................................................................... 3
1.2.
EGIZIANI E BABILONESI ........................................................................................................................................ 3
1.3.
SERSE.................................................................................................................................................................... 3
1.4.
SPARTA................................................................................................................................................................. 3
1.5.
KAMASUTRA ........................................................................................................................................................ 3
1.6.
CESARE ................................................................................................................................................................. 3
1.7.
CIFRARIO AFFINE.................................................................................................................................................. 3
1.8.
ANALISI DELLE FREQUENZE.................................................................................................................................. 5
1.9.
ALGORITMI POLIALFABETICI ................................................................................................................................ 6
1.8.1.
DISCHI DI ALBERTI ........................................................................................................................................ 7
1.8.2.
QUADRATO DI DE VIGENERE ....................................................................................................................... 7
1.10.
BABBAGE .......................................................................................................................................................... 8
1.11.
CIFRARIO ADFGVX ............................................................................................................................................ 9
1.12.
ENIGMA.......................................................................................................................................................... 10
1.13.
NAVAJO .......................................................................................................................................................... 11
1.14.
CIFRARIO DI HILL ............................................................................................................................................ 11
1.15.
CIFRARIO PLAYFAIR ........................................................................................................................................ 12
OGGI........................................................................................................................................................................... 14
2.1.
DES ..................................................................................................................................................................... 16
2.2.
3-DES .................................................................................................................................................................. 16
2.3.
IDEA.................................................................................................................................................................... 16
2.4.
AES ..................................................................................................................................................................... 16
2.5.
L’ALGORITMO DI DIFFIE-HELLMAN.................................................................................................................... 16
2.6.
RSA ..................................................................................................................................................................... 18
2.7.
PGP..................................................................................................................................................................... 19
2.8.
AUTENTICAZIONE DI MESSAGGI ........................................................................................................................ 20
2.9.
FUNZIONI HASH ................................................................................................................................................. 20
2.10.
MD5 ............................................................................................................................................................... 21
2.11.
SHA ................................................................................................................................................................. 21
2.12.
FIRMA DIGITALE ............................................................................................................................................. 21
2.13.
CERTIFICATO DIGITALE................................................................................................................................... 24
2.14.
PEC ................................................................................................................................................................. 24
2.15.
TLS .................................................................................................................................................................. 27
MATEMATICA UTILE................................................................................................................................................... 28
3.1.
NUMERI PRIMI ................................................................................................................................................... 28
1
3.2.
NUMERI PRIMI DI MERSENNE ........................................................................................................................... 28
3.3.
NUMERI PRIMI DI FERMAT ................................................................................................................................ 28
3.4.
ARITMETICA MODULARE ................................................................................................................................... 28
3.5.
PICCOLO TEOREMA DI FERMAT ......................................................................................................................... 28
3.6.
IDENTITA’ DI BEZOUT ......................................................................................................................................... 28
3.7.
FUNZIONE φ DI EULERO..................................................................................................................................... 29
APPENDICE 1: ALGORITMO IDEA ....................................................................................................................................... 30
APPENDICE 2: ALGORITMO MD5 ....................................................................................................................................... 36
APPENDICE 3: ALGORITMO MD5 IN JAVA ......................................................................................................................... 38
APPENDICE 4: File checksum with SHA-256 ...................................................................................................................... 40
2
1. LA STORIA
Le regole di cifratura devono essere note sia al mittente che al destinatario, in modo che quest’ultimo possa
effettuare la decrittazione del messaggio ricevuto. Quando la chiave di cifratura coincide con quella di decifratura si ha
una cifratura a chiave simmetrica. Ovviamente bisogna che preventivamente ci si sia scambiata la chiave comune.
Quando la chiave di cifratura è diversa da quella usata per la decifratura si ha una cifratura a chiave asimmetrica. Le
due chiavi sono la chiave pubblica – quella usata per la cifratura e la chiave privata – quella usata per decifrare, che è
segreta e nota solo al destinatario del messaggio. Il mittente non deve preventivamente comunicare col destinatario
per scambiarsi le chiavi. Utilizza la chiave pubblica del destinatario per crittare il messaggio da trasmettere. Solo chi è
in possesso della chiave privata lo può decrittare. In questo modo la sicurezza del crittosistema dipende solo dalla
segretezza della chiave, non dalla segretezza dell’algoritmo usato.
1.1. Il RE DI MILETO
Il re di Mileto fece rasare la testa a un messaggero e poi ricrescere i capelli.
1.2. EGIZIANI E BABILONESI
Un primo esempio di occultamento di messaggi si trova in geroglifici di 4.500 anni fa. In una tavoletta babilonese sono
stati modificati alcuni simboli per rendere incomprensibile il messaggio.
1.3. SERSE
Serse raschiò la cera da una tavoletta; scrisse sul legno; rimise la cera.
1.4. SPARTA
Spartani usavano lo scitale, bastone su cui arrotolare strisce di carta (metodo a trasposizione).
1.5. KAMASUTRA
Nel kamasutra, “arte della scrittura segreta”: dividere l’alfabeto a metà e accoppiare le lettere a due a due in modo
casuale. Sostituire una lettera all’altra (cifrario a sostituzione).
1.6. CESARE
Codice di Cesare (sostituzione) (Hal9000). Per un alfabeto di n lettere, solo n possibilità. Aritmetica modulare
(Euclide).



C(x) = (x+k) mod n dove x è la posizione della lettera da cifrare; c(x) la posizione cifrata; n lunghezza dell’alfabeto;
k la chiave.
C-1(x) = (x-k) mod n
Esempio: la lettera D corrisponde a x=3 C-1(x)=(3-3) mod 26 che corrisponde alla A
1.7. CIFRARIO AFFINE
Cifrario affine è una generalizzazione del cifrario di Cesare.
C(a,b)(x) = (ax+b) mod n
Essendo a e b due numeri interi minori del numero n di lettere dell’alfabeto. Il massimo comune divisore fra a e n deve
essere 1, altrimenti si ammetterebbe la possibilità di cifrare in modo differente uno stesso carattere. La chiave del
cifrario viene determinata dalla coppia (a,b). I cifrari affini generati con la forma spiegata offrono maggiore sicurezza
di un codice Cesare convenzionale. Perché? Come si è già visto, la chiave di un cifrario affine sono le coppie di numeri
3
(a, b). Nel caso di un messaggio scritto nell’alfabeto di 26 lettere, e criptato grazie ad un cifrario affine, a e b possono
adottare qualsiasi valore compreso fra 0 e 25. Il numero di chiavi possibili è perciò 26x26=656, n volte maggiore di
quello del codice Cesare. Comunque facile da decrittare con la forza bruta.
Esempio: Alfabeto di 6 lettere: A (0); B (1); C (2); D (3); E (4); F (5)
Criptiamo il testo con un cifrario affine C(x) = (2x + 1) mod 6.
La A viene cifrata secondo C(0) =2x0+1 = 1 mod 6, che corrisponde a B;
La B viene cifrata secondo C(1) = 2x1+1 = 3 mod 6, che corrisponde a D;
La C viene cifrata secondo C(2) =2x2+1 = 5 mod 6, che corrisponde a F;
La D viene cifrata secondo C(3) = 2x3+1 = 7 =1 mod 6, che corrisponde a B;
La E viene cifrata secondo C(4) = 2x4+7 = 9 = 3 mod 6, che corrisponde a D;
La F viene cifrata secondo C(5) = 2x5+1 = 11 = 5 mod 6, che corrisponde a F.
In questo modo il cifrario affine proposto cripta allo stesso modo i messaggi «ABC» e «DEF». È quindi impossibile
sapere qual è il messaggio originale. Cos’è successo? Se si tratta con un cifrario con espressione C(a,b)(x) = (ax+b) mod
n, si potrà decifrare il messaggio in modo univoco se e solo se MCD(a,n) =1. Nell’esempio proposto, MCD(2,6) = 2 e
quindi si elimina 1° restrizione.
L’operazione matematica di decifrazione equivale a trovare l’incognita x dato un valore numerico y in modulo n.
C(a,b)(x) = (ax+b) = y mod n
(ax+b) = y mod n
ax = (y – b) mod n
Stiamo quindi cercando un valore a-1 (inverso di a) che verifichi a-1°=1, in modo che
a-1ax = a-1(y - b) mod n
x = a-1(y - b) mod n
Di conseguenza, per riuscire a decifrare, bisogna calcolare gli inversi di un numero a in modulo n e, per non fare sforzi
inutili, sapere in anticipo se realmente esistono tali inversi. Un cifrario affine avrà l’inverso se e solo se MCD(a,n) = 1.
Nel caso dei cifrario affine dell’esempio, C(x) = (2x+1) mod 6, si vuole sapere se il numero a, nel nostro caso 2, ha
inverso. Cioè, se c’è qualche intero n minore di 6 tale che 2n=1 mod 6. Per questo controlliamo tutti i valori dei
modulo (0,1,2,3,4,5):
2x0 = 0, 2x1 = 2, 2x2 = 4, 2x3 = 6 = 0, 2x4 = 8 = 2, 2x5 = l0 = 4.
Tale valore non esiste, per cui si conclude che 2 non ha inverso. In realtà già si sapeva dato che MCD(2,6) ≠ 1.
Esempio2: Supponiamo ora che si sia intercettato i1 messaggio «YSFMG», che si sa essere stato criptato con un
cifrario affine di forma C(x) = 2x * 3 e sia stato scritto non con l’alfabeto inglese di 26 caratteri, ma, ad esempio, con
quello spagnolo che di caratteri ne ha 27 (possiede infatti anche la lettera Ñ, collocata nell’ordine alfabetico subito
dopo 1° N normale). Quale sarà il messaggio originale? Innanzitutto, calcoliamo il MCD (2, 27), che è uguale a 1. Il
messaggio originale quindi può essere decifrato. Per farlo si deve trovare la funzione inversa di C(x) =2x + 3 in modulo
27.
y=2x+3
2x=y-3.
Per poter isolare la x bisogna moltiplicare ambo i lati dell’espressione per l’inverso di 2. L’inverso di 2 in modulo 27 è
un intero n tale che 2n=1 mod 27, cioè 14, come si vede:
14 x 2 = 28 = 1
Di conseguenza, x = 14(y-3).
Ora possiamo decifrare il messaggio. La lettera Y occupa la posizione 25 e decifrata sarà 14(25 - 3) = 308 = 11 mod 27.
La lettera che occupa la posizione 11 nell’alfabeto è la L.
Per la lettera S, 14(19 - 3) = 224 = 8 mod 27 che corrisponde alla lettera I.
Per la lettera F 14(5 - 3) = 28 = 1 mod 27, che corrisponde alla B.
4
Per la lettera M 14(12-3) = 126 = 18 mod 27, che corrisponde alla R.
Per 1° lettera G 14(6 - 3) = 42 = 15 mod 27, che corrisponde alla O.
Il messaggio decifrato è la parola «LIBRO».
Sull’idea di Cesare e sulla sua generalizzazione in forma di cifrario affine, si sono basati per molti secoli molti sistemi di
sicurezza.
Fra le qualità di un buon algoritmo di criptazione, una delle più importanti è che a partire da questo si possano
generare una grande quantità di chiavi.
Sia il cifrario di Cesare convenzionale che il codice affine (questo in minor misura) sono vulnerabili alla crittoanalisi a
causa del numero relativamente ridotto di chiavi che ammettono. Se eliminiamo qualsiasi restrizione relativa
all’ordine dei caratteri dell’alfabeto cifrato, però, ii numero potenziale di chiavi aumenta. Si può notare che in totale
ce ne sarebbero 261 = 403.291.461.126.605.635.584.000.000, cioè, 403 quadrilioni di chiavi. Una spia in grado di
controllare una chiave possibile al secondo, impiegherebbe più di un miliardo di volte la vita attesa dell’universo per
finire tutte le possibilità. Una chiave possibile di un algoritmo generale di sostituzione così definito potrebbe essere la
seguente:
(1)
(2)
A
Q
B
W
C
E
D
R
E
T
F
Y
G
U
H
I
I
O
J
P
K
A
L
S
M
D
N
F
O
G
P
H
Q
J
R
K
S
L
T
Z
U
X
V
C
W
V
X
B
Y
N
Z
M
(1) Alfabeto originario. (2) Alfabeto cifrato
L’alfabeto cifrato non è “in ordine”. In realtà non è nemmeno casuale; riuscite a capire da dove deriva? Per cifrare il
messaggio «VENIVIDIVICI» con la chiave “QWERTY”, si cerca per ogni lettera dell’alfabeto convenzionale quella che le
corrisponde nell’alfabeto cifrato. In questo modo si otterrebbe il seguente messaggio cifrato: «CTFO CORO COEO».
Esiste un modo molto semplice per generare un numero quasi infinito di chiavi facili da ricordare per questo metodo
di cifratura. Basta ricordarsi una parola chiave qualsiasi (può essere anche una frase) e situarla all’inizio dell’alfabeto
cifrato, lasciando che il resto dello stesso segua l’ordine alfabetico convenzionale a partire dall’ultima lettera della
parola chiave, facendo attenzione a non ripetere nessun carattere. Un esempio potrebbe essere «CIFRA GENNAIO».
Innanzitutto bisogna eliminare lo spazio e i caratteri ripetuti, ottenendo così la parola chiave «CIFRAGENO». L’alfabeto
cifrato risultante è il seguente:
(1)
(2)
A
C
B
I
C
F
D
R
E
A
F
G
G
E
H
N
I
O
J
P
K
Q
L
S
M
T
N
U
O
V
P
W
Q
X
R
Y
S
Z
T
B
U
D
V
H
W
J
X
K
Y
L
Z
M
Il messaggio «VENIVIDIVICI» sarebbe cifrato come «HAUOHOROHOFO».
L’affidabilità e semplicità dell’algoritmo di sostituzione per parole chiave fece di questo sistema il favorito per secoli.
L’opinione generale era che i crittografi avessero definitivamente vinto la partita contro i crittoanalisi.
1.8. ANALISI DELLE FREQUENZE
Il Corano è composto da 114 capitoli, ognuno dei quali corrisponde ad una rivelazione (sura) avuta da Maometto. La
natura frammentaria degli scritti originali stimolò la nascita di un particolare ramo della teologia islamica dedicato a1la
datazione esatta del1e diverse rivelazioni, in cui gli studiosi de1 Corano, insieme a varie altre tecniche, si servirono
anche dello studio della frequenza con cui appaiono determinate parole considerate come di nuova introduzione. Se
una sura contiene un numero sufficiente di tali parole, si può supporre che sia relativamente tarda. Questa indagine fu
all’origine dei primi strumenti specifici di crittoanalisi inventati dall’uomo: l’analisi delle frequenze. Il primo a lasciare
una descrizione scritta di questa rivoluzionaria tecnica fu uno scienziato nato a Baghdad nell’anno 801, di nome alKindi, il più importante crittoanalista della storia. Nel metodo di cifratura per sostituzione, una lettera del messaggio
originale «mantiene la sua posizione però cambia il suo ruolo», ed è precisamente questa costanza nel «mantenere la
posizione a renderlo risolvibile tramite la crittoanalisi per frequenza. Il genio di al-Kindi sovvertì l’equilibrio di potere
fra crittografi e crittoanalisi, mettendo questi ultimi in una posizione di vantaggio, almeno per il momento.
Esempio: Con una buona approssimazione, le lettere che appaiono nei testi in italiano in ordine di frequenza sono: E,
A, I, O, N, R, L, T, S, C, D, U, P, M, V, G, B, H, F, Q, Z, X, J, K, Y, W. Possiamo osservare le percentuali d’apparizione di
ogni lettera nella seguente tabella di frequenze, ricavata dall’analisi di alcuni libri italiani pubblicati nel XX secolo.
A 10,96%
B 1,32%
E 11 ,35%
F 1,10%
I 10,78%
J 0,02%
M 2,63%
N 6,96%
Q 0,57%
R 6,44%
5
U 3,15%
V 1,90%
Y 0,01%
Z 0,57%
C 5,05%
D 3,79%
G 1,82%
H 1,30%
K 0,02%
L 6,39%
O 9,81%
P 2,89%
S 5,35%
T 5,76%
W 0,00%
X 0,08%
Se un messaggio è stato cifrato con un algoritmo di sostituzione come quelli esaminati precedentemente, può essere
decifrato in funzione della frequenza relativa dei caratteri del messaggio originale. Basta contare le volte in cui ognuno
dei caratteri cifrati appare e compararle con la tabella di frequenza della lingua in cui è stato scritto. Così, se il
carattere che appare più spesso nel testo cifrato è, ad esempio, la J, la lettera del messaggio originale alla quale con
più probabilità corrisponde sarà, nel caso dell’italiano, la E. Se il secondo carattere più frequente è la Z, con
ragionamento analogo si conclude che la corrispondenza più probabile è la A. Ripetendo i1 processo per tutti i
caratteri del messaggio cifrato si è in grado di portare a termine la crittoanalisi. Testi brevi presentano frequenze
relative di lettere molto diverse da quelle che caratterizzano la lingua nella sua globalità. Infatti, per testi con
un’estensione minore di 100 caratteri, questa semplice analisi raramente è utile. Ciò nonostante, l’analisi delle
frequenze, non deve rimanere legata solo allo studio delle lettere prese singolarmente. Anche accettando che è
improbabile che il carattere più frequente in un breve testo cifrato sia la E, possiamo affermare con maggiore certezza
che le cinque lettere più frequenti siano, senza ancora conoscere con sicurezza le corrispondenze, la E, la A, la I, la O e
la N. Di queste cinque lettere, l’unica che si ripete di seguito in italiano è la N. Quindi, se troviamo un carattere fra i
cinque più frequenti che, in più, appare due volte di seguito, possiamo momentaneamente concludere che si tratti di
una N nell’originale (oppure di una tra le due consonanti che la seguono come frequenza, ovvero R ed L). Allo stesso
modo, è pure probabile che, per quanto sia breve il testo, le vocali tendano ad apparire davanti o dietro ad un maggior
numero di altri caratteri rispetto alle consonanti, che invece tendono a raggrupparsi con altre vocali o con un numero
ristretto di caratteri. In questo modo, si può riuscire a identificare la A, la E e la O. Man mano che vengono decifrati
alcuni caratteri, appariranno parole dove mancano solo una o due lettere per la decifrazione completa, che ci
permetteranno di formulare nuove ipotesi; la rapidità della decifrazione, di conseguenza, aumenta più che
proporzionalmente man mano che si decifrano i caratteri. L’applicazione di queste ed altre particolarità nella
frequenza d’apparizione di lettere o gruppi di lettere della lingua originale può perciò portare alla riuscita nella
decifrazione, anche partendo da un testo relativamente corto.
La decifrazione attraverso l’analisi delle frequenze è un metodo efficace e anche spettacolare, tanto che ha attratto
l’attenzione di numerosi scrittori. Il racconto più celebre sulla crittoanalisi di un messaggio è “lo scarabeo d’oro” di
Edgar A. Poe, ma anche Verne e Conan Doyle si sono cimentati con questo metodo.
In Inglese la lettera più frequente è la “e”. Il protagonista del racconto esamina le
frequenze e scopre che il simbolo più presente è “8”. Poi suppone che i 3 caratteri
“;48” corrispondano alla parola “the”. La sequenza “;(88” si traduce con “t(ee” e
l’unica parola possibile in inglese è “tree” così scopre che “(“ corrisponde a “r”….
Il messaggio nello “scarabeo d’oro”
Gli “omini danzanti” di Poe
1.9. ALGORITMI POLIALFABETICI
I cifrari polialfabetici si differenziano dai monoalfabetici in quanto un dato carattere del testo in chiaro non viene
cifrato sempre con lo stesso carattere, ma con caratteri diversi in base ad una qualche regola, in genere legata ad una
parola segreta da concordare. Tipicamente la sicurezza del codice tende ad aumentare significativamente. Diventa
infatti più complesso individuare come sono state crittate le lettere del messaggio in base alla loro frequenza
caratteristica nella lingua di origine. Uno dei primi esempi documentati di cifrario polialfabetico è il famoso disco
cifrante di Leon Battista Alberti o la tavola di Vigenère. Pur essendo mediamente più sicuri dei monoalfabetici anche
questi cifrari sono facilmente attaccabili se si dispone di un testo cifrato sufficientemente lungo.
6
1.8.1. DISCHI DI ALBERTI
In realtà la soluzione al problema posto dall’analisi delle frequenze era già stata data da più di un secolo. L’artefice del
nuovo cifrario fu il versatile genio rinascimentale Leon Battista Alberti. Architetto, matematico e teorico della
prospettiva, Alberti si era anche cimentato, attorno al 1460, all’elaborazione di un sistema di criptazione consistente
nell’aggiungere all’alfabeto cifrato convenzionale un secondo, così come si vede nella tabella seguente.
(1)
(2)
(3)
A
D
M
B
E
N
C
F
B
D
G
V
E
H
C
F
I
X
G
J
Z
H
K
T
I
L
K
J
M
J
K
N
H
L
O
G
M
P
F
N
Q
D
O
R
S
P
S
A
Q
T
P
R
U
O
S
V
I
T
W
U
U
X
Y
V
Y
L
W
Z
R
X
A
E
Y
B
W
Z
C
Q
(1) Alfabeto originario. (2) Alfabeto cifrato 1. (3) Alfabeto cifrato 2.
Per criptare un messaggio qualsiasi, Alberti proponeva di alternare i due alfabeti cifrati. Per esempio, nel caso della
parola «CIFRA», il codice della prima lettera si cercherebbe nel primo alfabeto (F), quello della seconda nel secondo
(K), e così via. Nel nostro esempio, «CIFRA» risulterebbe cifrato come «FKIOD». Il vantaggio di questo algoritmo di
criptazione polialfabetico, rispetto ai precedenti, è immediatamente evidente: uno stesso carattere del testo
originario, A, è cifrato in due modi distinti, D e M. Per creare la maggior confusione possibile nel crittoanalista che si
fosse trovato ad affrontare il testo criptato, uno stesso carattere cifrato poteva quindi in realtà rappresentare due
caratteri diversi del testo originario. L’analisi delle frequenze perdeva così buona parte della sua utilità.
Un modo pratico di realizzare un cifrario polialfabetico è l’uso di dispositivi conosciuti come i «dischi di Alberti». Sono
cifratori portatili costituiti da una ruota fissa su cui è inciso l’alfabeto convenzionale e un disco concentrico e mobile su
cui è inciso un altro alfabeto. Chi invia il messaggio fa girare l’anello mobile abbinando l’alfabeto originario con tanti
alfabeti cifrati quanti sono i giri possibili dell’anello. Per decrittare il messaggio, il ricevente deve semplicemente
effettuare gli stessi giri dell’emittente. La sicurezza di questo cifrario dipende dal mantenere segrete le chiavi, ovvero
l’ordine dei movimenti dell’anello mobile.
1.8.2. QUADRATO DI DE VIGENERE
Lo sviluppo dell’idea di Alberti non venne attribuito all’italiano, che sulla questione non lasciò mai un trattato scritto,
ma ad altri due teorici della stessa epoca anche se vissuti qualche anno dopo, il tedesco Johannes Trithemius ed il
francese Blaise de Vigenère. Il primo e più celebre sistema di cifrario polialfabetico è quello conosciuto come
«quadrato di De Vigenère». Questo modello di cifrario era composto da un alfabeto originario di n caratteri sotto il
quale si distribuivano n alfabeti cifrati, ognuno di questi spostato di una lettera a sinistra. In altre parole, una matrice
quadrata di 26 righe e 26 colonne.
7
Il primo alfabeto cifrato servirebbe per applicare un cifrario di Cesare con parametri a=1 e b=2, il secondo al cifrario di
Cesare con b=3, ecc. La chiave del quadrato consiste nel sapere, per ogni lettera del messaggio, di quante righe ci
spostiamo verso il basso. In questo modo la frequenza delle lettere del messaggio originale sparisce. L’interesse di
qualsiasi crittografo risiede nel generare chiavi facili da ricordare, distribuire e aggiornare. Nel caso del quadrato di De
Vigenère, la parola chiave scelta viene allora usata con il seguente procedimento: si scrive la parola sotto al testo in
chiaro, ripetendola tante volte quante è necessario, si prende l’intersezione fra la riga e la colonna corrispondente
come su di una matrice cartesiana e si ottiene in questo modo il messaggio cifrato. La riga corrispondente in questo
caso sarebbe quella che inizia per la lettera del carattere della relativa parola chiave. Per esempio, si vuole cifrare ii
messaggio «DOMANI RAPPPORTO», attraverso la parola chiave «NOVEMBRE»:
Messaggio
Chiave
Cifrato
D
N
Q
O
O
C
M
V
H
A
E
E
N
M
Z
I
B
J
R
R
I
A
E
E
P
N
C
P
O
D
O
V
J
R
E
V
T
M
F
O
B
P
L’importanza di questi metodi polialfabetici è la resistenza all’analisi delle frequenze. Se uno stesso carattere può
essere cifrato in più di una forma, come si può effettuare un’analisi efficace? La domanda sarebbe rimasta senza
risposta per più di 300 anni.
1.10. BABBAGE
La lunghezza della parola chiave scelta determinava la quantità di alfabeti cifrati impiegati. Così, se la parola chiave era
«MURO», ogni carattere del messaggio originale poteva essere cifrato in 4 modi diversi. Altrettanto succedeva con le
parole. Questa caratteristica sarebbe stata il punto di partenza usato da Charles Babbage per aggirare l’ostacolo della
cifratura polialfabetica.
Esempio:
Messaggio
Chiave
Cifrato
L
M
Z
A
U
G
V
R
E
E
O
Q
R
M
F
D
U
J
E
R
N
E
O
Q
L
M
Z
A
U
G
R
R
A
O
O
A
S
M
G
S
U
Y
A
R
J
Si nota che la parola «LA» del messaggio originale è cifrata con gli stessi caratteri in entrambi i casi. Questo si deve al
fatto che la distanza fra entrambe le particelle nel messaggio originale (otto) è un multiplo del numero di caratteri
della chiave usata (quattro). Con quest’informazione, e dato un testo originale abbastanza lungo, è possibile
indovinare la lunghezza della parola chiave. Il procedimento è il seguente: si identificano tutti i caratteri ripetuti e gli
spazi che rimangono fra loro e si cercano divisori interi dei caratteri e degli spazi. I divisori comuni sono i numeri
candidati a rappresentare la lunghezza della chiave. Supponiamo che il candidato più probabile, per essere ii divisore
comune che appare più volte sia il 5. Rimane ora da indovinare a quali caratteri corrisponde ognuna delle cinque
lettere della chiave. Se ricordiamo il processo di codifica, ogni lettera della chiave del quadrato di De Vigenère
determina una cifratura monoalfabetica del carattere corrispondente del messaggio originale. Nel caso della nostra
chiave ipotetica di cinque caratteri (CL, C2, C3, C4, C5), il sesto carattere (C6) si cifra con lo stesso alfabeto con cui si è
criptato il primo (C1), il settimo (C7) con quello usato per cifrare il secondo (C2), eccetera. Quindi, in realtà il
crittoanalista si trova davanti cinque cifrature monoalfabetiche, tutte suscettibili di crittoanalisi. II processo si
completa compilando tabelle di frequenze per tutti i caratteri del testo cifrati con lo stesso carattere della parola
chiave (C1, C6, C11 ... e C2, C7, 12... fino a completare i cinque gruppi di caratteri per tutta la lunghezza del
8
messaggio), e confrontando queste tabelle con quelle della lingua del messaggio. Se la coincidenza non è chiara, si
scarta la lunghezza della chiave scelta e si prende la seconda più probabile. L’iterazione di questo processo permette
di identificare almeno una parola chiave probabile e, a questo punto, rimane solo da decifrare il messaggio.
Il magistrale exploit di Babbage, portato a termine attorno al 1854, sarebbe rimasto tuttavia nell’oscurità. Infatti,
l’eccentrico genio britannico non pubblicò le sue scoperte e solo studi recenti delle sue note manoscritte hanno
permesso di identificarlo come il pioniere della decifrazione della chiave polialfabetica. Per la fortuna dei crittoanalisi
del mondo intero, pochi anni dopo, nel 1863, l’ufficiale prussiano Friedrich Krasiski rese pubblico un metodo simile.
Indipendentemente da chi fu il primo a riuscire nell’impresa, è evidente che, alla fine del XIX secolo, la cifratura
polialfabetica aveva smesso di essere impenetrabile. A partire da quel momento, la forza di una cifratura sarebbe
dipesa non tanto da grandi innovazioni negli algoritmi di criptazione, ma dal numero di alfabeti cifrati possibili, che
doveva essere abbastanza grande da rendere del tutto impraticabile l’analisi delle frequenze e le sue varianti.
Sull’altro fronte, l’obiettivo diventava l’adozione di meccanismi che permettessero di snellire la crittoanalisi. Entrambe
le ricerche convergevano verso uno stesso punto e diedero vita ad uno stesso processo: la meccanizzazione, usando
macchine per codificare e decodificare, fino ad arrivare ai computer, passando per Enigma.
1.11. CIFRARIO ADFGVX
Nel XX secolo la telegrafia (su fili) fu sostituita dalla comunicazione senza fili, con l’invenzione della radio. In questo
modo i messaggi erano relativamente facili da intercettare. Questo procurò ai crittoanalisi grandi quantità di materiale
cifrato su cui lavorare e consolidò la loro posizione di forza, dato che tutte le cifrature utilizzare utilizzavano algoritmi
già noti. Il decrittaggio dei codici tedeschi durante la I guerra mondiale fece capire che occorreva una cifratura più
sicura. La lotta fra crittografi e crittoanalisi è la guerra occulta dietro ai due conflitti mondiali. In particolare, il cifrario
usato dai tedeschi nella prima guerra mondiale si chiamava cifrario ADFGVX ed era costituito da due parti:
sostituzione e trasposizione. Nella prima fase (sostituzione) si considera una griglia di caratteri di sette righe e sette
colonne dove la prima riga e la prima colonna sono formate dai caratteri ADFGVX. I 36 caratteri interni alla tabella (26
lettere e i primi 10 numeri) sono disposti in modo casuale. La disposizione degli elementi è la chiave di questo cifrario
ed anche il ricevente deve conoscerla.
A
O
G
A
5
V
U
A
D
F
G
V
X
D
P
3
1
6
M
W
F
F
B
7
L
S
9
G
0
H
J
D
N
X
V
Z
4
R
E
Q
Y
X
C
K
2
T
I
8
Ogni carattere del messaggio viene tradotto con un coppia di lettere dell’insieme ADFGVX, quelle nelle righe e colonne
corrispondenti. Ad esempio, se si vuole cifrare il numero 4 si scriverà “DV”. Il messaggio «OBIETTIVO PARIGI» si
cifrerebbe così:
o
AA
b
DF
i
VX
e
GV
t
GX
t
GX
i
VX
v
VA
o
AA
p
AD
a
FA
r
FV
i
VX
g
DA
i
VX
Finora si tratta di una sostituzione e basterebbe un’analisi delle frequenze per decifrare il messaggio. La seconda fase
(trasposizione) dipende da una chiave concordata. Si costruisce una griglia con tante colonne quante le lettere della
parola chiave e si riempiono le sue caselle con il testo cifrato. Nella prima riga si scrive la parola chiave (“BETA”
nell’esempio sottostante). Le caselle vuote si riempiono con i caratteri del numero zero (AG).
B
A
V
G
V
A
E
A
X
X
X
A
T
D
G
G
V
A
9
A
F
V
X
A
D
F
V
V
A
X
X
F
D
A
V
A
G
Ora si scambiano le colonne secondo l’ordine alfabetico della parola chiave.
A
B
F
A
V
V
X
G
A
V
D
A
V
F
A
V
G
V
Il messaggio cifrato sono le lettere prese per colonna:
E
A
X
X
X
A
A
X
X
T
D
G
G
V
A
F
D
A
«FVXADVAGAVGVAFVVAXXXAAXXDGGVAFDA»
Il messaggio risulta una mescolanza delle lettere A,D,F,G,V,X.
I tedeschi scelsero questi caratteri perché la loro codifica in codice morse differisce molto gli uni dagli altri,
permettendo al destinatario di riconoscere più facilmente eventuali errori di trasmissione.
Il ricevente deve conoscere la distribuzione casuale dei caratteri della tabella base e la parola chiave per invertire il
cifrato.
Esercizio: trovare l’algoritmo inverso, per decifrare il messaggio.
1.12. ENIGMA
Nel 1923 l’ingegnere tedesco Arthur Scherbius brevettò ENIGMA, una macchina per crittografare. Non è altro che una
versione migliorata del disco di Alberti, realizza cioè una crittazione polialfabetica. Era siile ad una macchina da
scrivere, con una tastiera e un tabellone luminoso di 26 lettere, tre rotori (scambiatori) con 26 possibili posizioni e una
plugboard (pannello con spinotti) fra la tastiera e il primo rotore il cui compito era di effettuare una prima sostituzione
di lettera in funzione del modo in cui venivano disposti gli spinotti. L’emittente disponeva innanzitutto gli spinotti per
lo scambio delle lettere e i rotori nella posizione specificata da un libro delle chiavi. Dopo digitava la prima lettera del
messaggio in chiaro e la macchina generava la lettera codificata illuminandola sul display. A questo punto il primo
scambiatore ruotava automaticamente alla posizione successiva fra le 26 possibili. Si aveva così una nuova cifratura;
quindi l’emittente digitava la seconda lettera e così via. Per decodificare il messaggio bastava introdurre i caratteri
cifrati in un’altra macchina ENIGMA con gli stessi parametri della prima. I tre rotori collegati in serie (quando il primo
terminava un giro iniziava il secondo…) davano 263=17.576 possibili cifrature. La plugboard permetteva di scambiare
tra loro coppie di lettere ed aggiungeva così altre combinazioni. C’erano 6 cavi con cui si potevano scambiare 6 coppie
di lettere.
Il numero di modi per collegare n coppie di lettere scelte in un alfabeto di N caratteri è dato dalla formula:
10
N!
N  2n!n!2n
Dove N=26 e n=6. Risultato: 100.391.791.500 combinazioni.
Ricapitolando: a) gli scambiatori danno 263=17.576 combinazioni; b) i tre scambiatori possono scambiarsi tra loro,
dando 3!=6 diverse combinazioni; c) i sei cavi di cablaggio danno 100.391.791.500 di combinazioni. Il numero totale di
chiavi è il prodotto di questi numeri cioè 10.586.916.764.424.000 (dieci mila miliardi).
Una chiave di ENIGMA era quindi composta da: la posizione del cablaggio per ognuno dei sei scambi di lettere
possibili, l’ordine dei rotori, la loro posizione di partenza. Queste indicazioni erano trasmesse in forma criptata e
cambiate giornalmente.
Grazie alle informazioni avute da spie tedesche, i polacchi riuscirono ad decodificare enigma. Un matematico polacco,
Rejewski riuscì a ridurre le chiavi possibili a 105.456 combinazioni. Costruì una macchina decodificatrice simile ad
enigma, chiamata Bomba, che trovava la chiave in meno di 24 ore. Nel 1938 i tedeschi aggiornarono ENIGMA
passando da 3 a 5 rotori e da 6 a 10 cavi. Il numero di combinazioni aumentò a 159 trilioni. La macchina polacca non
bastava più, si doveva cambiare approccio e i polacchi passarono il lavoro agli alleati inglesi che riunirono i migliori
crittoanalisi in una casa alla periferia di Londra, Bletchley Park. Fra questi c’era Alan Turing. Riuscì a decodificare
ENIGMA ma soprattutto gettò le basi per la costruzione del primo computer programmabile, Colossus, realizzato da
Max Newman nel 1944.
1.13. NAVAJO
Come curiosità bisogna riportare l’iniziativa degli americani nella seconda guerra mondiale che usarono indiani Navajo
come “Navajo code talker”. La lingua Navajo è difficilissima e con una grammatica particolare non confrontabile con
nessun altra lingua; oltretutto e una lingua solo orale. A quel tempo esistevano non più di trenta persone non-navajo
al mondo che potevano capire quella lingua, e tutti viventi in USA. Gli americani li usarono nell’area del Pacifico.
1.14. CIFRARIO DI HILL
Nel 1929 un matematico americano, Lester Hill, ideò un sistema di crittazione basato sulle matrici. Per cifrare un
messaggio usiamo una matrice
A
a b
c d
che abbia det(A) = 1 (In generale deve essere 1 il MCD fra n (la grandezza dell’alfabeto) e il
determinante)
1
Per decifrare useremo la matrice inversa A 
d b
c a
Esempio: Prendiamo un alfabeto di 27 caratteri (spagnolo) e aggiungiamo un carattere spazio bianco (Ф)
A
0
B
1
C
2
D
3
E
4
F
5
G
6
H
7
I
8
J
9
K
10
L
11
M
12
N
13
Ñ
14
O
15
P
16
Q
17
R
18
S
19
T
20
U
21
V
22
W
23
X
24
Y
25
Z
26
Ф
27
Per poter ottenere valori fra 0 e 27, lavoreremo in modulo 28. Troviamo una matrice di cifratura di determinante 1:
A
1 3
2 7
A1 
7 3
2 1
Il messaggio da codificare è «HOY». Si raggruppano i caratteri del messaggio in coppie: HO - YФ. Le loro corrispondenti
numeriche sono (7,15) – (25,27). Si moltiplica la matrice per ogni coppia di cifre:
1 3  7   52   24 
 
    mod 28
2 7 15  119   7 
che corrisponde ai caratteri (X, H)
11
1 3  25   106   22 
 
    mod 28
2 7  27   239   15 
che corrisponde ai caratteri (V, O)
Il messaggio «HOY» si codifica «XHVO».
Per decodificare si usa la matrice inversa. Si cerca l’equivalente numerico delle coppie XH e VO e si moltiplica per
l’inversa:
7  3  24   147   7 
 
    mod 28
 2 1  7    41 15 
che corrisponde ai caratteri (H, O)
7  3  22   109   25 
 
    mod 28
 2 1  15    29   27 
che corrisponde ai caratteri (Y, Ф)
Ovviamente questo lavoro va fatto con matrici molto grandi come chiavi.
Anche questo è un cifrario a sostituzione polialfabetica. E’ un cifrario ben resistente ad un attacco in cui si conosce
solo il testo cifrato, perché non c'è analisi della frequenza che tenga. Ma è invece vulnerabile ad un attacco known
plaintext, ovvero quando ho una coppia testo in chiaro - testo cifrato. Anzi, ad essere precisi, qui mi servono m
coppie di testo in chiaro e cifrato. Il motivo è piuttosto semplice. Qui parliamo di matrici, che indico con le lettere
maiuscole.
X è la matrice dei miei m testi in chiaro, messi per colonna
Y è la matrice dei corrispondenti m testi cifrati, messi anche loro per colonna
K è la matrice della chiave, a me ignota
Sappiamo come è fatto Hill:
Y=K*X
dove K * X è una moltiplicazione per matrici.
Ma se è vero questo, allora è sicuramente vero che:
Y * X-1 = K * X * X-1 => Y * X-1 = K
Infatti, se ho X, so anche calcolare la sua inversa (se possibile), e se moltiplico a destra e a sinistra, ottengo
esattamente la cosa qui sopra, ovvero la matrice K!
1.15. CIFRARIO PLAYFAIR
Il cifrario Playfair funziona così:
Una tabella 5 x 5 Nella prima riga c’è una chiave di 5 lettere.
J
B
H
P
V
A
C
I-K
Q
W
M
D
L
R
X
E
F
N
T
Y
S
G
O
U
Z
In un primo passaggio tutti i caratteri del messaggio in chiaro sono suddivisi in digrafi, cioè in coppie di lettere. Le due
lettere di ogni coppia devono essere differenti; si utilizza il carattere “x” se non lo sono. Se il messaggio in chiaro è
«GATTO» la divisione in digrafi sarà GA Tx TO. Il messaggio «TRE» diventa TR Ex. Ora si passa alla codifica. Se
entrambe le lettere del digrafo compaiono sulla stessa riga della tabella, i caratteri si sostituiscono con la lettera
seguente nell’ordine della tabella (la coppia JE si sostituirebbe con AS); se le lettere del digrafo si trovano sulla stessa
colonna si sostituiscono con la lettera “sotto” (ET diventa FY e TY diventa YE); altrimenti per codificare la prima lettera
12
del digrafo si osserva la riga in cui si trova fino a incrociare la colonna che contiene la seconda lettera; la cifra della
lettera in chiaro è quella che si trova nell’intersezione. Lo stesso per la seconda lettera (CO diventa GI oppure GK).
Esempio: Per cifrare il messaggio «RBA», prima si trasforma il messaggio così: RB Ax
La R diventa P; La B diventa D; la A diventa M; La X diventa W. Il messaggio cifrato è «PDMW».
13
2. OGGI
Con l’avvento dei computer tutto cambia. La forza bruta può essere usata agevolmente per decrittare, ma, d’altro
canto, possono essere usate chiavi molto più lunghe. Basta un analizzatore di rete come un software packet sniffer
che intercetta il traffico di rete per avere del materiale su cui lavorare. I crittografi moderni continuarono comunque
ad essere esposti al pericolo che qualche indesiderato trovasse le chiavi e, conoscendo l'algoritmo di criptazione, fosse
così in grado di decifrare il messaggio. Questa debolezza fondamentale di tutto il sistema "classico" di crittografia è
conosciuta come il problema della distribuzione della chiave. Da quando la comunità crittografica concordò che la
protezione delle chiavi, più che quella dell'algoritmo, era l'elemento fondamentale da garantire per la sicurezza del
crittosistema, si doveva affrontare il problema di come procedere alla distribuzione delle chiavi in modo sicuro.
C’erano seri problemi logistici, come, ad esempio, distribuire migliaia di libri contenenti le chiavi necessarie ad un
esercito di grandi dimensioni o ai centri di comunicazione mobili che si trovavano ad operare in circostanze estreme,
come l'equipaggio dei sottomarini o le unità dislocate al fronte. In effetti, non importa quanto possa essere sofisticato
un sistema di criptazione "classico": esso resterà sempre vulnerabile una volta che la sua chiave sia stata
intercettata.
La trasmissione stessa della chiave è di per sé un messaggio, così che anche questa deve essere criptata e con una
chiave che deve essere stata scambiata in precedenza.
Supponiamo però che un mittente qualsiasi, chiamato Alice, cripti un messaggio con una chiave propria e lo inoltri ad
un destinatario, Bob. Questi cripta di nuovo il messaggio cifrato con un'altra chiave propria e lo restituisce al mittente.
Alice decifra il messaggio con la sua chiave ed invia questo nuovo messaggio, che ora è solo cifrato con la chiave di
Bob, che procede a decifrarlo. Il millenario problema dello scambio sicuro di chiavi è stato risolto. È davvero così? In
realtà no. Infatti, in tutti gli algoritmi di cifratura complessa, l'ordine in cui si applica la chiave è fondamentale ed
abbiamo visto che nel nostro esempio teorico, Alice deve decifrare un messaggio già cifrato con un'altra chiave. II
risultato di invertire l'ordine dei cifrari sarebbe un linguaggio incomprensibile. Il problema non è risolto, però con
questa idea si ha il percorso da seguire.
Fino a poco tempo fa le chiavi di un mittente e di un ricevente dovevano essere uguali o quanto meno simmetriche:
dovevano servire sia per criptare che per decifrare. Questo tipo di crittografia si chiama a chiave privata. La chiave è
un segreto condiviso fra mittente e ricevente e per questo il sistema è vulnerabile. Si pensava che non fosse possibile
cifrare un messaggio usando una chiave e decifrarlo usandone un’altra. Questo non è vero.
Oggi gli algoritmi di criptazione consistono di almeno due chiavi: una privata e una pubblica.
Il meccanismo di trasmissione è: il mittente utilizza la chiave pubblica del destinatario per criptare il messaggio. Il
ricevente utilizza la sua chiave privata per decifrare il messaggio ricevuto. C’è un importante vantaggio: mittente e
ricevente non devono prima vedersi per decidere le chiavi, per cui il sistema è più sicuro. Questa è la crittazione a
chiave pubblica, base della sicurezza di tutte le reti di comunicazione attuali.
La crittografia asimmetrica, conosciuta anche come crittografia a coppia di chiavi, crittografia a chiave
pubblica/privata o anche solo crittografia a chiave pubblica è un tipo di crittografia dove, come si evince dal nome, ad
ogni attore coinvolto nella comunicazione è associata una coppia di chiavi: 1) la chiave pubblica, che deve essere
distribuita; 2) la chiave privata, appunto personale e segreta; evitando così qualunque problema connesso alla
necessità di uno scambio in modo sicuro dell'unica chiave utile alla cifratura/decifratura presente invece
nella crittografia simmetrica. Il meccanismo si basa sul fatto che, se con una delle due chiavi si cifra (o codifica) un
messaggio, allora quest'ultimo sarà decifrato solo con l'altra.
E’ bene spiegare ulteriormente questo che è il concetto fondamentale della crittografia moderna. L'idea base della
crittografia con coppia di chiavi diviene più chiara se si usa un'analogia postale, in cui il mittente è Alice ed il
destinatario Bob, i lucchetti fanno le veci delle chiavi pubbliche e le chiavi recitano la parte delle chiavi private:



Alice chiede a Bob di spedirle il suo lucchetto, già aperto. La chiave dello stesso verrà però gelosamente
conservata da Bob.
Alice riceve il lucchetto e, con esso, chiude il pacco e lo spedisce a Bob.
Bob riceve il pacco e può aprirlo con la chiave di cui è l'unico proprietario.
Se adesso Bob volesse mandare un altro pacco ad Alice, dovrebbe farlo chiudendolo con il lucchetto di Alice (che lei
dovrebbe aver preventivamente dato a Bob) che solo lei potrebbe aprire.
14
Si può notare come per mettere in sicurezza il contenuto dei pacchi ci sia bisogno del lucchetto del destinatario,
mentre per aprirli viene usata esclusivamente la propria chiave segreta, rendendo l'intero processo di
cifratura/decifratura asimmetrico (una chiave per cifrare ed una differente per decifrare). Chiunque intercettasse il
lucchetto (aperto) o il messaggio chiuso con il lucchetto non potrebbe leggerne il contenuto poiché non ha la chiave.
Uno dei vantaggi della crittografia asimmetrica sta nel fatto che le chiavi pubbliche possono essere scambiate anche
utilizzando un mezzo insicuro, come Internet.
Usando un'altra analogia si può dire che il metodo è analogo a quello di una cassaforte che abbia due chiavi distinte,
una usata per aprirla (chiave segreta), l'altra per chiuderla (chiave pubblica).
Con la crittografia asimmetrica si risolve il problema della riservatezza: criptando il messaggio con la chiave pubblica
solo il possessore della chiave privata è in grado di decriptarlo. Si risolve anche il problema della autenticità del
mittente: criptando il messaggio con la chiave privata solo con la corrispondente chiave pubblica questo può essere
decriptato e la chiave pubblica è conservata in registri consultabili ma gestiti in modo sicuro dove ad ogni chiave
pubblica è associata l’identità certa del proprietario. E’ possibile autenticare, oltre al mittente, anche il contenuto del
messaggio, generando un “hashing” dello stesso (vedi più avanti) e aggiungendolo in fondo al messaggio: nel caso in
cui ci fosse un’alterazione durante la trasmissione del messaggio, alla decodifica l’hashing sarebbe diverso e quindi il
destinatario può accorgersi dell’anomalia. E’ anche possibile ottenere contemporaneamente sia la riservatezza della
comunicazione che l’autenticazione, combinando assieme le due modalità. Alice cifra il messaggio con la chiave
pubblica di Bob e quindi solo Bob lo può decifrare con la sua chiave privata; contemporaneamente Alice firma il
messaggio la sua chiave privata: alla sua ricezione Bob, sapendo che il mittente è Alice, prova a decrittarlo con la
chiave pubblica di Alice così può autenticare Alice come mittente dato che solo chi ha la chiave privata ha potuto
cifrare il messaggio. Inoltre il messaggio è anche cifrato con la chiave pubblica di Bob e quindi la trasmissione risulta
inviolabile da chi non è in possesso della chiave privata di Bob: è quindi garantita anche la riservatezza.
Nella crittografia simmetrica invece (quella “tradizionale”), che basa la sicurezza del sistema sulla segretezza della
chiave di codifica/decodifica utilizzata, si rende necessario utilizzare un canale sicuro per la trasmissione della chiave,
poiché l'intercettazione della stessa, da parte di terzi, vanificherebbe la sicurezza del sistema stesso.
Figura A.1: Crittografia simmetrica.
Ripeto ulteriormente: ognuno ha due chiavi: una pubblica da distribuire a tutti quelli con cui vuole comunicare, e una
privata da tenere segreta. Ciò che viene cifrato con la chiave pubblica (operazione che può essere fatta da chiunque)
può essere decifrato solo con la chiave privata corrispondente (operazione che può essere fatta solo dal proprietario
della chiave): in questo modo non c'è più il problema di comunicare segretamente la chiave, perché questa è nota a
tutti; per comunicare in modo sicuro con una persona basta cifrare il messaggio con la sua chiave pubblica, come
illustrato in figura. Gli algoritmi di questo tipo sono detti a chiave asimmetrica, e il più noto tra essi è RSA.
Figura A.2: Crittografia asimmetrica.
Si potrebbe pensare che dopo l'invenzione della crittografia a chiave pubblica quella a chiave segreta abbia perso
interesse, ma le cose non stanno così. Gli algoritmi asimmetrici sono infatti computazionalmente molto più onerosi di
quelli simmetrici, per cui il loro uso risulta molto più pesante. Una soluzione comunemente adottata è l'uso della
15
crittografia asimmetrica per concordare una chiave segreta da utilizzare poi per scambiarsi i messaggi tramite un
algoritmo a chiave simmetrica: in questo modo il pesante algoritmo a chiave pubblica viene usato solo per trasmettere
una piccola quantità di dati (la chiave segreta), mentre per il resto si usa il più leggero algoritmo a chiave segreta.
2.1. DES
E’ un algoritmo simmetrico diventato lo standard USA per la protezione dei dati. Usa una chiave segreta di 64 bit di cui
8 sono di controllo. Il testo viene suddiviso in blocchi da 8 byte. In ASCII ogni blocco sono 64 bit a cui viene applicata
una trasposizione basata sulla chiave poi si applica per 16 volte una funzione cifrante usando metà della chiave (28 bit)
che ad ogni iterazione viene shiftata di un certo numero di bit. Quindi è un cifrario misto perché le trasformazioni sono
sia di trasposizione che di sostituzione. Alla fine viene effettuata una trasposizione inversa a quella iniziale. La
decifratura si fa applicando i passi nell’ordine inverso e con la stessa chiave. Le chiavi possibili sono solo 2 56. E’ stato
violato nel 1998, ma nonostante questo è ancora utilizzato, per esempio per cifrare file su un disco locale.
2.2. 3-DES
Stesso algoritmo del DES ma utilizzando chiavi più lunghe e più passaggi di cifratura. Usa tre passi di cifratura DES
consecutivi con tre chiavi diverse di lunghezza totale 168 bit. Viene utilizzato nelle transazioni commerciali che
utilizzano carte di credito.
2.3. IDEA
Ideato in sostituzione del DES, usa una chiave da 128 bit dove i blocchi da 64 bit del messaggio vengono elaborati in 8
iterazioni tutte uguali usando lo XOR, la somma mod 216 e la moltiplicazione mod 216+1. Lo XOR e l’addizione sono
operazioni invertibili (necessario per poter decodificare il messaggio). La moltiplicazione mod M è invertibile se
entrambi i fattori sono primi con M. 216+1= 65537 è un numero primo quindi è invertibile.
In ognuno degli 8 passi (round) si usano 6 sottochiavi. Poi c’è un nono passo, leggermente diverso, che usa 4
sottochiavi, per un totale di 52 sottochiavi.
Il messaggio viene diviso in 4 gruppi da 16 bit e mescolato con 6 chiavi da 16 bit estratte dalla chiave di 128. Per
generare le sottochiavi:



la chiave da 128 è suddivisa in 8 blocchi da 16. Queste sono le prime 8 sottochiavi.
Le cifre della chiave da 128 sono shiftate a sinistra di 25 bit. La nuova chiave è raggruppata in 8 blocchi da 8
bit. Queste sono ulteriori 8 sottochiavi.
Si ripete il secondo passo fino a generare 52 sottochiavi.
Non è ancora stato violato. La chiave a 128 bit lo assicura contro gli attacchi brute force. E’ utilizzato nei sw
commerciali di crittografia perché molto veloce.
2.4. AES
2.5. L’ALGORITMO DI DIFFIE-HELLMAN
Nel 1976 due giovani ricercatori statunitensi, Whitfield Diffìe e Monte Hellman, idearono un sistema per cui due
individui scambiavano messaggi cifrati, senza per questo dover scambiare alcuna chiave. Questo metodo si serve
dell'aritmetica modulare, così come delle proprietà dei numeri primi contenuti nelle operazioni. Il cuore della
crittografia asimmetrica è una funzione difficile da invertire a meno di conoscere la chiave; la funzione di decodifica
non deve essere deducibile da quella di codifica. L’idea è la seguente:
1) Alice sceglie un numero qualsiasi, che mantiene segreto. Chiameremo questo numero NM1.
2) Bob sceglie un altro numero qualsiasi, che, a sua volta, mantiene segreto. Chiameremo questo numero NP1.
16
3) Successivamente, sia Alice che Bob applicano ai loro rispettivi numeri una funzione dei tipo f(x) = ax mod p, essendo
p un numero primo conosciuto.


Alice ottiene da detta operazione un nuovo numero, NM2, che questa volta invia a Bob.
Bob ottiene da tale operazione un nuovo numero NP2, che invia a Alice.
4) Alice risolve un'equazione del tipo e ottiene come risultato un nuovo numero, CM.
5) Bob risolve un'equazione del tipo e ottiene come risultato un nuovo numero, CP.
Anche se sembra sorprendente, CM e CP saranno uguali. Si noti che l'unico momento in cui sia Alice che Bob si sono
scambiati informazioni, è stato allo stabilire la funzione f (x) ed all'atto di inviare NM2 e NP2 che non sono le chiavi e la
cui eventuale intercettazione, dunque, non compromette la sicurezza del crittosistema. La chiave di questo sistema
avrà la forma generale
a NM 1N P1 modulo p.
E’ anche importante tener conto che la funzione originale ha la particolarità di non essere reversibile, cioè,
conoscendo sia la funzione che il risultato, applicandola ad una variabile x, risulta impossibile (o molto difficile)
ottenere la variabile x originale.
Esempio: La funzione scelta è:
f(x)=7x mod 11
1) Alice sceglie un numero NM1, per esempio il 3 e calcola f(x)= 7x mod 11 ottenendo f (3)=73 =2 mod 11.
2) Bob sceglie un numero NP1 per esempio il 6 e calcola f(x)= 7x mod 11 ottenendo f (3)=76 =4 mod 11.
3) Alice manda a Bob il suo risultato, 2, e Bob fa lo stesso con il suo, 4.
4) Alice calcola 43 = 9 mod 11.
5) Bob calcola 26 = 9 mod 11.
Questo valore, 9, sarà la chiave del sistema.
Mario e Pietro hanno scambiato sia la funzione f(x), sia i numeri 2 e 4. Una possibile spia che tipo di informazioni
riesce ad estrapolare da questi dati? Supponiamo che la nostra spia conosca sia la funzione che i numeri. Il suo
problema è ora risolvere 7 NM 1  2 e 7 N P1  4 , essendo NM1 e NP1 i numeri che sia Alice che Bob mantengono segreti.
N M 1 N P1
Se riesce a trovarli disporrà della chiave risolvendo
mod p. La soluzione a questo problema si chiama in
matematica logaritmo discreto. La particolarità di questo tipo di equazioni è che sono difficilmente reversibili (o
anche, asimmetriche). Per valori di p di oltre 300 cifre e di a di oltre 100, la soluzione e, quindi, il riconoscimento della
chiave, risulta difficilissima.
a
Quest'algoritmo è oggi uno dei pilastri della crittografia moderna. L algoritmo di Diffie-Hellman dimostrò,
teoricamente, la possibilità di creare un metodo crittografico che non richiedesse uno scambio di chiavi ma che si
fondasse sulla comunicazione pubblica di parte del processo (la coppia di numeri iniziali che servono a determinare la
chiave). In altre parole, si era dimostrata la fattibilità di un sistema crittografico i cui emittenti e riceventi non
dovevano incontrarsi per stabilire le chiavi. Tuttavia rimanevano ancora alcuni inconvenienti: se Alice desiderava
inviare un messaggio a Bob, doveva aspettare che l'altro gli rispondesse per procedere con la generazione della
chiave. Nel tentativo di scoprire nuovi algoritmi di maggiore efficacia, Diffie teorizzò un crittosistema nel quale la
chiave di codificazione fosse diversa da quella di decodificazione e che, ovviamente, non fossero derivabili una
dall'altra. In questo crittosistema teorico, l'emittente avrebbe a disposizione due chiavi: quella di criptazione e quella
di decriptazione. Delle due, renderebbe pubblica solo la prima, affinché tutti quelli che desiderano inviargli un
messaggio, possano criptarlo. Una volta ricevuto il messaggio, il mittente procederebbe a decifrarlo con la chiave di
decriptazione, che ovviamente, sarebbe rimasta segreta. Come si poteva realizzare questo sistema?
17
2.6. RSA
Nell'agosto del 1977, il famoso divulgatore scientifico statunitense Martin Gardner pubblicò, nella sua colonna di
Ricreazioni matematiche della rivista Scientific American, un articolo intitolato "Un nuovo tipo di cifrario, per cui ci
vorrebbero milioni di anni per poterlo decifrare". Pubblicò un messaggio cifrato e la chiave pubblica N impiegata:
N = 114.381.625.757.888.867.669.235.779.976.146.612.010.218.296.721.242.362.562.561.842.935.706.935.245.733.
897.830.597.123.563.958.705.058.989.075.147.599.290.026.879.543.541
Gardner sfidò i lettori a decifrare il messaggio ed indicò come traccia che la soluzione richiedeva di fattorizzare N nei
suoi componenti primi p e q. Come ricompensa, Gardner promise un premio di 100 dollari al primo che rispondesse
correttamente. Chiunque avesse desiderato maggiori informazioni sul cifrario in questione, scrisse Gardner, poteva
inviare una richiesta al riguardo, al Laboratorio d'Informatica del MIT, all'attenzione dei suoi creatori Ron Rivest, Adi
Shamir e Len Adelman. La risposta corretta non fu ricevuta, se non 17 anni dopo e per trovarla fu necessaria la
collaborazione di più di 600 persone. Le chiavi risultarono essere p = 32.769.132.993.266.709.549.961.988.1
90.834.161.413.177.642.967.992.942.539.798.288.533
e
q=3.490.529.510.847.650.949.147.849.619.903.898.133.417.764.638.493.387.843.990.820.577 ed il messaggio
cifrato, "the magic words are sqweamish ossifrage" ("1e parole magiche sono schizzinose ossifraghe").
L’algoritmo presentato da Gardner è conosciuto come RSA, acronimo dei cognomi Rivest, Shamir e Adelman. Si tratta
della prima realizzazione pratica dei modello di chiave pubblica proposto da Diffie ed oggigiorno è impiegata
abitualmente. La sicurezza offerta è estrema, visto che il processo di decifrazione è incredibilmente laborioso, anche
se non impossibile. Questo metodo ha finora resistito a tutti gli attacchi, ma ha lo svantaggio di usare una chiave
almeno di 1024 bit contro i 128 degli algoritmi a chiave simmetrica.
Per una decodifica efficace di un messaggio è di vitale importanza che il messaggio cifrato abbia un inverso (per
poterlo decodificare). Un modo per assicurarsi questo punto è quello di lavorare in modulo un numero primo. Il
prodotto di primi costituisce una funzione non reversibile nel senso che, una volta effettuato il prodotto, risulta molto
difficile accertare il valore dei fattori originali.
L’algoritmo RSA è basato su alcune proprietà dei numeri primi. E’ un sistema a chiave pubblica perché la chiave di
criptazione è messa a disposizione degli emittenti che vogliono inviare messaggi. Ogni ricevente possiede una chiave
pubblica propria. I messaggi saranno trasmessi tradotti in numeri.
Innanzitutto, Alice genera un valore n come prodotto di due numeri primi p e q (n = pq) e si sceglie un valore e in
modo che il MCD (φ(n), e) = 1. [Vedi riferimenti matematici]. Ricordiamo che φ(n)=(p-1)(q-1). [Vedi riferimenti
matematici]. I dati che diventano pubblici sono il valore di n ed il valore di e (in nessuna circostanza forniremo i valori
p e q). La coppia (n, e) è la chiave pubblica del sistema, ed i valori p e q sono conosciuti come numeri RSA. Alice calcola
l'unico valore d in modulo φ(n) che verifica de=1 cioè l’inverso di e in modulo φ(n). Questo inverso esiste perché
MCD(φ(n), e) =1. Questo valore d è la chiave privata del sistema. Da parte sua, Bob impiega la chiave pubblica (n, e)
per criptare il messaggio m, mediante la funzione M=me mod n. Ricevuto il messaggio criptato M, Alice realizza
l'operazione Md =(me)d mod n. Questa espressione equivale a Md =(me)d =m mod n, che dimostra che il messaggio può
essere decifrato.
Esempio: Se p=3 e q=11, si ha che n=33. φ(33)=(3-1).(11-1)=20. Alice sceglie e in modo che non abbia divisori comuni
con 20, per esempio e=7. La chiave pubblica di Alice è (33,7).
Nel frattempo, Alice ha calcolato una chiave privata d che sarà l'inverso di 7 mod 20, cioè 7·3=1 mod 20, e cioè d = 3.
Bob desidera inviare il messaggio "9", cioè M=9. Per cifrarlo fa uso della chiave pubblica di Alice e risolve:
97 = 4.782.969 = 15 mod 33
Il messaggio cifrato è "15". Bob manda il messaggio. Alice riceve il messaggio " M = 15" e lo decifra con l'operazione:
153=3.375=9 mod 33.
Il messaggio è stato decifrato correttamente.
Mano a mano che si scelgono primi p,q di maggior dimensione, la difficoltà ad implementare l'algoritmo RSA aumenta,
fino al punto che diventa necessario l'uso del computer per il calcolo delle congruenze. Per esempio, essendo p=23 e
18
q=17, si ha che n = 391. La chiave pubblica risultante per e=3 è (391,3). Di conseguenza, d=235. Per un messaggio
piano come"34", l'operazione di decifrazione è:
204235=34 mod 391
Si osservi il grado della potenza e si pensi alla gigantesca capacità di calcolo necessaria per trovare la congruenza.
Ricapitolando:
1. Bob sceglie due numeri primi molto grandi, p e q.
2. Bob calcola n=pq e φ(n)=(p-1)(q-1) (la funzione φ(n), detta funzione fi di Eulero, indica il numero di elementi interi
primi rispetto a n).
3. Bob sceglie un numero b, tale che 0≤b≤φ(n), primo rispetto a φ(n).
4. Bob calcola a=b-1 mod φ(n) (ovvero trova quel numero a tale che ab=1 mod φ(n)). Per come è stato scelto b, tale
numero esiste ed è unico, e si può calcolare con un algoritmo detto di Euclide.
5. Bob rende disponibili i valori n e b, che costituiscono la sua chiave pubblica, e tiene segreti i valori p, q ed a, che
costituiscono la sua chiave privata.
L'uso di RSA per la cifratura funziona come segue:
1. Sia x il testo in chiaro del messaggio che Alice vuole mandare a Bob cifrandolo. Alice calcola y=xb mod n e lo manda
a Bob.
2. Bob riceve y da Alice, e può decifrare il messaggio calcolando x=ya mod n.
RSA può essere utilizzato per la firma nel modo seguente:
3. Sia x il testo in chiaro del messaggio che Bob vuole mandare ad Alice firmandolo. Bob calcola la firma come y=xa
mod n e la manda ad Alice.
4. Alice riceve x e y da Bob, e verifica che sia x=yb mod n. Se è così la firma è autentica, altrimenti è falsa.
La sicurezza di RSA si basa sulla congettura dell'intrattabilità del problema della scomposizione in fattori primi, per cui
un intruso, noti n e b, non può calcolare a perché non conosce p e q (e quindi φ(n)).
Perché dovremmo fidarci dell'algoritmo RSA?
Un'eventuale spia conosce i valori di z e di e, per il fatto che sono pubblici. Per decifrare il messaggio ha anche bisogno
del valore di d, la chiave privata. Come si è mostrato nell'esempio precedente, il valore d è generato a partire da n e
da e. Da dove nasce la sicurezza? Ricordiamo che per costruire d bisogna conoscere φ(n)=(p-1)(q-1), in particolare, p e
q. Per questo "basta" scomporre n come prodotto di due numeri primi p e q. Il problema per la spia è che fattorizzare
un numero grande come prodotto di due numeri primi costituisce un processo lento e laborioso. Se n è
sufficientemente grande, (dell’ordine di più di 100 cifre) non c’è modo conosciuto di trovare p e q in un periodo di
tempo ragionevole. Attualmente i numeri primi impiegati nella cifratura di messaggi superano le 200 cifre.
RSA è il metodo più utilizzato per la cifratura di firme digitali.
Nella pratica è un algoritmo computazionalmente pesante. Le funzioni matematiche che generano il codice cifrato e
quelle inverse per decifrarlo sono troppo lente per essere utilizzate nella cifratura di interi documenti. Viene utilizzato
in un altro modo. Attualmente l’algoritmo RSA è molto utilizzato per codificare il messaggio contenete la chiave da
scambiarsi per poi utilizzare un algoritmo tipo AES (simmetrico, più semplice e veloce) per scambiarsi i messaggi.
Questo è un sistema di crittografia ibrida. In un sistema di crittografia ibrida utilizziamo la crittografia asimmetrica a
chiave pubblica soltanto per comunicare la chiave segreta che poi verrà usata per una comunicazione basata su
crittografia simmetrica.
2.7. PGP
L algoritmo RSA richiede molto tempo di computazione e computer con elevata velocità di calcolo. Fino agli anni '80
solo i governi, l'esercito e le grandi imprese avevano computer sufficientemente potenti per lavorare con RSA. Nel
1991 Phil Zimmermann, fisico statunitense preoccupato della privacy degli utenti della rete, offrì gratuitamente il
sistema PGP (Pretty Good Privacy), un algoritmo di criptazione capace di funzionare su computer domestici. Il PGP
utilizza la codificazione simmetrica classica - fattore che gli conferisce maggiore rapidità - però cifra le chiavi con una
cifratura asimmetrica RSA (crittografia ibrida).
19
L’uso di PGP si è andato espandendo e oggi è il più importante strumento crittografico privato disponibile utilizzato
soprattutto per codificare le email. Si può anche firmare digitalmente l’email; per farlo usa l’algoritmo SHA-2 (vedi
avanti).
2.8. AUTENTICAZIONE DI MESSAGGI
La sicurezza di un sistema non è solo nella riservatezza. Come evitare, ad esempio, che qualcuno falsifichi l’indirizzo di
origine di una mail? Come essere sicuri dell’identità del mittente? Non è quindi solo la segretezza il problema, ma
anche l’autenticazione e l’integrità dei documenti. Come essere sicuri dell’identità del mittente? Come essere sicuri
che il messaggio cifrato sia arrivato integro, senza modifiche?
La crittografia a chiave pubblica viene utilizzata soprattutto per autenticare un mittente, cioè per avere la certezza
dell’identità dell’autore (firma digitale - vedi più avanti).
Furono proprio Diffie e Hellman a proporre un modo molto ingegnoso di impiegare la criptazione a chiave pubblica,
per accreditare l'origine di un messaggio. In un crittosistema di questo tipo, l'emittente cifra il messaggio con la chiave
pubblica del ricevente, che successivamente impiega la propria chiave privata per decifrarlo. Diffie e Hellman si
accorsero che l'algoritmo RSA ed altri simili mostravano un'interessante simmetria: la chiave privata poteva essere
impiegata anche per cifrare un messaggio e la pubblica per decifrarlo. Quest'operazione non fornisce alcuna sicurezza
- la chiave pubblica è a disposizione di tutti - ma assicura al ricevente che il messaggio proviene da un'emittente
preciso: il proprietario della chiave privata. Per autenticare il mittente di un messaggio è sufficiente, in teoria,
aggiungere al processo di criptazione normale, un altro nel modo seguente:
1) Il mittente cripta un messaggio con la chiave pubblica del ricevente. Questo primo passo assicura la riservatezza.
2) Il mittente cripta di nuovo il messaggio, questa volta con la sua chiave privata. In questo modo, il messaggio risulta
autenticato o firmato.
3) Il ricevente utilizza la chiave pubblica del mittente per risolvere la criptazione del secondo passo. L’origine del
messaggio è così verificata.
4) Il ricevente impiega ora la sua chiave privata per risolvere la criptazione del primo passo.
2.9. FUNZIONI HASH
Uno dei problemi di questo sistema teorico è che la criptazione a chiave pubblica richiede una capacità di
computazione considerevole e ripetere il processo, con lo scopo di firmare e verificare i messaggi, risulterebbe molto
dispendioso. È per questo che, nella pratica, la firma di un messaggio si realizza tramite risorse matematiche
conosciute come funzioni o algoritmi hash. Questi algoritmi generano, partendo dal messaggio originale, una catena
semplice di bit (normalmente 160) chiamata hash e hanno l’interessante proprietà di farlo in modo tale che la
probabilità che a diversi messaggi venga associato uno stesso hash sia praticamente nulla. Allo stesso modo, è quasi
impossibile invertire il processo ed ottenere il messaggio originale a partire dal suo hash. L’hash di un messaggio
qualsiasi è criptato dall'emittente con la sua chiave privata ed è inviato insieme al messaggio cifrato. Il ricevente
decodifica il messaggio che contiene l’hash con la chiave pubblica dell'emittente. Poi, dato che conosce la funzione
hash impiegata da quello, applica al messaggio detta funzione e confronta entrambi gli hash. Se coincidono, l’entità
dell'emittente è verificata e può essere sicuro che nessuno ha manipolato il messaggio originale.
Ricapitolando: Una funzione di hash è una funzione che, dato un qualunque messaggio di lunghezza arbitraria, ne
produce un'impronta (detta digest o fingerprint) di lunghezza prefissata (di solito dell'ordine di 100-200 bit). L'utilità di
una funziona di hash sta nel poter utilizzare l'impronta come rappresentazione compatta del messaggio stesso,
tipicamente firmando l'impronta anziché l'intero messaggio; perchè questo possa avvenire è desiderabile che la
funzione presenti due proprietà particolari, sia cioè senza collisioni e unidirezionale. La funzione è anche detta one
way hash perché è impossibile risalire al messaggio originale partendo da un valore hash.


Una funzione di hash h(x) è detta senza collisioni se è computazionalmente impraticabile trovare due
messaggi x e x’ tali che x≠x’ e h(x)=h(x’).
Una funzione di hash h(x) è detta unidirezionale se, data un'impronta z, è computazionalmente impraticabile
trovare un messaggio x tale che h(x)=z.
20
Le funzioni hash più note sono MD5 e SHA. SHA è lo standard governativo USA, più sicuro e lento. MD5 è lo standard
per internet, più veloce.
2.10. MD5
Genera una stringa di 128 bit (32 caratteri) chiamata MD5 Checkum a partire da un messaggio di lunghezza qualsiasi.
La crittografia tramite algoritmo MD5 viene applicata in tutti i settori dell'informatica che lavorano con il supporto
delle firme digitali o che comunque trattano dati sensibili: Ad esempio, viene utilizzata per controllare che uno
scambio di dati sia avvenuto senza perdite, semplicemente attraverso il confronto della stringa prodotta dal file
inviato con quella prodotta dal file ricevuto. Con lo stesso metodo si può verificare se il contenuto di un file è
cambiato (funzione utilizzata dai motori di ricerca per capire se una pagina deve essere nuovamente indicizzata).
È diffuso anche come supporto per l'autenticazione degli utenti attraverso i linguaggi di scripting Web server-side (PHP
in particolare): durante la registrazione di un utente su un portale internet, la password scelta durante il processo
verrà codificata tramite MD5 e la sua firma digitale verrà memorizzata nel database. Successivamente, durante il login
la password immessa dall'utente subirà lo stesso trattamento e verrà confrontata con la copia in possesso del server,
per avere la certezza dell'autenticità del login.
2.11. SHA
Algoritmi sviluppati dalla NSA americana, come modifiche all’MD4
SHA-0 è obsoleto.
SHA-1 è stato violato.
SHA-2 è quello attualmente in uso. Comprende 4 varianti: SHA-224, SHA-256 (questo è quello utilizzato in Italia), SHA384, SHA-512 che producono digest rispettivamente da 224, 256, 384 e 512 bit.
SHA-3 annunciato nel 2012.
L’elaborazione è simile a quella dell’MD5, costituita da quattro fasi delle quali le prime due identiche all’MD5.
E’ alla base di applicazioni come PGP e di protocolli come SSL utilizzati dai siti di e-commerce per proteggere le
transazioni online.
2.12. FIRMA DIGITALE
Il problema più importante per un crittosistema a chiave pubblica risiede non nell'autenticazione dei messaggi, bensì
in quella delle chiavi pubbliche stesse. Come fanno a sapere il mittente ed il ricevente che le chiavi pubbliche dell'altro
sono, in effetti, quelle corrette? Supponiamo che una spia inganni il mittente dandogli la propria chiave pubblica,
facendogli credere che si tratti di quella del ricevente. Se la spia riesce ad intercettare un messaggio può impiegare ora
la sua chiave privata per decodificarlo. Per evitare di essere riconosciuta, la spia usa la chiave pubblica del ricevente,
per criptare nuovamente il messaggio ed inviarlo al suo destinatario originale. È per questo che esistono istituzioni, sia
pubbliche che private, dedicate alla certificazione di chiavi pubbliche. Un certificato di questo tipo contiene, oltre alla
chiave corrispondente, informazioni sul ricevente e una data di scadenza. Gli enti detentori di queste chiavi rendono
pubblici i loro certificati per le parti, che possono ora usarle e scambiarle con un certo grado di sicurezza.
Ripeto il concetto: il mittente di un messaggio può firmarlo grazie alla sua chiave privata (che solo lui possiede), ma
tutti sono in grado di verificare l'autenticità della firma grazie alla chiave pubblica (che è globalmente nota). La firma
può poi essere abbinata alla normale cifratura, ottenendo messaggi firmati e cifrati, nel modo seguente (figura A.3). Si
ipotizzi che Bob voglia mandare un messaggio ad Alice: per prima cosa lo cifrerà con la propria chiave privata (firma) e
poi con quella pubblica di Alice (cifratura), infine spedirà il messaggio. Quando Alice lo riceverà, prima lo decifrerà con
la propria chiave privata (operazione che solo lei può fare, per cui è garantita la confidenzialità) e poi con quella
pubblica di Bob: se l'operazione va a buon fine Alice ha la certezza che il mittente è davvero Bob, perché solo lui può
aver cifrato il messaggio con la propria chiave privata. In realtà il modo in cui si realizza la firma digitale non è proprio
questo, ma è leggermente più complicato. Ciò che il mittente cifra con la propria chiave privata per garantire
21
l'autenticità non è l'intero messaggio, ma una sua ``impronta'' (detta digest) ottenuta mediante una particolare
funzione (funzione di hash); il digest cifrato viene poi allegato al messaggio e ne costituisce la firma. Il destinatario
calcola il digest del messaggio ricevuto (la funzione di hash è pubblica) e lo confronta con quello che ottiene
decifrando con la chiave pubblica del mittente la firma allegata: se coincidono la firma è autentica.
Figura A.3: Cifratura e firma digitale.
Spesso non serve la segretezza ma basta l’autenticazione e la certezza che il messaggio non venga modificato. E’
sufficiente che il messaggio venga “racchiuso” all’interno di un contenitore sicuro, che è la firma digitale. Grazie ad
essa si è sicuri dell’identità del mittente e si può sapere se il messaggio è stato modificato dopo l’apposizione della
firma. La firma digitale calcola il fingerprint del messaggio usando una funzione hash e cripta solo il fingerprint invece
che tutto il messaggio, risultando semplice e veloce. L’algoritmo di crittografia a chiave pubblica è limitato al solo
fingerprint. Nella pratica il mittente ha una smart card rilasciata da un ente certificatore che accerta la sua identità, e
un codice segreto (PIN). Quando si firma un documento, il file viene incapsulato e il risultato è un nuovo file con
estensione .p7m. Gli enti di certificazione forniscono programmi online per verificare l’identità del firmatario,
permettendo di aprire il file .p7m e leggere il contenuto interno (il messaggio).
Quando Alice vuole mandare a Bob un messaggio autenticato e integro, calcola il fingerprint del messaggio, lo cripta
con la sua chiave privata (il PIN della smart card) e lo accoda in fondo al messaggio in chiaro, aggiungendo in fondo
anche il certificato digitale del firmatario. Bob deve solo utilizzare la chiave pubblica di Alice per decrittare la firma e
quindi autenticare il mittente. Bob ricalcola il fingerprint del messaggio che deve corrispondere a quello inviato
altrimenti il messaggio è stato alterato.
Per poter generare una firma digitale sono necessari:



Un dispositivo per la generazione delle firme (smartcard o Token USB);
Un lettore di smartcard (nel caso in cui non si utilizzi un Token USB);
Un sw in grado di interagire con il dispositivo per la generazione delle firme digitali.
22
23
2.13. CERTIFICATO DIGITALE
Come essere certi che la chiave pubblica di un certo mittente sia proprio la sua? Occorre certificare l’identità del
mittente, attivando una procedura sicura per la diffusione della chiave pubblica: la chiave viene racchiusa all’interno di
un certificato digitale che contiene anche le informazioni sul mittente. Questo certificato deve essere validato da un
ente certificatore (CA Certification Authority) che garantisce l’identità del proprietario del certificato firmandone le
chiavi pubblica e privata con la propria chiave privata. In questo modo ne rende impossibile la manomissione.
Il Certificato Digitale è un documento contenuto nella smartcard del titolare e firmato digitalmente dal certificatore. I
formati più diffusi sono: PGP/GPG e X.509.
Per verificare che il certificato non sia stato sospeso o revocato è necessario l’accesso ad Internet perché il sw di
verifica possa controllare.
In Italia i certificatori sono accreditati presso l’Ente Nazionale per la digitalizzazione della Pubblica Amministrazione ed
iscritti in un apposito elenco sul sito www.DigitPA.gov.it. Alcuni dei Certificatori espletano questa attività
esclusivamente per gruppi chiusi di utenti (Stato Maggiore della Difesa, Consiglio Nazionale Forense, Consiglio
Nazionale del Notariato…). Il Certificato ha una validità da uno a tre anni che dipende dal Certificatore e deve essere
rinnovato periodicamente.
2.14. PEC
Posta Elettronica Certificata. E’ un tipo di email che ha lo stesso valore legale di una raccomandata con ricevuta di
ritorno. Quando si invia una mail con la PEC ci viene fornita una ricevuta dell’avvenuta spedizione e quando il
messaggio giunge al destinatario un’ulteriore ricevuta di avvenuta consegna.
Il modo più semplice per garantire la riservatezza è quello di utilizzare un algoritmo di cifratura a chiave simmetrica
come DES o AES. Il metodo si rivela sicuro se si ha Ia certezza che solo mittente e destinatario conoscano la chiave
simmetrica altrimenti è conveniente utilizzare la crittografia a chiave pubblica che presenta però problemi di onerosità
dai punto di vista computazionale tipici di RSA, algoritmo cento volte più lento di DES. In alternativa può essere
utilizzato un algoritmo di cifratura del messaggio di posta a chiave simmetrica con una cosiddetta chiave di sessione
ovvero una chiave utilizzata solo per un'unica spedizione e che verrà cifrata dal mittente con RSA prima che sia inviata
insieme ai messaggio cifrato con DES.
Quando l'utente A vuole inviare un messaggio all'utente B:




genera una chiave di sessione;
con essa cifra il messaggio da spedire utilizzando un algoritmo a chiave simmetrica come DES;
cifra la chiave di sessione con un algoritmo a chiave asimmetrica, come RSA, utilizzando la chiave pubblica di B;
spedisce a B, in un'unica busta elettronica, il messaggio cifrato con DES e la chiave simmetrica cifrata con RSA.
Quando l'utente B riceve la busta:


ricostruisce la chiave di sessione decifrandola con RSA e con la propria chiave privata;
utilizza la chiave di sessione per decifrare il messaggio cifrato da A con DES.
Il vantaggio di questa tecnica consiste nel cifrare con RSA, molto oneroso, solo la chiave di sessione e di cifrare invece
l'intero messaggio con DES, molto veloce. Inoltre in questo modo viene risolto il problema della distribuzione della
chiave simmetrica di sessione con la garanzia che resti nota solo al mittente e al destinatario. La procedura sopra
descritta non è però sufficiente a garantire anche l'autenticazione e l’integrità del messaggio. Qualora si voglia che
siano verificate anche queste due ultime proprietà, occorre prevedere meccanismi tipici della firma digitale con hash
crittografico.
Quando l'utente A vuole inviare un messaggio all'utente B:




genera una chiave di sessione;
con essa cifra il messaggio da spedire utilizzando un algoritmo a chiave simmetrica come DES;
cifra la chiave di sessione con un algoritmo a chiave asimmetrica, come RSA, utilizzando la chiave pubblica di B;
applica un algoritmo hash (ad esempio SHA-1) al messaggio producendo un digest;
24


cifra con RSA il digest ottenuto con la propria chiave privata per creare la sua firma digitale;
predispone e spedisce la busta elettronica contenente:
1. il messaggio cifrato con chiave simmetrica di sessione,
2. la chiave di sessione cifrata con chiave pubblica di B e algoritmo a chiave asimmetrica, come RSA,
3. la propria firma digitale contenente il digest cifrato con la propria chiave privata e algoritmo a chiave
asimmetrica.
Quando l'utente B riceve la busta:






ricostruisce la chiave di sessione decifrandola con RSA e con la propria chiave privata;
utilizza la chiave di sessione per decifrare il messaggio cifrato da A con DES;
applica un algoritmo hash (ad esempio SHA-1) al messaggio appena decifrato producendo un digest;
decifra con RSA e la chiave pubblica di A il digest ricevuto nella busta;
confronta il digest ricevuto con quello ricalcolato;
se sono uguali è certo che il mittente sia proprio A (autenticità) e che il messaggio non è stato alterato dopo la
spedizione (integrità).
Resta il problema della distribuzione delle chiavi pubbliche; quella di A utilizzata da B per verificare la firma digitale e
quella di B utilizzata da A per cifrare la chiave di sessione. Per questo si ricorre all’Autorità di Certificazione.
25
26
2.15. TLS
La maggior parte delle spie o hacker ha poco interesse nei messaggi che la gente ordinaria si scambia, con una
notevole eccezione: il numero delle loro carte di credito. Il crittosistema alla base della trasmissione di un frammento
d'informazione così delicato è conosciuto come TLS (Transport Layer Security) e fu sviluppato dall'impresa di software
Netscape nel 1994 e adottato come standard, due anni dopo. Il protocollo TLS combina chiave pubblica e simmetrica
in un processo abbastanza complesso che viene riassunto di seguito. Innanzitutto, il browser di Internet
dell'acquirente controlla che il venditore online disponga di un certificato di chiave pubblica valido. In tal caso, impiega
questa chiave pubblica per criptare una seconda chiave, questa volta simmetrica, che inoltra al venditore. Questi
utilizza la sua chiave privata per decodificare il messaggio e trovare la chiave simmetrica, che sarà usata per cifrare
tutto il processo di scambio d'informazioni. Di conseguenza, per trovare il numero di carta di credito in una
transazione online qualsiasi, una spia dovrà penetrare non uno, bensì due crittosistemi.
27
3. MATEMATICA UTILE
3.1. NUMERI PRIMI
Numeri maggiori di uno e divisibili SOLO per 1 e per se stessi.
Qualsiasi numero naturale >1 può essere sempre rappresentato come un prodotto di potenze di numeri primi e
questa rappresentazione (fattorizzazione) è unica.
Gli unici due numeri primi consecutivi sono 2 e 3. I numeri primi dispari consecutivi, cioè quelli che si trovano ad una
distanza numerica di due (es: 17 e 19) sono detti numeri primi gemelli.
3.2. NUMERI PRIMI DI MERSENNE
Un numero primo è un primo di Mersenne se, sommandogli 1, il risultato è una potenza di due. Esempio: 7 è un primo
di Mersenne (7+1=23).
I primi otto primi di Mersenne sono: 3, 7, 31, 127, 8.191, 131.071, 524.287, 2.147.483.647
Attualmente se ne conoscono una quarantina.
3.3. NUMERI PRIMI DI FERMAT
Un numero primo è un primo di Fermat se è della forma:
Fn  2 2  1 dove n è un numero naturale.
n
Si conoscono solo cinque numeri di Fermat: 3 (n=0), 5 (n=1), 17 (n=2), 257 (n=3), 65.537 (n=4).
3.4. ARITMETICA MODULARE
Si basa sul concetto di congruenza modulo n. Dati tre interi a, b, n con n≠0, a e b sono congruenti modulo n se la loro
differenza a-b è un multiplo di n e si scrive
a = b mod n
oppure a mod n = b
Cioè a e b sono congruenti modulo n se hanno lo stesso resto nella divisone per n.
Es: 38 = 14 mod 12
Perché il resto di 38/12 è 2 e anche quello di 14/12
3.5. PICCOLO TEOREMA DI FERMAT
Se p è un numero primo, allora per qualunque intero a avremo che ap = a mod p
3.6. IDENTITA’ DI BEZOUT
Se a e b sono numeri interi positivi e MCD(a,b)=k allora esistono due numeri interi p e q che verificano
pa + qb = k.
Nel caso particolare in cui MCD(a,b)=1 otteniamo che esistono due numeri interi p e q tali che pa + qb = 1.
Lavorando in modulo n: Se MCD(a,n)=1, esistono p e q interi tali che pa + qn = 1. Ma in modulo n, qn=0 quindi pa=1,
cioè l’inverso di a mod n esiste ed è p.
28
3.7. FUNZIONE φ DI EULERO
Dal ragionamento precedente, il numero di elementi con inverso in modulo n è il numero di naturali a minori di n che
verificano MCD(a,n)=1. Tale insieme di numeri è conosciuto come funzione di Eulero e si indica φ(n). La funzione di
Eulero restituisce il numero di elementi minori di n che sono primi con n (il numero di interi che hanno MCD = 1 con
n).
Se n è un numero primo, il MCD(a,n)=1 per ogni valore di a e quindi qualunque valore di a avrà un inverso modulo n,
perciò φ(n)=n-1.
Se n=pq con p e q numeri primi, allora φ(n)=(p-1)(q-1).
Per il piccolo Teorema di Fermat si sa che, se a è un intero >0 e p un numero primo, avremo la relazione ap = a mod p
che nell’aritmetica modulare equivale a ap-1 = 1 mod p. Dai risultati precedenti possiamo dire, se MCD(a,n)=1;
a φ (n) = 1 mod n
29
APPENDICE 1: ALGORITMO IDEA
30
31
32
33
34
35
APPENDICE 2: ALGORITMO MD5
1. Padding: Vengono aggiunti bit alla fine del messaggio da codificare finchè la lunghezza del messaggio diventa pari a
448 mod 512. In particolare, il primo bit aggiunto è un “1”, mentre i successivi sono tutti “0”.
2. Aggiunta delle informazioni sulla lunghezza del messaggio (calcolata prima del padding) in codifica a 64 bit. Se la
lunghezza del messaggio era minore di 264, vengono utilizzati solamente i 64 bit inferiori del messaggio, ottennendo
così 2 word (da 32 bit ciascuna) che vengono accodate al messaggio dando precedenza alla word inferiore.
3. A questo punto il messaggio ha ottenuto una lunghezza multipla di 512.
4. Inizializzazione del buffer MD: questo buffer è composto da 4 word a 32 bit, inizializzate come segue:

A: 01 23 45 67

B: 89 ab cd ef

C: fe dc ba 98

D: 76 65 32 10
5. Elaborazione del messaggio:Vengono definite quattro funzioni che ricevono in ingresso tre word e ne restituiscono
una:

F(x,y,z) = (x AND y) OR(NOTx OR z)

G(x,y,z) = (x AND z) OR(y OR NOTz)

H(x,y,z) = (x XOR y XOR z)

I(x,y,z) = y XOR(x OR NOTz)
In particolare ogni funzione adotta la seguente logica: se è vero x, allora passa ad y altrimenti a z. Ecco lo pseudocode
dell’algoritmo:
//Nota: Tutte le variabili sono "unsigned" da 32 bit
var int[64] r, k//r specifica lo spostamento per iterazione
r[ 0..15] := {7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22}
r[16..31] := {5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20}
r[32..47] := {4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23}
r[48..63] := {6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21}
//Usa la parte binaria intera del seno di interi come costante:
for i from 0 to 63
k[i] := floor(abs(sin(i + 1)) × (2 pow 32))
//Inizializzazione
var int h0 := 0x67452301
var int h1 := 0xEFCDAB89
var int h2 := 0x98BADCFE
var int h3 := 0x10325476
//Pre-processazione
append "1" bit to message
append "0" bits until message length in bits ≡ 448 (mod 512)
append bit (bit, not byte) length of unpadded message as 64-bit little-endian integer to message
//Processa il messaggio in pezzi da 512
for each 512-bit chunk of message
break chunk into sixteen 32-bit little-endian words w[i], 0 ≤ i ≤ 15
//inizializza il valore dell'hash di questo pezzo
var int a := h0
var int b := h1
36
var int c := h2
var int d := h3
//Main loop:
for i from 0 to 63
if 0 ≤ i ≤ 15 then
f := (b and c) or ((not b) and d)
g := i
else if 16 ≤ i ≤ 31
f := (d and b) or ((not d) and c)
g := (5×i + 1) mod 16
else if 32 ≤ i ≤ 47
f := b xor c xor d
g := (3×i + 5) mod 16
else if 48 ≤ i ≤ 63
f := c xor (b or (not d))
g := (7×i) mod 16
temp := d
d := c
c := b
b := b + leftrotate((a + f + k[i] + w[g]) , r[i])
a := temp
//Aggiunge questa parte di hash al risultato
h0 := h0 + a
h1 := h1 + b
h2 := h2 + c
h3 := h3 + d
var int digest := h0 append h1 append h2 append h3
//(expressed as little-endian)
//Definizione della funzione "leftrotate"
leftrotate (x, c)
return (x <> (32-c));
6. Message Digest: L’output dell’algoritmo è l’hash finale, ottenuto a partire dal LSB (byte meno importante) della word
A seguito da b ,c e terminante con il byte più importante di D.
37
APPENDICE 3: ALGORITMO MD5 IN JAVA
It will use MD5 hashing algorithm to generate a checksum for file “c:\\loging.log”.
package com.mkyong.test;
import java.io.FileInputStream;
import java.security.MessageDigest;
public class MD5CheckSumExample
{
public static void main(String[] args)throws Exception
{
MessageDigest md = MessageDigest.getInstance("MD5");
FileInputStream fis = new FileInputStream("c:\\loging.log");
byte[] dataBytes = new byte[1024];
int nread = 0;
while ((nread = fis.read(dataBytes)) != -1) {
md.update(dataBytes, 0, nread);
};
byte[] mdbytes = md.digest();
//convert the byte to hex format method 1
StringBuffer sb = new StringBuffer();
for (int i = 0; i < mdbytes.length; i++) {
sb.append(Integer.toString((mdbytes[i] & 0xff) + 0x100, 16).substring(1));
}
System.out.println("Digest(in hex format):: " + sb.toString());
//convert the byte to hex format method 2
StringBuffer hexString = new StringBuffer();
for (int i=0;i<mdbytes.length;i++) {
String hex=Integer.toHexString(0xff & mdbytes[i]);
if(hex.length()==1) hexString.append('0');
hexString.append(hex);
}
System.out.println("Digest(in hex format):: " + hexString.toString());
38
}
}
Output
Digest(in hex format):: e72c504dc16c8fcd2fe8c74bb492affa
Digest(in hex format):: e72c504dc16c8fcd2fe8c74bb492affa
39
APPENDICE 4: File checksum with SHA-256
http://www.mkyong.com/java/java-sha-hashing-example
It will use SHA-256 hashing algorithm to generate a checksum for file “c:\\loging.log”.
package com.mkyong.test;
import java.io.FileInputStream;
import java.security.MessageDigest;
public class SHACheckSumExample
{
public static void main(String[] args)throws Exception
{
MessageDigest md = MessageDigest.getInstance("SHA-256");
FileInputStream fis = new FileInputStream("c:\\loging.log");
byte[] dataBytes = new byte[1024];
int nread = 0;
while ((nread = fis.read(dataBytes)) != -1) {
md.update(dataBytes, 0, nread);
};
byte[] mdbytes = md.digest();
//convert the byte to hex format method 1
StringBuffer sb = new StringBuffer();
for (int i = 0; i < mdbytes.length; i++) {
sb.append(Integer.toString((mdbytes[i] & 0xff) + 0x100, 16).substring(1));
}
System.out.println("Hex format : " + sb.toString());
//convert the byte to hex format method 2
StringBuffer hexString = new StringBuffer();
for (int i=0;i<mdbytes.length;i++) {
hexString.append(Integer.toHexString(0xFF & mdbytes[i]));
}
40
System.out.println("Hex format : " + hexString.toString());
}
}
Output
Hex format : 21a57f2fe765e1ae4a8bf15d73fc1bf2a533f547f2343d12a499d9c0592044d4
Hex format : 21a57f2fe765e1ae4a8bf15d73fc1bf2a533f547f2343d12a499d9c0592044d4
ESEMPIO 2
It will use SHA-256 hashing algorithm to generate a hash value for a password “123456”.
package com.mkyong.test;
import java.security.MessageDigest;
public class SHAHashingExample
{
public static void main(String[] args)throws Exception
{
String password = "123456";
MessageDigest md = MessageDigest.getInstance("SHA-256");
md.update(password.getBytes());
byte byteData[] = md.digest();
//convert the byte to hex format method 1
StringBuffer sb = new StringBuffer();
for (int i = 0; i < byteData.length; i++) {
sb.append(Integer.toString((byteData[i] & 0xff) + 0x100, 16).substring(1));
}
System.out.println("Hex format : " + sb.toString());
//convert the byte to hex format method 2
StringBuffer hexString = new StringBuffer();
for (int i=0;i<byteData.length;i++) {
String hex=Integer.toHexString(0xff & byteData[i]);
if(hex.length()==1) hexString.append('0');
hexString.append(hex);
41
}
System.out.println("Hex format : " + hexString.toString());
}
}
Output
Hex format : 8d969eef6ecad3c29a3a629280e686cf0c3f5d5a86aff3ca12020c923adc6c92
Hex format : 8d969eef6ecad3c29a3a629280e686cf0c3f5d5a86aff3ca12020c923adc6c92
42