Pag 1/5 Esercizi sull`uso della crittologia a chiave asimmetrica o PKI

Commenti

Transcript

Pag 1/5 Esercizi sull`uso della crittologia a chiave asimmetrica o PKI
Naso Michele
Esercizi sull’uso della crittologia a chiave asimmetrica o PKI (Public Key Infrastructured)
La crittologia nel paradigma PKI si fonda sulla costruzione di 2 chiavi una pubblica,Kpu, nota a
tutti e una privata, Kpr, no sulla complessità computazionale della fattorizzazione di numeri con
molte cifre, oltre 70 cifre, e del calcolo del logaritmo discreto. La cifratura di un messaggio,m, in
chiaro avviene applicando una funzione che ha come argomenti il messaggio m e la chiave Kpu per
ottenere il messaggio cifrato mc nel modo seguente: mc=f(m,Kpu). La decifratura del messaggio
avviene utilizzando la stessa funzione avente come argomenti mc e Kpr e cioè m=f(mc,Kpr) ta
solamente a chi genera e quindi proprietario delle chiavi. Il suddetto schema fonda la sua robustezza
sulla complessità computazionale del logaritmo discreto e della fattorizzazione di numeri di elevato
valore.
Il problema è come generare le 2 chiavi
Lo schema generale possiamo rappresentarlo attraverso la seguente sequenza:
1.
2.
3.
4.
Si prendano 2 numeri primi p e q e si calcoli n=p*q
Si calcoli g=(p-1)(q-1)
Si scelga un numero e primo con g, cioènon divisibile per g
Si calcoli un numero d, funzione inversa di e,tale che e*d mod g =1
L’operatore modulo, mod, calcola il resto della divisione tra 2 numeri naturali; nello schema
indicato calcola il resto della divisione tra e*d e g.
Dei passi sopra indicati quello più complicato è il 4 a tale scopo ci viene incontro il teorema esteso
del calcolo del massimo comune divisore di Euclide. Euclide dice che il massimo comune divisore
tra 2 numeri m ed n, con m>n, deve essere anche un divisore tra n e r,resto, se n non è divisibile per
m altrimenti è n stesso il MCD,massimo comune divisore.
Infatti sappiamo che m=q*n+r dove q è il quoziente, per cui possiamo affermare che se r è diverso
da 0 allora MCM deve dividere anche r per cui possiamo trovare il MCD tra n ed r ché ha un grado
di complessità computazionale più basso.
Esempio: sia m=18 ed n=5
Applichiamo il procedimento di Euclide:
poiché 18 non è divisibile per 5 e sapendo che 18=3*5+3 la ricerca del MCD la facciamo
sostituendo n ad m ed r ad n cioè m=n;n=r.
Segue i valori correnti di m ed n saranno m=5 ed n=r;
Ancora poiché 5 non è divisibile per 2 e 5=1*3+2 continuiamo la ricerca utilizzando m=3 e n=2;
Ancora 3 non è divisibile per 2 e poiché 3=1*2+1 avremo m=2 e n=1
Infine 2 è divisibile per 1 ,2=2*1+0 per cui, MCD=1
Riassumendo avremo:
MCD(18,5)=MCD(5,3)
MCD(5,3)=MCD(3,2)
MCD(3,2)=MCD(2,1)
MCD(2,1)=1
Per transitività MCD(18,5)=MCD(2,1)=1
Il teorema di Euclide esteso ci consente di trovare d del passo 4 dello schema sopra indicato: per
spiegarlo usiamo una tabella : Esempio dato g=27 trovare e ed d.
Pag 1/5
Naso Michele
Le condizioni iniziali sono :
y0 =0 e x0 =1, y1 =1 e x1 =0 e yn =qn-1 *yn-1 +yn-2 ; xn =qn-1 *xn-1 +xn-2
Con i pedici indichiamo il passo o step del processo che stiamo eseguendo.
m=g ;n=e per l’esempio in oggetto e potrebbe essere 5 dal momento che 5 non è divisibile per 27
per cui abbiamo al passo 0
Step
0
m=
q*n +r
========== ============
y
x
0
1
1
27
5*5+2
1
0
2
5
2*2+1
5=5*1+0
1=5*0+1
3
2
2*1+0
11
2
L’algoritmo termina nello step ove il resto corrente diventa 0 ;
0
========== ============
0
1
1
27
5*5+2
1
0
2
5
2*2+1
5=5*1+0
1=5*0+1
3
2
2*1+0
11
2
Il suddetto metodo gode della proprietà che:
v y*e-x*m=MCD oppure x*m-y*e=MCD
Nel nostro esempio abbiamo y*e=55 e m*x=54 ed il MCD(m,e)=1 per cui siamo nel primo caso e
quindi d=y, nel nostro caso d=11 infatti d*e mod m=55 mod 27=1.
Nel secondo caso avremmo che d=g-y.
Facciamo un esempio del secondo caso: Supponiamo di calcolare i due numeri che soddisfano la
proprietà d*e mod m con m=47
In base a quanto detto sopra possiamo porre e=11 essendo 11 primo rispetto a 47 e quindi
applichiamo Eulero esteso
Step
0
m=
q*n +r
========== ============
y
x
0
1
1
47
4*11+3
1
0
2
11
3*3+2
4
1
3
3
1*2+1
13
3
4
2
2*1+0
17
4
Osserviamo che y*e=17*11=187 e m*x=47*4=188 pertanto siamo nel secondo caso per cui
d=m- y=47-17=30
Verifichiamo che d*e=30*11=330 e quindi 330 mod 47 =1
Adesso che abbiamo imparato come calcolare la chiavi possiamo fare un esempio di completo:
Pag 2/5
Naso Michele
Supponiamo di voler cifrare il messaggio m=4 , il messaggio è una sequenza di bit che possiamo
rappresentare con un numero naturale,con il metodo PKI.
1.
2.
3.
4.
5.
Scegliamo p e q primi per esempio p=3 e q=11
Calcoliamo n=p*q;n=33
Calcoliamo g=(p-1)(q-1)=2*10=20
Scegliamo e=7 difatti 7 è primo rispetto a 20
Applichiamo Euclide esteso, tra g ed e, per ricavare d
Step
0
m=
q*n +r
========== ============
y
x
0
1
1
20
2*7+6
1
0
2
7
1*6+1
2
1
3
6
6*1+0
3
1
d=3 infatti e*d mod g = 3*7 mod 20=21 mod 20=1
La cifratura del messaggio avviene applicando la seguente funzione:
1. mc=m e mod n
nel nostro esempio avremo mc=4 7 mod 33=16
La decifratura del messaggio avviene applicando la seguente funzione:
2. m=mc d mod n
nel nostro esempio m = 16 3 mod 33=4
Osserviamo che in rete possiamo intercettare mc che sappiamo essere ottenuto dalla formula 1 e che
dalla conoscenza di e, chiave pubblica, e di mc non è facilmente calcolare m per la difficoltà
computazionale del logaritmo discreto.
Inoltre, la conoscenza della sola chiave pubblica e non ci consente di ricavare m e oltre a ciò
difficilmente ci permette di calcolare d, poiché non conosciamo g, che è la sola chiave che ci
permette di tornare al messaggio in chiaro.
È chiaro che, la complessità computazionale aumenta in funzione del valore dei numeri primi scelti
in partenza.
Le cose funzionano bene se il messaggio possiamo rappresentarlo con un valore minore di n;
pertanto il messaggio deve essere diviso in gruppi di bit dato dalla seguente
formula:NumeroDiBit=log2 n. Se, per esempio, n=1025 allora dalla formula ricaviamo che il
messaggio dovrà essere diviso in blocchi da 10 bit riempiendolo con bit non significativi nel caso in
cui l’intero messaggio non sia divisibile per il numero di bit indicato. m=1025-1=1024 e
log2 1024=10
Il vero problema è quello di trovare un numero primo grande a piacere, sappiamo da Euclide che
sono infiniti ma non si conoscono al momento algoritmi che ci permettano di ottenerle, abbiamo
solo algoritmi che ci permettono di affermare solamente se un numero è primo ma non come
generarli.
Nell’estate del 2005 tre matematici indiani, Manindra Agrawal, Beerai Kayar e Nitin Safena hanno
trovato un metodo, il metodo AKS dalle loro iniziali per trovare velocemente numeri primi di valore
elevato, l’algoritmo lo tengono ben segreto visto l’importanza per le operazioni di cifratura in una
rete insicura come Internet. Prima della scoperta annunciata dai tre matematici indiani il più grande
Pag 3/5
Naso Michele
numero primo trovato aveva 7.816.230 cifre!! Scoperto nel febbraio del 2005 da Martin Novak
scienziato tedesco.
Nella Tabella troviamo un esempio di verifica su quanto asserito.
Chiave Chiave Privata
d
Pubblica
e
3
7
N
33
Messaggio Messaggio cifrato
Messaggio
e
in chiaro
mc=m mod n
decifrato
d
m
m=mc mod n
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
1
8
27
31
26
18
13
17
3
10
11
12
19
5
9
4
29
24
28
14
21
22
23
30
16
20
15
7
2
6
25
32
0
1
8
27
31
1
2
#NUM!
#NUM!
#NUM!
6
7
8
9
10
11
12
13
14
15
16
#NUM!
#NUM!
#NUM!
20
21
22
23
#NUM!
25
26
27
28
29
30
#NUM!
#NUM!
0
1
2
#NUM!
#NUM!
#NUM : Immissione di una formula che restituisce un numero che non è possibile rappresentare
perché troppo grande o troppo piccolo. Pertanto il problema non è dell’algoritmo bensì delle risorse
di calcolo!!
Osserviamo che quando il messaggio m>=n si perde la corrispondenza tra messaggio in chiaro e
messaggio decifrato come indicato sopra
Pag 4/5
Naso Michele
L’algoritmo indicato inizialmente è noto in letteratura con il nome RSA dalle iniziali degli autori,
Rivest Sha,mir e Adleman.
Nele suddetto algoritmo la chiave pubblica, Kpu, sarà data dalla coppia (e,n) mentre la chiave
privata,Kpr, dalla coppia (d,n).
Algoritmo di Merkle-Hellman detto anche cifrario del fusto
Questo algoritmo come il precedente prevede il partizionamento del messaggio in segmenti di
lunghezza arbitraria n. L’algoritmo genera un processo che si sviluppa nei segmenti passi.
1. Si genera una sequenza S supercrescente di n elementi. Una sequenza è supercrescente
quando ogni elemento è maggiore della somma dei due elementi che lo procedono.
Ovviamente per i primi due elementi basta che siano ordinati in modo crescente.
2. Si fissi un numero g>2*sn cioè maggiore del doppio dell’ultimo elemento.
3. Si trovino due numeri e, d con la condizione e*d mod g =1. A tale scopo come sappiamo ci
viene incontro il teorema di Eulero esteso.
4. Si generi un vettore K=d*S mod g; K che assieme ad n costituisce la chiave pubblica
5. Chi deve mandare un messaggio prende n bit che possiamo considerare come una sequenza
M e ne facciamo il prodotto scalare con K per cui avremo mc=K*M che costituisce il
segmento di messaggio cifrato che viene inviato in rete
6. Il ricevente calcola mc * =mc e mod g
7. Trovato mc * si consulta la sequenza S e si selezionano gli elementi la cui somma da mc * e
si ricostruisce il messaggio trasmesso mettendo 1 in corrispondenza degli elementi
selezionati e 0 in corrispondenza di quelli non selezionati.
8. La chiave privata è formata da A,e,g
Esempio: Generiamo una la chiave pubblica e privata per trasmettere in modo segreto segmenti di
messaggio di lunghezza 5; per cui n=5;
a)
b)
c)
d)
Generiamo una sequenza supercrescente S lunga 5: Per esempio S=(1,5,7,15,24)
In accordo al punto 2 scegliamo g=49;
Con l’ausilio di Euclide esteso troviamo e=5 e d=10 infoatto e*d mod g ossia 50 mod 40=1
Generiamo la chiave pubblica K=10*S mod 49 ottenendo K=(10,1,21,3,44); infatti 10*1
mod 49=10, 10*5 mod 49=1, 10*7 mod 49 =21, 10*15 mod 49=3 ed infine 10*24 mod 49
=44 :possiamo divulgare K assieme ad n al mondo. Kpu(K,n)
e) Supponendo che il segmento di messaggio da trasmettere sia M=(10110),calcoliamo mc
=K*M, sommando i prodotti tra gli elementi corrispondenti avremo mc=10+0+21+3+0=34
che è il valore inviato
f) Il ricevente calcolerà mc* =e*mc mod 49=5*34 mod 49=23
g) Consultando la sequenza S ricaviamo che 23 è dato dalla somma del primo, terzo e quarto
elemento per cui in accordo al punto 7 avremo 10110 cioè il messaggio in chiaro.
Pag 5/5