Introduzione Alla Crittografia
Sistemi crittografici
simmetrici e
asimmetrici.
© Gianni Antini, 2000
Crittografia
© Antini Gianni, 2000
Definizioni Generali
Si parla di testo in chiaro (plain-text) riferendosi al
messaggio originale.
Il testo in chiaro viene crittografato mediante l’uso di una
apposita chiave, a questo punto il messaggio prende il nome
di testo cifrato (cipher-text).
La stessa chiave usata per la cifratura viene normalmente
usata per la decifratura del messaggio e si parla di
crittografia simmetrica (o chiave privata). Quando invece la
chiave usata per la decifrazione è diversa da quella usata per
la cifratura si parla di crittografia asimmetrica (o a chiave
pubblica).
La crittografia asimmetrica necessita di complesse tecniche
matematiche ed è stata sviluppata solo recentemente.
Crittografia
© Antini Gianni, 2000
Crittografia Teorica
Nel 1949 C. Shannon pubblica un articolo che da l’inizio a quella
che oggi viene chiamata la Teoria dell’Informazione.
L’unione di questa nuova scienza, della Teoria della Probabilità,
della Teoria della Complessità e della Teoria dei Numeri da vita
alla Crittografia Moderna.
Definizione: Un crittosistema è una quintupla (P,C,K,FC,FD)
dove,
P: insieme finito dei testi in chiaro
C: insieme finito dei testi cifrati
K: insieme delle possibili chiavi
FC: funzione di cifratura (è una FC(k1) con k1∈K)
FD: funzione di decifratura (è una FD(k2) con k2∈K)
Crittografia
© Antini Gianni, 2000
Se k1=k2 si parla di crittosistema simmetrico, altrimenti di
crittosistema asimmetrico
Definizione: Un cifrario si dice perfetto se ∀x*,y* si ha:
P(x=x*)=P(x=x*|y=y*) dove x è chiaro e y è cifrato
In altre parole l’indecisione di sapere il plaintext senza
conoscere il testo cifrato è la stessa che si ha conoscendo il
ciphertest.
I cifrari perfetti sono stati realmente costruiti e sono stati
utilizzati per molti anni per la protezione della hot-line USAURSS durante la guerra fredda.
Crittografia
© Antini Gianni, 2000
A fronte dei cifrari perfetti (o dimostrabilmente sicuri) esistono
anche cifrari:
• Computazionalmente sicuri – La Teoria dell’informazione ci
dice che essi non possono essere sicuri (vedi oltre), ma il
problema crittoanalitico è intrattabile.
• Condizionalemente sicuri – Sono cifrari di cui è stata
dimostrata l’inattaccabilità, a patto che non si verifichino alcuni
eventi probabilistacamente improbabili.
Tutti i cifrari moderni realmente utilizzati appartengono alla
classe dei computazionalmente sicuri.
Alcuni autori hanno creato cifrari condizionalemente sicuri ma
essi sono del tutto inutilizzabili a causa dell’utilizzo di tabelle
casuali (e non pseudocasuali) sterminate (Ueli Mauer – Moon
Cipher).
Crittografia
© Antini Gianni, 2000
Esempio di cifrario perfetto (One-time pad – 1917 Gilbert
Verman AT&T):
1. Si costruisce una grande chiave casuale (e non
pseudocasuale) ad esempio utilizzando un rivelatore di
raggi cosmici.
2. Il cipher text è costruito tramite un ⊕ bit a bit fra il
messaggio in chiaro e la chiave casuale.
3. La chiave NON deve mai essere riutilizzata (one-time
pad).
Come è facilmente immaginabile una spia non ha nessun
appiglio a cui aggrapparsi per crittoanalizzare il
messaggio.
Crittografia
© Antini Gianni, 2000
Teorema: P(X=x|Y=y)=P(X=x)
Dimostrazione:
Siano X e Y di n bit dal T. di Bayes si ha:
P(X=x|Y=y)=P(X=x,Y=y)/P(Y=y)
dove:
P(X=x,Y=y)=P(X=x,k=x⊕y)=P(X=x)P(k=x⊕y)=P(X=x)2-n
mentre:
P(Y=y)=∑xP(X=x,Y=y)=∑xP(X=x)2-n=2-n∑xP(X=x)=2-n
Î
P(X=x|Y=y)=P(X=x)2-n/2-n=P(X=x)
Purtroppo one-time pad è molto scomodo da usare.
Crittografia
© Antini Gianni, 2000
Definizione (Entropia): Sia x una v.a. con distribuzione di
probabilità p1,…,pn si ha:
H(x)=-∑i=1,npiln(pi) [binit]
Definizione (Sicurezza perfetta secondo Shannon): La
sicurezza perfetta equivale a:
H(x)=H(x|y)
Teorema (Shannon): In un sistema crittografico perfetto la
lunghezza della chiave deve essere almeno uguale a quella
del plain text
Il Teorema di Shannon fu una vera e propria mina su ogni
speranza di costruzione di un cifrario perfetto utilizzando una
chiave piccola e quindi maneggevole.
Crittografia
© Antini Gianni, 2000
“Alla ricerca della perfezion perduta”
L’idea che sta alla base di questa classe di cifrari è riassunta
nello schema:
pseudorandom stream
generator
cipher text
key
plain text
Generare sequenze pseudocasuali che abbiano adeguate
probrietà di randomicità è uno dei problemi attuali della
crittografia.
Crittografia
© Antini Gianni, 2000
Generatore pseudocasuale lineare
Il sequenze generatore fornisce sequenze pseudocasuali:
Sn-1
S2
S1
S0
output
αn-1
α1
α2
α0
⊕
I valori di S0, S1,…,Sn rappresentano i bit della chiave che
“innescano” in generatore. Solo la sequenza 00…0 non si può
esare. Si ha:
Sn-1(t+1)=α0S0(t)+α1S1(t)+…+αn-1Sn-1(t)
Crittografia
© Antini Gianni, 2000
Una prima proprietà che deve soddisfare il registro è la
seguente:
Definizione: Il registro si dice a periodo massimo se la
sequenza si ripete dopo 2n-1 cicli.
Se si associa al generatore il suo polinomio caratteristico si ha:
p(x)=α0+α1x+…+αn-1xn-1+xn
dove x è una variabile binaria.
Teorema: Si ha periodo massimo se il polinomio caratteristico è
un polinomio primitivo (o di Marsenne).
Il polinomi di Marsenne sono tabulati, ad esempio si ha:
(a) x17+x12+1
Æ Periodo 13072
(b) x607+x273+1
ÆPeriodo 10183
Il numero di atomi
dell’universo è stimato 1080
Crittografia
© Antini Gianni, 2000
Crittoanalisi
Un sistema di questo tipo è del tutto inadeguato alle esigenze
della crittografia moderna. Supponiamo infatti che la spia
abbia la possibilità di accedere al registro e utilizzi un suo
plain text e valuti il corrispondente cipher text. Si ha:
S0(t+n)=α0S0(t)+α1S0(t+1)+…+αn-1S0(t+n-1) [#]
Se la spia una un certo mi vede come è fatto ci, ma:
So(i)=mi⊕ci
Usando la [#] è possibile scrivere un sistema lineare di n
equazioni in n incognite che può essere facilmente risolto.
La spia ha calcolato la chiave segreta, il cifrario è rotto!
Crittografia
© Antini Gianni, 2000
L’uso di generatori non lineari mette al sicuro da questo tipo di
attacchi. Ad esempio:
R1
R1
Output
R1
R1
Dove R1,…,R4 sono registri lineari.
Tuttavia il background matematico sui registri non lineari (o
caotici) è ancora troppo piccolo per “fidarsi” troppo. La storia
della crittografia suggerisce di procedere con i piedi di
piombo!
Crittografia
© Antini Gianni, 2000
CRITTOSISTEMI SIMMETRICI
Gli utenti che utilizzano tale cifrari devono condividere un
segreto, rappresentato dalla chiave di cifratura / decifratura.
Le lingue scritte sono un esempio di cifrario simmetrico; in
questo caso le persone coinvolte condividono il segreto della
cultura che ha portato a imparare quella certa lingua.
E’ prassi comune che la comunità sappia tutto sul cifrario, in
modo che la sicurezza dipenda SOLO dalla chiave.
In ambiente militare, tuttora, si aggiunge a questa sicurezza la
non diffusione del cifrario.
Crittografia
© Antini Gianni, 2000
Alice e Bob sono diventati e personaggi più famosi in campo
crittografico, Tom è invece la migliore spia del mondo.
Si ha:
Alice
ek(M)
Canale non
sicuro
Bob
dk(M)
Canale sicuro
k
La prima critica che si può fare è questa:
Se Alice e Bob hanno ha disposizione un “canale sicuro” che
bisogno hanno di usare un canale insicuro? La crittografia
asimmetrica è la risposta a questo quesito.
Crittografia
© Antini Gianni, 2000
DES
Il DES è uno standard crittografico del NBS (diventato NIST).
Inventato dall’IBM è stato poi modificato dall’NSA prima di
diventare standard. Questo ha causato molte critiche per il
fatto che le S-Box usate sembrano contenere trap-door che
permettono facilmente all’NSA di forzare qualsiasi
comunicazione. Nessuno tuttora ha dimostrato questa
congettura.
Esso utilizza chiavi a 64 bit, ma 8 di essi non dei pariry bit,
quindi lo spazio delle chiavi ha cardinalità 256.
Il DES è già stato forzato molte volte con attacchi brute force,
ad esempio mediante l’uso di programmi per distribuire in rete
l’enorme calcolo.
Crittografia
© Antini Gianni, 2000
RC5 (Rivest, 1994)
Progettato da Rivest è un © della RSA. E’ un cifrario a blocchi
parametrico in cui si ha:
•
w - Lunghezza della parola, w>0
•
r - Numero di iterazioni, ∈[0,255]
•
t - Lunghezza della chiave, ∈[0,255]
La parte non lineare del cifrario consiste in rotazioni datadepending e non da S-Box (non molto amate da Rivest).
Vengono usate come operazioni fondamentali le seguenti:
•
+
Addizione mod 2w (senza riporto).
•
⊕
XOR bitwise
•
<<<
Rotazione ciclica a sinistra.
Crittografia
© Antini Gianni, 2000
Fase 1- Espansione della chiave:
Viene costruita una tabella di 2(r+1) parole binarie. Nel fare
ciò vengono usate due costanti “magiche”:
Pw=Odd[(e-2)2w]
Qw=Odd[(Φ-1)2w]
dove Odd(x) è l’intero più vicino a x, e è la base dei logaritmi
naturali e Φ è il numero aureo (1+√5)/2=1.6180…
Nota:
•
a Φ sono legati i numeri di Fibonacci.
•
Φ interviene nella Teoria del Caos, dove sembra essere il numero più caotico che
esista.
•
Φ è il rapporto fra la diagonale e il lato del pentagono regolare.
Crittografia
© Antini Gianni, 2000
1. La chiave k[0…b-1] di b byte viene convertita in parole di w
bit Æ L[0…c-1] dove c= 8b/w
2. Esegui la procedura:
for i=b-i downto 0 do L[i/u]=(L[i/u]<<<8)+k[i]
inizializzazione
3. Creazione di una tabella S:
s[0]=Pw
for i=1 to t=2(r+1) do S[i]=S[i-1]+Qw
i=j=A=B=0
per 3*max(t,c) fai
A=S[i]=(S[i]+A+B) <<< 3
espansione
vera e propria
B=L[j]=(L[j]+A+B) <<< (A+B)
i=(i+1) mod t
j=(j+1) mod c
Crittografia
© Antini Gianni, 2000
L’input consiste in due registri A e B di w bit, l’output consiste nei medesimi
due registri.
Cifratura:
A = A+S[0]
B = B+S[1]
for i=1 to r do
A = ( (A⊕B)<<<B ) + S[2*i]
B = ( (B⊕A)<<<A ) + S[2*i+1]
Decifratura:
for i=r downto 1 do
B = ( (B-S[2*i+1]>>>A)⊕A
A = ( (A-S[2*i])>>>B)⊕B
B = B-S[1]
A = A-S[0]
Crittografia
© Antini Gianni, 2000
BlowFish (Bruce Schneier, 1994)
Il cifrario consiste in una Feistel Network che itera una
funzione di codifica 16 volte. Il blocco è di 64 bit e la chiave
può arrivare a 448 bit.
Si hanno due fasi:
1-
Espansione della chiave:
Si passa da 448 bit a 4168 bit. Una particolarità di
questo algoritmo è che l’espansione è effettuata
usando BlowFish stesso.
2-
Codifica vera e propria.
Crittografia
© Antini Gianni, 2000
Codifica. Può essere schematizzata da:
Plain Text
Funzione F
64
P1
Addizione mod 232
32
F
S1
32
8
S2
32
8
S3
32
S4
32
8
P2
32
F
32
8
32
P16
32
P18
F
32
P17
64
Cipher Text
+
+
32
Le S-Box sono composte
Da 256 parole di 32 bit ciascuna
Crittografia
© Antini Gianni, 2000
Decodifica: La fase di decodifica è identica a quella di
codifica, eccetto che per l’uso inverso delle sottochiavi.
Espansione della chiave: Viene fatta utilizzando l’algoritmo
BlowFish stesso, opportunamente inizializzato.
1. P1=0x243f6a88 P2=0x85a308d3 P3=0x13198a2e P4=0x03707344 e così
via per tutti i Pi e tutte le entrate delle S-Box. Schneier non vincola ad usare
necessariamente le cifre di π (come in questo caso) ma consiglia di usare una
stringa costante indipendente da BlowFish e possibilmente calcolabile “in
loco”.
2. Fare lo xor fra i primi 32 bit della chiave k e P1, i secondi 32 bit con P2, …
continuare, eventualmente fino a P14. Ripetere il passo 2 con i restanti Pi.
3. Codificare 64 “0” con BlowFish e gli attuali Pi e Sj.
4. Sostituire P1 e P2 con l’output di BlowFish del passo 3.
5. Codificare l’output del passo 3 con BlowFish.
6. Sostituire P3 e P4 con l’output di BlowFish del passo 5.
7. Continuare fino alla modifica di tutti i Pi e di tutte le S-Box.
Crittografia
© Antini Gianni, 2000
Schneier consiglia i crittoanalisti di utilizzare versioni ridotte di
BlowFish, ad esempio con meno round, al fine di valutarne
l’affidabilità crittografica.
La CounterPane (società di Schneier) e Dr. Jobbs hanno
offerto diverse migliaia di dollari a chi rompe BlowFish. Tuttora
nessuno è stato in grado di forzare versioni con più di 3 round.
Crittografia
© Antini Gianni, 2000
AES
Il NIST ha dichiarato che lo standard DES (anche nella
versione Triple-DES) non potrà più essere rinnovato dopo
il Dicembre 1998. A tale scopo è stato istituito un concorso
internazionale con lo scopo di trovare un nuovo algoritmo
non coperto da copyright che dovrà diventare il nuovo
standard.
Anche al fine di non suscitare sospetti la NSA non è stata
coinvolta nel concorso e tutte le valutazioni sono “alla luce
del sole”.
www.nist.gov/aes
Il NIST è stato molto esigente riguardo i requisiti di
candidatura. Fra di essi troviamo:
Crittografia
© Antini Gianni, 2000
1. L’algoritmo deve essere di tipo Block-cipher.
2. L’algoritmo deve implementare un cifrario a chiave
simmetrica
3. La chiave deve essere compresa fra 128 e 256 bit.
4. Deve essere possibile l’implementazione su smart card
(quindi deve accedere a risorse di calcolo limitate).
Molti fra i più grandi esperti mondiali si sono cimentati nella
sfida, ma solo 15 algoritmi sono stati accettati per il 1°
Round di prove. Fra di essi sono usciti i seguenti finalisti.
MARS
IBM
RIJNDAEL
J. Daemen, V. Rijmen
RC6
Rivest – RSA Laboratories
SERPENT
R. Anderson, E. Biham, L. Knudsen
TwoFish
B. Schneier e altri.
Crittografia
© Antini Gianni, 2000
Crittografia ASIMMETRICA
Whitfield Diffie e Martin Hellman nel 1976 introdussero un
nuovo concetto di crittografia in un articolo che è diventato
storico. Praticamente la loro intuizione andavo contro tutti i
canoni della crittografia stessa: cifrare con una chiave
conosciuta da tutti. La loro idea si basava sulle funzioni oneway trapdoor.
Crittografia
© Antini Gianni, 2000
Definizione: Una funzione f si dice one-way se
∀x il calcolo computazionale di y=f(x) è
semplice (∈P) mentre il calcolo di x=f-1(y) è
computazionalmente difficile (∈NP).
Definizione: Una funzione one-way è detta
trapdoor se il calcolo x=f-1(y) può essere reso
facile qualora si conoscano informazioni
aggiuntive (private).
Crittografia
© Antini Gianni, 2000
Formalmente in un sistema crittografico a chiave pubblica è
composto da due chiavi, una pubblica, nota a chiunque e una
privata, nota solo al suo possessore. In tal modo la fase di
cifratura avviene utilizzando la chiave pubblica mentre la
decifratura avviene utilizzando la chiave privata.
Se un sistema critt. Asimmetrico soddisfa la seguente
proprietà:
dk(ek(M))=M
Si dice sicuro mentre se soddisfa la seguente:
ek(dk(M))=M
Si dice che garantisce autenticità.
Crittografia
© Antini Gianni, 2000
Sicurezza: Alice vuole comunicare con Bob in modo sicuro.
1. Alice ottiene la chiave pubblica di Bob, ad esempio su
appositi server container.
2. Alice calcola il cipher text y=ekBob(M) e lo spedisce a Bob.
3. Bob legge il messaggio di Alice calcolando M=dkBob(y).
4. Nel caso in cui Tom sia in ascolto non ha alcun modo di
decifrare il messaggio y, in quanto per farlo dovrebbe
avere accesso a dkBob(), che però è privata e quindi non
transita sulla rete.
Crittografia
© Antini Gianni, 2000
Autenticità: Alice vuole spedire un messaggio M a Bob in
modo che Bob sia sicuro che lo abbia spedito Alice.
1. Alice calcola la firma digitale del messaggio M usando una
hash-funcion, H=h(M).
2. Alice calcola F=dkAlice(H) e spedisce a Bob la coppia (F,M)
3. Bob legge il messaggio M, calcola il suo digest H*=h(M).
4. Bob verifica che il messaggio sia stato spedito
effettivamente da Alice verificando che ekAlice(H*)=F. Se la
verifica ha successo Bob è sicuro che il messaggio sia
stato spedito da Alice in quanto nessun altro avrebbe
potuto calcolare F.
Naturalmente è possibile unire sicurezza ad autenticità. Lo
schema che segue chiarisce meglio questo fatto.
Crittografia
© Antini Gianni, 2000
Chiave pubblica
Messaggio falso
(non di Alice)
Chiave privata
No
Alice
M
Bob
ekBob(M)
HF
Alice
Alice
Yes
F
ekBob(M)
F
=
Bob
HF
M
Bob
Messaggio
di Alice
Crittografia
© Antini Gianni, 2000
Nonostante l’intuizione di Diffie e Helman, tutti i loro sforzi per
cercare una funzione one-way trapdoor furono vani. Furono
infatti tre ricercatori del MIT a trovarne una.
Di essi uno era un matematico puro (Adlemann), laureato
sulla Teoria dei Numeri, l’altro un crittoanalista (Shamir) e
infine un algoritmico (Rivest) dalla mente veramente feconda.
Rivest sfornava quasi quotidianamente funzioni candidate, ma
puntualmente Adlemann e Shamir trovavano pecche che le
rendevano inutilizzabili. Infine un notte del 1977 Rivest pensò
ad una funzione in cui Adlemann e Shamir non trovarono
nessun difetto.
Era nato il cifrario RSA. Era nata la crittografia a chiave
pubblica moderna.
Crittografia
© Antini Gianni, 2000
Il cifrario RSA (1977)
Progettato da Ron Rivest, Adi Shanir e Leonard Adlemann il
cifrario è stato brevettato e quindi non può essere utilizzato
senza il permesso della RSA inc.
Idea base: Dati due numeri primi p e q (molto grandi) p facile
calcolare il prodotto n=pq, mentre è molto difficile calcolare la
fattorizzazione di n (NP). Per avere sicurezza occorre che p e
q siano almeno di 200 cifre decimali.
I migliori algoritmi di fattorizzazione attualmente disponibili
(Quadratic Sieve, Elliptic Curve Method, Euristica ρ di Pollard,
ecc.) hanno tutti una complessità dell’ordine di:
(
Oe
ln( n ) ln(ln( n ))
)
Crittografia
© Antini Gianni, 2000
Se p e q sono di 200 cifre decimali ciascuno allora n=pq è di
400 digit, cioè dell’ordine di 10400, da cui:
O(.)=e79=1034
Da cui l’intrattabilità.
Algoritmo (RSA):
1.
Calcola due primi grandi p e q e quindi n=pq.
2.
Calcola la funzione toziente di Eulero ϕ(n)=(p-1)(q-1)
3.
Scegli un numero 0<e<ϕ(n) t.c. MCD(e,ϕ(n))=1, ed esempio prendi e primo
come il 4° numero di Fermat (e=10001)
4.
Calcola d t.c. ed=1 mod ϕ(n) Ù d=e-1 mod ϕ(n).
5.
Definisci la chiave pubblica come (e,n).
6.
Definisci la chiave privata come (d,n).
7.
La funzione di cifratura è ek(x)=xe mod n.
8.
La funzione di decifratura è dk(x)=yd mod n.
Crittografia
© Antini Gianni, 2000
Fatti (Correttezza di RSA):
• Un Teorema di Teoria dei Numeri assicura che le
congruenze della forma x=y-1 mod ϕ(n) hanno un’unica
soluzione quindi ∃! d t.c. ed=1 mod ϕ(n).
• Occorre provare che dk(ek(M))=M:
dk(ek(M))=(Me)d mod n = Med mod n = M mod n = M
Si noti che RSA gode della notevole proprietà:
dk(ek(M))=ek(dk(M))
E quindi può essere usato come sistema che garantisce
sicurezza ed autenticità.
Crittografia
© Antini Gianni, 2000
RSA è particolarmente lento (circa 6000 volte rispetto a
BlowFish) quindi viene usato in un modo particolare.
M
Cifrario
Simmetrico
Ck(M)
Output
(Ck(M), eBob(k))
eBob(k)
Chiave di cifratura
k
Generatore di
numeri casuali
RSA
Chiave pubblica
di Bob
Praticamente RSA critta solamente la chiave di cifratura
utilizzata dal cifrario simmetrico. Tale chiave viene generata in
modo random OGNI volta che si cifra un messaggio.
Crittografia
© Antini Gianni, 2000
Come trova numeri primi grandi
Un problema relativamente facile è quello di trovare numeri
primi molto grandi, come richiesto da RSA.
I test di primalità utilizzati sono tutti di tipo probabilistico in
quanto quelli deterministici sono troppo lenti.
Definizione (Alg. Monte Carlo): Un alg. Monte Carlo “yesbiased” è un alg. Probabilistico per un problema di decisione
in cui la risposta “si” è sempre corretta mentre la risposta “no”
può essere inesatta con probabilità fissata ε. Analogamente
sono definiti gli algortmi Monte Carlo “no-biased”.
Sia A un alg. Monte Carlo “no-biased” con ε=1/2 e sia x un numero candidato.
Quello che si fa è eseguire A(x) n volte. Se l’algoritmo risponde “no” anche una
sola volta il numero è sicuramente composto, mentre se risponde sempre “si”, la
probabilità che il numero sia primo è:
P=1-2-n
Se n=100 si ha P=1-8•10-31.
Crittografia
© Antini Gianni, 2000
Algoritmo di Miller-Rabin
E’ l’algoritmo probabilistico di test di primalità migliore finora
conosciuto. Esso ha una complessità si O(log n)3.
Miller-Rabin(n,t) // t=parametro di sicurezza.
1.
Set n-1=2sr con r dispari
2.
For i=1 to t do
2.1 scegli a caso a t.c. 2≤a≤n-2
2.2 calcola y=ar mod n
2.3 if y≠1 and y≠n-1 esegui
2.3.1 j=1
2.3.2 while ( (j≤s-1) and (y≠n-1) )
y=y2 mod n
se y=1 ritorna “composito”
j++
se y≠n-1 ritorna “composito”
3. Ritorna “PRIMO”
Crittografia
© Antini Gianni, 2000
E’ facile trovare numeri primi?
Nonostante l’efficienza nel testare se un numero sia primo o
meno resta l’incognita che i numeri primi siano “pochi” e
quindi difficili da scovare.
Teorema (dei numeri primi):
Sia π(n) la funzione di distribuzione dei numeri primi, cioè il
numero di numeri primi che precedono n. Allora essa soddisfa
il seguente:
π ( n)
=1
lim
n →∞ n
ln n
Quindi se si cerca un numero primo di 100 cifre occorre
verificare “solo” ln(10100)=230 numeri consecutivi.
Crittografia
© Antini Gianni, 2000
Scambio di chiavi di DIFFIE-HELLMAN
Qualora due utenti di una rete necessitino di un modo sicuro
per scambiarsi una chiave privata di cifratura, possono
usare il protocollo di Diffie-Hellman.
Vengono stabiliti, per tutti, i numeri n e g tali che 1<g<n.
1.
Alice sceglie un grande numero x e calcola:
X = gx mod n
2.
Bob sceglie un grande numero y e calcola:
Y = gy mod n
•
Alice spedisce a Bob X, mentre Bob spedisce ad Alice Y.
•
Alice calcola K = Yx mod n = (gy)x mod n = gxy mod n
•
Bob calcola K’ = Xy mod n = (gx)y mod n = gxy mod n
•
Se tutto è andato bene K=K’. Questa chiave K può essere usata in uno
schema di cifratura simmetrico.
Crittografia
© Antini Gianni, 2000
Sicurezza dello schema di Diffie-Hellman
• Se Tom è in ascolto non vede mai transitare la chiave di
cifratura K. L’unico modo che ha di calcolarla è conoscere o x
o y che però vengono tenute segrete.
• In via teorica è possibile calcolare x da X, come x=loggX e
y=loggY. Tuttavia questo calcolo è computazionalmente
intrattabile sui campi finiti.
• La scelta di n e di g è abbastanza delicata. Infatti nonostante
il calcolo di un logaritmo discreto sia difficile nel caso generale
nessuno ci assicura che non esistano classi in cui tale calcolo
diventa polinomiale. Tali classi sono state trovate anche dove
non ce ne dovrebbe essere. Il calcolo rimane difficile se:
n deve essere un numero primo (di almeno 1024 bits), così come (n-1)/2.
g deve essere una radice primitiva modulo n.
Crittografia
© Antini Gianni, 2000
Diffie-Hellman di conferenza
Lo schema di Diffie-Hellman può essere esteso per
permettere a più utenti di condividere una stessa chiave di
cifratura. Facciamo un esempio con tre persone:
1.
Alice sceglie un grande x e calcola: X = gx mod n
2.
Bob sceglie un grande y e calcola: Y = gy mod n
3.
Carol sceglie un grande z e calcola: Z = gz mod n
4.
Alice spedisce X a Bob, Bob spedisce Y a Carol, Carol spedisce Z a Alice.
5.
Alice calcola Z’=Zx mod n, Bob calcola X’=Xy mod n,Carol calcola Y’=Yz mod n
6.
Alice spedisce Y’ a Bob, Bob spedisce X’ a Carol e Carol spedisce Y’ a Alice
7.
Alice calcola k = Y’x mod n
8.
Bob calcola k = Z’y mod n
9.
Carol calcola k = X’z mod n
10. La chiave k può essere usata fra Alice, Bob e Carol come chiave di
cifratura/decifratura in un crittosistema simmetrico.
Crittografia
© Antini Gianni, 2000
Crittosistema di ElGamal
Può essere considerato una variante di Diffie-Hellman ed è
tutt’oggi molto utilizzato; ad esempio le ultime versioni di PGP
usano questo schema.
E’ stato dimostrato formalmente che la rottura di ElGamal
equivale alla rottura di Diffie-Hellman, in quanto si basa sulla
difficoltà di calcolo del logaritmo discreto su campi finiti.
In aggiunta a Diffie-Hellman, lo schema di ElGamal può
essere utilizzato anche per la cifratura/decifratura e per
garantire autenticità.
Crittografia
© Antini Gianni, 2000
Creazione delle chiavi. Ogni utente del sistema deve:
1. Genera un numero primo molto grande p e un
generatore α del campo finito moltiplicativo Zp*.
2. Scegli un numero casuale a, con 1≤a≤p-2 e calcola
αa mod p
3. La chiave pubblica è la tripla (p,α,αa), la chiave privata
è a.
Si noti che se i valori p e α sono comuni e fissati per gli utenti,
la chiave privata diventa più maneggevole, essendo
composta dal solo αa.
Crittografia
© Antini Gianni, 2000
Nota (sui gruppi finiti moltiplicativi):
Un gruppo (S,⊕) è un insieme S con un operazione binaria ⊕,
definita su S che ha le seguenti proprietà:
1. Chiusura: ∀a,b∈S si ha a⊕b∈S.
2. Identità: ∃e∈S t.c. e⊕a=a⊕e=a ∀a∈S.
3. Associatività: ∀a,b,c∈S si ha (a⊕b)⊕c=a⊕(b⊕c)
4. Reciproco o opposto: ∀a∈S ∃! b∈S t.c. a⊕b=b⊕a=e
Se vale anche la proprietà commutativa il gruppo si dice
abeliano.
Teorema: Il gruppo finito (Zp,.) o Zp* è un gruppo abeliano.
I gruppi finiti Zp* in cui p è primo sono detti anche gruppi di
Galois e sono importantissimi in crittografia.
Crittografia
© Antini Gianni, 2000
Un generatore (o elemento primitivo) α per il gruppo di Galois
Zp* è un numero ∈Zp* t.c. applicando ricorsivamente
l’operazione di moltiplicazione (mod p) si ottengono tutti gli
elementi del campo.
In altre parole per un generatore α accade:
<α>={αk mod p , k>0}=Zp*
Teorema 1: Un campo Zn* ammette generatori sse n=2, 4, pk,
2pk dove p è primo ≥1.
Si noti che i campi di Galois ammettono generatori.
Teorema 2: Sia α un genratore di Zn*. Allora b=αi mod n è
ancora un generatore sse MCD(i,ϕ(i))=1. Inoltre in numero di
generatori è ϕ(ϕ(i)).
Esistono efficienti algoritmi per il calcolo dei generatori di Zp*.
Crittografia
© Antini Gianni, 2000
Cifratura:
1. Trasforma il messaggio M come un numero da 0 a p-1
2. Genera un numero casuale k t.c. 1≤k≤p-2
3. Calcola x=αk mod p e y=M(αa)k mod p
4. Spedisci il testo cifrato (x,y).
Decifratura:
1. Usa la chiave privata “a” per calcolare xp-1-a=x-a=α-ak
2. Ricostruisci il messaggio M tramite il calcolo (x-a)y mod p,
infatti (x-a)y=α-akMα-ak=M.
Si noti che un evidente difetto dello schema di ElGamal è il
raddoppio del ciphertext rispetto al plaintext.
Crittografia
© Antini Gianni, 2000
Esempio: p=2357 α=2 a=1751.
αa mod p = 21751 mop 2357 = 1185
La chiave pubblica è (2357,2,1185)
Sia M=2035 il messaggio e k=1520 il numero casuale, si ha:
x=21520 mod 2357 = 1430, y=2035 11851520 mod 2357=697
Il messaggio spedito è quindi (1430,697).
Per ricostruire il messaggio originale si calcola:
xp-1-a=1430605 mod 2357 = 872
M=872 697 mod 2357 = 2035.
Crittografia
© Antini Gianni, 2000
Crittografia PROBABILISTICA (Cenni)
Dovuta a Silvio Micali e Shafi Goldwasser (entrambi del MIT),
la crittografia probabilistica è uno dei campi attuali di ricerca.
La definizione di sicurezza alla Shannon è troppo stringente,
infatti essa presuppone che l’avversario non sia in grado di
trarre informazioni sul plaintext, dato il ciphertext, avendo a
disposizione una macchina infinita. Come primo corollario di
ciò si ha che la lunghezza della chiave deve essere almeno
quella del plaintext.
La crittografia probabilistica introduce nuovi concetti di
sicurezza.
Crittografia
© Antini Gianni, 2000
Definizione: Un crittosistema a chiave pubblica si dice
polinomialmente sicuro se dati due plaintext m1 e m2 ed i
rispettivi ciphertext c(m1) e c(m2), non è possibile distinguere,
in tempo polinomiale:
m1
m2
?
C(m)1
C(m)2
con probabilità maggiore di ½.
Intuitivamente il ciphertext non fornisce nessuna informazione
parziale sul plaintext se si fanno calcoli polinomiali. In altre
parole è una riformulazione polinomiale della sicurezza alla
Shannon.
Nota: Tutti i calcolatori moderni lavorano in tempo
polinomiale. Anche i calcolatori paralleli non possono essere
assimilati ad una macchina di Turing non deterministica.
Crittografia
© Antini Gianni, 2000
I due migliori algoritmi di crittografia probabilistica sono:
ÎAlgoritmo di Goldwasser-Micali, basato sull’intrattabilità dei
residui quadratici.
ÎAlgoritmo di Blum-Goldwasser, basato sull’intrattabilità della
fattorizzazione. Esso utilizza, fra l’altro, il generatore di bit
pseudocasuali Blum-Blum-Shub, considerato il migliore per
ora conosciuto, i cui bit vengono messi a ⊕ con i bit del
plaintext.
Maggiori dettagli possono essere trovati in:
ÆHandbook of Applied Cryptography – A. Menezes, P. van
Oorschot, S. Vanstone.
ÆArticoli originali degli autori.
Funzioni HASH
Teoria e utilizzo nei
sistemi crittografici
© Gianni Antini, 2000
Hash Funcion
© Antini Gianni, 2000
Definizioni Generali
h
X
Z
Una funzione Hash h calcola il valore z=h(x) per x in X. Di
solito card(X)>>card(Z), ad esempio si ha X a 1024 bit
e Z a 128 bit. Il valore z=h(x) prende il nome di digest.
Addirittura l’insieme X può essere un intero file di cui
viene calcolato il digest. In tal caso quindi si ha una
card(X)=8*file_length.
2
Hash Funcion
© Antini Gianni, 2000
Def. Dati due x e x’ t.c. x≠x’. Se h(x)=h(x’) si dice che la
coppia (x,x’) è una collisione per h.
Def. (Sicurezza debole): h è debolmente priva di collisioni
se, dato un messaggio x, è computazionalmente
inammissibile trovare un x’ t.c. x≠x’ e h(x)=h( x’).
Def. (Sicurezza forte): h è fortemente sicura se è
computazionalmente inammissibile trovare due x e x’
t.c. x≠x’ e h(x)=h( x’).
Def. (One-way): h è one-way se, dato un digest z e’
computazionalmente inammissibile trovare x t.c.
z=h(x).
3
Hash Funcion
Teorema:
Sicurezza forte
© Antini Gianni, 2000
Î one-way
Î Sicurezza debole
Nonostante il background matematico sulle funzioni hash,
è molto difficile dimostrare analiticamente che una data
funzione h() soddisfi le proprietà enunciate. Quello che
accade è che una funzione hash è considerata sicura
finché qualcuno non trova un meccanismo per
produrre collisioni (MD4).
La scelta della cardinalità dell’insieme Z è un fattore
molto importante nella progettazione di una funzione
hash. Infatti se essa è troppo piccola si corre il pericolo
di cadere vittime dell’attacco del compleanno.
Viceversa una cardinalità grande può rendere vana la
motivazione per cui è stata costruita la funzione hash.
4
Hash Funcion
© Antini Gianni, 2000
Attacco del compleanno
Sia h:XÆZ e sia |X|=m, |Z|=n. Si fa l’ipotesi che |X|≥2|Z|.
Si noti che questa ipotesi non è affatto restrittiva, infatti
basta che il digest sia più piccolo di almeno un bit
rispetto a |X|.
Si scelgono a caso k elementi di X e vi valuta la
probabilità di avere collisioni.
z1 : arbitraria
z2 : P(z2≠z1)=1-P(z2=z1)1-1/n
z3 : P(z3≠z2, z3≠z1 | z1≠z2)=…=1-2/n
:
:
5
Hash Funcion
© Antini Gianni, 2000
P(non avere collisioni) =
k −1
i
−
(
1
)
∏
k
i =1
Tenendo conto che e-x≈1-x (Taylor) si ha:
k −1
= ∏e
i
−
n
=e
−
1
n
k −1
∏i
i =1
=e
−
k ( k −1)
2n
i =1
Da cui:
k ( k −1)
−
P(avere almeno 1 collisione)=ε= 1-e 2 n
 1 
≈
Î k

2n ln
1− ε 
6
Hash Funcion
© Antini Gianni, 2000
Nel paradosso del compleanno si ha:
ε=0.5 n=365 k=22.3
da cui la formulazione.
Esempio:
Sia |Z|=240, ε=0.5. Sia ha k≈1.000.000
Æ Si ha probabilità ½ di trovare almeno una
collisione scegliendo 106 valori casuali (limite
computazionale facilmente raggiungibile).
Sia |Z|=2128, ε=0.5. Sia ha k≈2 1019 da cui la
sicurezza computazionale.
7
Hash Funcion
© Antini Gianni, 2000
Si noti che la sicurezza computazionale menzionata non
implica che non sia possibile trovare usa strategia per
provocare facilmente collisioni. Ad esempio:
Hans Dobbertin – MD4 is not collision free
1995
Ha mostrato una ingegnosa tecnica che, di fatto, ha rotto
tale funzione.
Rivest, il progettista di MD4, intravedendone
la debolezza aveva già pubblicato una nuova
hash-function, chiamata MD5,
computazionalmente molto più sicura.
8
Ron Rivest - MIT
Hash Funcion
© Antini Gianni, 2000
SHS
(Secure Hash Standard)
Nel 1992 il NIST (Nation Institute of Standard
and Tecnology) ha introdotto una nuova
funzione hash chiamata SHS/0,
successivamente modificata, nel 1994, con il
nome di SHS/1.
Si tratta di una hash-function standardizzata e
libera (non protetta da copyright).
9
Hash Funcion
© Antini Gianni, 2000
La principali caratteristiche sono:
–
–
–
–
Progettata per architetture Big-Endian (vedi
processori SPARC).
Produce un digest di 160 bit.
Lavora su blocchi di 512 bit.
Nonostante sia più lenta di MD5, essa viene
considerata più sicura.
Il modello di lavoro su blocchi di 512 bit (introdotto da
Rivest) è diventato una consuetudine per quasi tutte
le hash-function.
10
Hash Funcion
© Antini Gianni, 2000
1 0 0
Messaggio x
………
0
64 bit = |x|
|M| = 0 mod 512 [1]
Si crea un buffer in cui si mette il messaggio di cui si vuole
calcolare il digest, quindi un singolo 1. Seguono un numero
di zeri tali che l’equazione [1] sia soddisfatta. Per finire
vengono accodati 64 bit rappresentativi della lunghezza del
messaggio x. Se |x|>264 vengono considerati i primi 264 bit.
Il blocco M viene diviso in sottoblocchi di 512 bit ciascuno.
Ognuno di questi sottoblocchi viene elaborato
separatamente.
11
Hash Funcion
© Antini Gianni, 2000
Elaborazioni di un singolo sottoblocco (SHS/0)
Il sottoblocco viene suddiviso in 16 word da 32 bit.
(2) Queste 16 word sono le prime di un array x di 80
word da 32 bit ciascuna.
(3) Si ha una espansione da 16 a 80 word, tramite la
seguente procedura:
for k=16 to 79
x[k]=x[k-3] ⊕ x[k-8] ⊕ x[k-14] ⊕ x[k-16]
(4) Inizializza 5 word H0, H1, H2, H3, H4 e H5 tramite le
seguenti costanti:
H0=0x67452301 H1=0xefcdab89 H2=0x98badcfe
H3=0x10325476 H4=0xcbd2e1f0
Si noti che l’inizializzazione viene fatta solo per il
primo sottoblocco, per gli altri vengono utilizzati gli
Hi in uscita.
(1)
12
Hash Funcion
© Antini Gianni, 2000
(5) Esegui:
A=H0, B=H1, C=H2, D=H3, E=H4, F=H5
for t=0 to 79
temp = (A <<5)+ft(B,C,D)+E+x[t]+kt
E=D, D=C, C=B<<30, B=A, A=temp
H0=H0+A, H1=H1+B, H2=H2+C, H3=H3+D
H4=H4+E, H5=H5+F
(6) Finito l’ultimo sottoblocco, il valore a 160 bit:
H0H1H2H3H4H5
è il digest.
13
Hash Funcion
© Antini Gianni, 2000
Le funzioni citate sono:
ft(B,C,D) =
kt =
14
(B & C) | (!B) & D)
B^C^D
(B & C) | (B & D) | (C & D)
B^C^D
0x5a827999
0x6ed9eba1
0x8f1bbcdc
0xca62c1d6
0≤t≤19
20≤t≤39
40≤t≤59
69≤t≤79
0≤t≤19
20≤t≤39
40≤t≤59
69≤t≤79
Hash Funcion
© Antini Gianni, 2000
SHS/1
Nel 1994 il NIST ha attuato una modifica dello
standard, facendo proprie varie segnalazioni
apportate dai crittoanalisti e dall’NSA.
Fu modificata la fase di espansione del sottoblocco,
Introducendo una rotazione circolare a sinistra,
praticamente:
for k=16 to 79
x[k]=( x[k-3] ⊕ x[k-8] ⊕ x[k-14] ⊕ x[k-16] ) <<< 1
Nota: Nei linguaggi (Java), o processori (smart card),
in cui non esiste tale operazione è possibile
sostituirla da:
(x<<<n) Ù (x<<n)|(x>>32-n)
15
Shift semplice
Rotazione
Hash Funcion
© Antini Gianni, 2000
TIGER
Progettata da Ross Anderson e Eli Biham, Tiger è una
hash-function ottimizzata per i processori di nuova
generazione (64 bit), ma discretamente veloce
anche su processori da 32 e 16 bit.
Anderson e Biham sostengono che le hash-function
MD5-type, fra cui anche SHS, mal si adattano ai
nuovi processori. Inoltre, essendo tutte strutturate in
maniera analoga, non dovrebbe mancare molto alla
loro crittoanalisi definitiva utilizzando, ad esempio,
attacchi Dobbertin-Type. A sostegno di ciò, c’è da
dire che alcuni autori hanno crittoanalizzato MD5
con meno round.
16
Hash Funcion
© Antini Gianni, 2000
La principali caratteristiche sono:
–
–
–
–
Progettata per architetture Little-Endian (vedi DEC
ALPHA) a 64 bit.
Produce un digest di 192 bit in modo da essere
considerata sicura verso gli attacchi del compleanno
ancora per molti anni.
Lavora su blocchi di 512 bit in modo analogo a
SHS.
Vengono utilizzate 4 S-Box di espansione altamente
non lineari e sicuramente prive di trapdoor, in
quanto viene fornito l’algoritmo per calcolarle*.
(*) Critiche al DES.
17
Hash Funcion
© Antini Gianni, 2000
La struttura del blocco è la stessa di SHS, ma è più comodo
vedere il buffer come da destra a sinistra*.
0
………
0 0 1
64 bit = |x|
Messaggio x
|M| = 0 mod 512
(*) Questo risolve un problema implementativo che ho incontrato.
Dato che normalmente si lavora con i byte, quando si
introduce il singolo “1”, occorre fare un append del valore
0x01, mentre in SHS del valore 0x80.
18
Hash Funcion
© Antini Gianni, 2000
Dato che la hash-function è ottimizzata per processori
a 64 bit, tutti i risultati parziali sono di questa
lunghezza. Questo può provocare inefficienze nei
linguaggi privi di dati predefiniti a 64 bit. In Java si
usano i “long”.
Tiger esegue le seguenti istruzioni per ogni blocco di
512 bit (8 word).
i.
Inizializza:
a = 0x0123456789abcdef
b = 0xfedcba9876543210
c = 0xf096a5b4c3b2e187
ii.
Suddividi il blocco in 8 word da 64 bit ciascuna:
x[i] per i=0,…,7 (ricordarsi dell’architettura LE)
19
Hash Funcion
iii.
© Antini Gianni, 2000
Esegui quindi
save(a,b,c)
pass(a,b,c,5)
key_schedule
pass(c,a,b,7)
key_schedule
pass(b,c,a,9)
feed_forward
dove:
Æ save(a,b,c)
aa=a, bb=b, cc=c
20
Hash Funcion
© Antini Gianni, 2000
Æ pass(a,b,c,mul)
round(a,b,c,x[0],mul)
round(b,c,a,x[1],mul)
round(c,a,b,x[2],mul)
round(a,b,c,x[3],mul)
round(b,c,a,x[1],mul)
round(c,a,b,x[2],mul)
round(a,b,c,x[0],mul)
round(b,c,a,x[1],mul)
Æ round(a,b,c,x,mul)
c^=x
a-=t1[c_0]^ t2[c_2]^ t3[c_4]^ t4[c_6]
b-=t4[c_1]^ t5[c_3]^ t2[c_5]^ t1[c_7]
b*=mul
C_i è l’i-esimo byte di c (sono 8 i byte di c)
21
Hash Funcion
© Antini Gianni, 2000
key_schedule
x[0]-=x[7]^0xa5a5a5a5a5a5a5a5
x[1]^=x[0]
x[2]+=x[1]
x[3]-=x[2]^( !x[1] << 19 ) x[4]^=x[3]
x[5]+=x[4]
x[6]-=x[5]^( !x[4] >>23 )
x[7]^=x[6]
x[0]+=x[7]
x[1]-=x[0]^( !x[7] << 19 ) x[2]^=x[1]
x[3]+=x[2]
x[4]-=x[3]^( !x[2] >>23 )
x[5]^=x[4]
x[6]+=x[5]
x[7]-=x[6]^0x0123456789abcdef
feed_forward
a^=aa
22
b-=bb
c+=cc
Hash Funcion
© Antini Gianni, 2000
A questo punto se ci sono altri 512 bit da trattare si
riesegue l’algoritmo (senza inizializzazione delle
variabili) altrimenti il digest è formato dalla
giustapposizione di:
a||b||c
Nota:
Nel passo round() vengono utilizzate le 4 S-Box, t1,
t2, t3 e t4. Esse sono 4 tabelle di 256 long ognuna:
0
1
2
:
:
Il byte c_i viene usato per selezionare
la riga della tabella. Il valore di uscita
è la word di 64 bit contenuta nella
cella.
255
Complessivamente si è realizzata una
espansione di un fattore 4.
64 bit
23
Hash Funcion
© Antini Gianni, 2000
Note conclusive sulla sicurezza di Tiger:
Gli autori congetturano le seguenti:
1. La non linearità è dovuta essenzialmente alle SBox. Questo dovrebbe aiutare a resistere ad
attacchi di crittoanalisi differenziale di tipo BihamShamir.
2. Tiger dovrebbe resistere bene ad attacchi
Dobbertin’s differential.
3. La complessità minima per trovare una
retroimmagine dovrebbe aggirarsi su O(296).
24
Riferimenti bibliografici
Riferimenti cartacei e
elettronici sugli
argomenti trattati.
© Gianni Antini, 2000
© Antini Gianni, 2000
• Una trattazione a carattere algoritmico può essere trovata in:
ÆApplied Cryptography – Bruce Schneier – John Wiley e Son
ÆHandbook of Applied Cryptography – A. Menezes, P. van
Oorschot and S. Vanstone, CRC Press
• Di carattere decisamente più teorico:
ÆDoug R. Stinson – Cryptography: Theory and Pratice –
CRC Press, 1995
• Ancora più teoriche sono le seguenti dispense della Prof.sa
Goldwasser del MIT
ÆLecture Notes on Cryptography – Shafi Goldwasser, Mihir
Bellare – June 1997
© Antini Gianni, 2000
•Fra i siti in cui trovare informazioni cito
Æhttp://theory.lcs.mit.edu/
ed in particolare:
http://theory.lcs.mit.edu/~rivest/
in cui è possibile trovare anche una enorme pagina di link.
Scarica

Introduzione alla crittografia - Dipartimento di Ingegneria dell