Pag 1/5 Esercizi sull`uso della crittologia a chiave asimmetrica o PKI
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