PRIMAVERA IN BICOCCA 1. Numeri primi e fattorizzazione Una delle applicazioni più rilevanti della Teoria dei Numeri si ha nel campo della crittografia. In queste note vogliamo delineare, in particolare, il metodo di crittografia a chiave pubblica RSA, che prende il nome dai suoi ideatori Rivest, Shamir e Adleman. Da un punto di vista matematico, la crittografia a chiave pubblica si basa sull’idea di individuare una funzione che sia invertibile ma, mentre la funzione individuata deve essere facile da calcolare, la sua inversa deve essere invece molto difficile da calcolare. È per certi versi sorprendente che una funzione con queste proprietà sia la funzione che, dati due numeri primi, ne restituisce il loro prodotto. Per capire meglio il senso di questa affermazione ci mettiamo in un contesto leggermente più generale. Ricordiamo intanto la definizione di numero primo. Definizione. Un numero naturale p, diverso da 0 e da 1, si dice primo se gli unici interi positivi per cui è divisibile sono 1 e p. Esempio. Sono numeri primi 2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31 . . . Il più grande numero primo finora (gennaio 2014) conosciuto è 257885161 −1, scoperto nel 2013. Questo numero ha 17425170 cifre decimali. È noto fin dall’antichità che i numeri primi sono infiniti e hanno un ruolo centrale nell’aritmetica perchè permettono di costruire, attraverso la moltiplicazione, tutti i numeri interi. Più precisamente: Teorema (Teorema della Fattorizzazione Unica). Ogni numero intero n, maggiore o uguale a 2, si scrive come prodotto di potenze di numeri primi, cioè n = pt11 pt22 · · · ptss con p1 , p2 , . . . , ps numeri primi distinti, t1 , . . . , ts interi positivi. Questa scrittura è unica a meno dell’ordine, cioè i primi p1 , . . . , ps e gli esponenti t1 , · · · ts sono univocamente determinati da n. Esempio. La fattorizzazione di 1500 è 22 · 3 · 53 . La fattorizzazione di 26094 è 2 · 3 · 4349. Supponiamo ora che ci venga dato un numero N che sappiamo essere il prodotto di due numeri primi distinti p e q (dunque N = p · q) e ci venga chiesto, conoscendo solo N , di determinare p e q. Un modo di procedere è di dividere N per 2, 3, 4, . . . N − 1 fin quando non troviamo un fattore di N . Quante divisioni √ dobbiamo fare? Se N = p · q allora p e q non possono essere entrambi maggiori di N , altrimenti il loro prodotto √ sarebbe maggiore di N . Quindi, se supponiamo che sia p < q , abbiamo che p ≤ N . Il punto cruciale per la crittografia è che, se N è abbastanza grande, il numero di divisioni che dobbiamo provare è talmente elevato che, con la attuale potenza di calcolo dei computer, non possiamo dare una risposta al problema in un tempo ragionevole. Il 1 2 PRIMAVERA IN BICOCCA metodo delle divisioni è certamente poco efficiente, ma anche con i metodi teorici più efficienti a disposizione, e con le attuali risorse di calcolo, il problema di fattorizzare numeri grandi è in pratica impossibile. Per darvi una idea dell’ordine di grandezza del numero N = p · q impiegato in crittografia, lo standard di sicurezza, considerato solido almeno fino al 2030, prevede di utilizzare un numero N dell’ordine di 10600 . La società RSA Security ha lanciato, nel 1991, una sfida (RSA Factoring Challenge) pubblicando una lista di numeri della forma N = p · q, e promettendo un premio in denaro per chi fosse riuscito a fattorizzarli. La sfida si è conclusa nel 2007. Il più piccolo numero della lista aveva 100 cifre decimali ed è stato fattorizzato in pochi giorni, ma molti altri non sono stati ancora fattorizzati (il più piccolo dei quali ha 190 cifre decimali). La funzione invertibile che è facile da calcolare, ma la cui inversa è difficile da calcolare, è quindi la funzione che, dati due numeri primi p e q, ci restituisce il loro prodotto N = p · q. 2. Massimo comun divisore e moduli Siano a e b due numeri interi, che per semplicità supponiamo entrambi positivi. Possiamo considerare il loro massimo comun divisore, che indichiamo con M CD(a, b). Sia a che b sono multipli del loro massimo comun divisore. Inoltre i divisori di M CD(a, b) sono tutti e soli i divisori comuni tra a e b. Come si calcola il massimo comun divisore tra a e b? Un modo è quello di utilizzare la fattorizzazione in prodotto di numeri primi di a e b. Un altro modo, che per quello che segue è più utile, è usare l’algoritmo di Euclide (o algoritmo delle divisioni successive). Vediamolo su un esempio. Prendiamo a = 1218 e b = 132 e vogliamo calcolare il loro massimo comun divisore. 1218 = 132 · 9 + 30 132 = 30 · 4 + 12 30 = 12 · 2 + 6 12 = 6 · 2 + 0 a = bq1 + r1 b = r1 q2 + r2 r1 = r2 q3 + r3 r2 = r3 q4 + 0 Il massimo comun divisore tra 1218 e 132 è l’ultimo resto non nullo nel procedimento delle divisioni successive. Un’altra informazione che otteniamo dall’algoritmo di Euclide, è che esistono due interi s e t per cui M CD(a, b) = a · s + b · t. Riprendiamo il nostro esempio che riscriviamo, per maggior chiarezza, nella colonna di sinistra, usando la lettera a per 1218 e la lettera b per 132. Nella colonna di destra, partendo dalla prima divisione, isoliamo il resto. Inoltre in ciascuna delle equazioni di destra, a partire dalla seconda, sostituiamo le precedenti. a = b · 9 + 30 b = 30 · 4 + 12 30 = 12 · 2 + 6 30 = a − 9b 12 = b − 4 · 30 = b − 4(a − 9b) = 37b − 4a 6 = 30 − 2 · 12 = (a − 9b) − 2(37b − 4a) = = 9a − 83b PRIMAVERA IN BICOCCA 3 Dunque abbiamo ottenuto che 6 = 1218 · 9 − 132 · 83, ovvero una possibile scelta per gli interi s e t che cercavamo è s = 9 e t = −83. Naturalmente questa non è l’unica possibilità, perchè se k è un qualunque intero, allora 6 = (9 − kb)a + (−83 + ka)b. Più in generale, se M CD(a, b) = as + bt, allora è vero anche che M CD(a, b) = a(s − kb) + b(t + ka). Introduciamo adesso l’aritmetica dei moduli (o aritmetica dell’orologio). Si tratta di un concetto che ci è familiare. Comincio dunque con un esempio. Consideriamo un orologio con 24 ore che indichiamo con 0, . . . 23. Se adesso sono le 15 e ci venisse chiesto che ore sono tra 22 ore, cosa faremmo per rispondere? Quello che faremmo è sommare 15 + 22 = 37, dividere (divisione con resto) 37 per 24, ottenendo 37 = 24 · 1 + 13 e considerare il resto ottenuto, cioè 13. Quindi se adesso sono le 15, tra 22 ore sono le 13. Ancora un esempio. Se partiamo dall’ora 0, dopo 55 ore che ore sono? Di nuovo quello che facciamo è dividere 55 per 24, 55 = 24 · 2 + 7 e considerare il resto. Dunque, dopo 55 ore sono le 7. L’aritmetica dei moduli generalizza questo esempio dal caso di un orologio con 24 ore al caso di un orologio con n di ore, dove n ≥ 1 è un naturale. Vediamolo ancora su un esempio. Se n = 7 stiamo considerando un orologio con 7 ore, che indichiamo con 0, 1, 2, 3, 4, 5 e 6. Se adesso sono le 5, per sapere che ore sono tra 4 ore quello che facciamo è sommare 5 + 4 = 9, dividere 9 per 7 ottenendo 9 = 7 · 1 + 2, e dunque tra 4 ore sono le 2. Esattamente lo stesso procedimento che abbiamo usato prima, nel caso di un orologio di 24 ore. Nel linguaggio matematico l’aritmetica su un orologio con 7 ore è l’aritmetica modulo 7. In simboli scriviamo che 5 + 4 mod 7 = 2. Allo stesso modo se partiamo dalle ore 0, e vogliamo sapere che ore sono dopo 89 ore, dividiamo 89 per 7 e ne prendiamo il resto. Abbiamo dunque 89 = 7 · 12 + 5 e scriviamo 89 mod 7 = 5. Analogamente al caso della somma, se vogliamo calcolare 5·4 mod 7, calcoliamo 5·4 = 20, dividiamo il risultato per 7 e ne consideriamo il resto, dunque 5 · 4 mod 7 = 6. Una proprietà del prodotto modulo 7 ci permette semplificare i conti. Per esempio, se vogliamo calcolare 89 · 145 mod 7, sappiamo che dobbiamo calcolare 89 · 143 = 12727 e poi dividere il risultato per 7, 12727 = 7 · 1818 + 1, ottenendo che 89 · 143 mod 7 = 12727 mod 7 = 1. Avremmo potuto anche calcolare separatamente 89 mod 7 = 5 e 143 mod 7 = 3 e poi (5 · 3) mod 7 = 15 mod 7 = 1. In modo analogo si può ragionare per la somma. In generale, se n ≥ 1 è un naturale fissato e a è un numero intero (che per semplicità supponiamo positivo) definiamo a mod n come il resto r che otteniamo dividendo a per n. Osserviamo che il resto nella divisione per n è sempre compreso tra 0 e n − 1. Come negli esempi precedenti possiamo definire somma o prodotto di a e b modulo n come, rispettivamente, la somma o il prodotto usuali di a e b seguiti dalla divisione per n. Come negli esempi se vogliamo calcolare, per esempio, il prodotto a · b mod n possiamo calcolare a mod n = r1 e b mod n = r2 e poi il prodotto r1 · r2 mod n. Lo stesso vale per la somma. 4 PRIMAVERA IN BICOCCA 3. La funzione di Eulero Un ruolo cruciale per la descrizione dell’algoritmo RSA è giocato dalla funzione ϕ di Eulero. Vediamo come è definita. La funzione ϕ ha come dominio l’insieme N \ {0} e come codominio N, dunque ϕ : N \ {0} → N. In 1 poniamo che la funzione valga 1, cioè poniamo che ϕ(1) = 1. Se n è un numero naturale maggiore o uguale a 2, per definire ϕ(n) consideriamo l’insieme A di tutti i numeri naturali k che soddisfano queste due proprietà: 1) 1 ≤ k ≤ n; 2) il massimo comun divisore tra k e n è uguale a 1. Allora il valore di ϕ in n è uguale al numero di elementi dell’insieme A. La definizione sembra complicata ma vediamola su qualche esempio. Esempio. Consideriamo n = 8. L’insieme A è l’insieme di tutti i numeri naturali k che soddisfano le due proprietà: 1) 1 ≤ k ≤ 8; 2) il massimo comun divisore tra k e 8 è uguale a 1. Allora otteniamo A = {1, 3, 5, 7} e il numero di elementi di A è 4, dunque ϕ(8) = |A| = 4. Esempio. Consideriamo n = 24. L’insieme A è l’insieme di tutti i numeri naturali k che soddisfano le due proprietà: 1) 1 ≤ k ≤ 24; 2) il massimo comun divisore tra k e 24 è uguale a 1. Allora otteniamo A = {1, 5, 7, 11, 13, 17, 19, 23} e il numero di elementi di A è 8, dunque ϕ(24) = |A| = 8. Esempio. Consideriamo n = 11. L’insieme A è l’insieme di tutti i numeri naturali k che soddisfano le due proprietà: 1) 1 ≤ k ≤ 11; 2) il massimo comun divisore tra k e 11 è uguale a 1. Allora otteniamo A = {1, 2, 3, 5, 6, 7, 8, 9, 10} e il numero di elementi di A è 10, dunque ϕ(11) = |A| = 10. Adesso abbiamo capito come è definita la funzione di Eulero, ma, riguardando l’ultimo esempio, abbiamo anche una informazione in più su come calcolarla. Infatti nell’ultimo esempio, n = 11 è un numero primo. Allora è facile capire come è fatto l’insieme A. Siccome gli unici divisori di 11 sono 1 e 11, comunque scelgo k con 1 ≤ k ≤ 10, risulta che il massimo comun divisore tra k e 11 è uguale a 1. Quindi l’insieme A contiene tutti PRIMAVERA IN BICOCCA 5 gli interi tra 1 e 10. Questo ragionamento vale più in generale. Se p è un numero primo allora A = {k : 1 ≤ k ≤ p − 1, M CD(k, p) = 1} dunque ϕ(p) = |A| = p − 1. Facciamo un ulteriore passo. Se p è un numero primo e m ≥ 1 un numero intero, abbiamo che A = {k : 1 ≤ k ≤ pm e M CD(k, pm ) = 1} = {1, 2, . . . , pm } \ {p, 2p, 3p, . . . , pm−1 p} dunque ϕ(pm ) = |A| = pm − pm−1 . Per poter calcolare la funzione di Eulero, senza dover elencare ogni volta gli elementi dell’insieme A, abbiamo bisogno di una ulteriore sua proprietà. La enuncio solamente perchè per dimostrarla servono le conoscenze di un corso di Algebra del primo anno di Matematica (ma se deciderete di studiare Matematica lo scoprirete). La proprietà è questa. Se n e m sono numeri naturali con M CD(n, m) = 1 allora ϕ(n·m) = ϕ(n)·ϕ(m). Per esempio se consideriamo 88 = 8 · 11, poichè M CD(8, 11) = 1 abbiamo che ϕ(88) = ϕ(8)ϕ(11) = 4 · 10 = 40. Con le tre proprietà che abbiamo visto, cioè 1) ϕ(p) = p − 1 con p numero primo, 2) ϕ(pm ) = pm − pm−1 con p numero primo, m intero positivo, 3) se M CD(m, n) = 1 allora ϕ(n · m) = ϕ(n) · ϕ(m), possiamo calcolare agevolmente il valore della funzione di Eulero in un qualsiasi numero naturale n ≥ 2. Infatti per il Teorema della Fattorizzazione unica sappiamo che possiamo scrivere n = pt11 pt22 pt33 · · · ptrr con p1 , p2 , . . . pt numeri primi distinti e t1 , . . . tr interi positivi. Poichè M CD(pt11 , pt22 · · · ptrr ) = 1, applicando la proprietà 3) otteniamo ϕ(n) = ϕ(pt11 )ϕ(pt22 pt33 · · · ptrr ). Adesso applichiamo di nuovo la proprietà 3) osservando che M CD(pt22 , pt33 · · · ptrr ) = 1 e dunque ϕ(n) = ϕ(pt11 )ϕ(pt22 )ϕ(pt33 · · · ptrr ). Procedendo in questo modo abbiamo ϕ(n) = ϕ(pt11 )ϕ(pt22 )ϕ(pt33 ) · · · ϕ(ptrr ). Infine per concludere usiamo la proprietà 2) e otteniamo che ϕ(n) = ϕ(pt11 )ϕ(pt22 )ϕ(pt33 ) · · · ϕ(ptrr ) = (pt11 −pt11 −1 )(pt22 −pt22 −1 )(pt33 −pt33 −1 ) · · · (ptrr −prtr −1 ). Esempio. Riprendiamo il secondo esempio di calcolo della funzione di Eulero visto sopra. Abbiamo che 24 = 23 · 3 dunque ϕ(24) = ϕ(23 )ϕ(3) = (23 − 22 )(3 − 1) = 4 · 2 = 8. L’ultimo risultato che ci serve sulla funzione di Eulero è un Teorema (dovuto sempre a Eulero) che enuncio 6 PRIMAVERA IN BICOCCA Teorema (Teorema di Eulero). Siano N un intero con N ≥ 2 e a un numero intero con M CD(a, N ) = 1. Allora aϕ(N ) mod N = 1. Anche qui la dimostrazione richiede delle nozioni di Algebra del primo anno di Matematica. 4. RSA Alice Sceglie due numeri primi p e q con p 6= q. Calcola N = p · q e ϕ(N ) = (p − 1)(q − 1). Sceglie un intero r in modo che M CD(ϕ(N ), r) = 1. Calcola, con l’algoritmo di Euclide, due interi s e t in modo che rs + ϕ(N )t = 1 Pubblica la coppia (N, r) mentre tiene ben segreti p, q, ϕ(N ) e s. Bob Vuole mandare ad Alice il messaggio b, dove b è un numero intero, con 0 < b < N . Per semplicità supponiamo anche che sia M CD(b, N ) = 1. Legge la coppia (N, r) che Alice ha pubblicato, e calcola il numero c = br . Calcola a = c mod N e invia il numero a ad Alice. Riceve il messaggio a da Bob e deve ricostruire il messaggio originale, cioè b. Calcola as mod N e ritrova b. Perchè Alice riesce a ricostruire il messaggio originale di Bob? Il motivo è il Teorema di Eulero che abbiamo citato prima. Infatti b = b1 mod N = brs+ϕ(N )t mod N = brs bϕ(N )t mod N = ((br )s mod N )((bϕ(N ) )t mod N ) = as mod N. Nell’ultimo passaggio abbiamo usato proprio il Teorema di Eulero, che ci assicura che bϕ(N ) mod N = 1, dunque anche (bϕ(N ) )t mod N = 1. Supponiamo adesso che una terza persona, Eva, intercetti il messaggio a che Bob spedisce ad Alice. Se ci mettiamo nei panni di Eva la situazione è questa Alice (N, r) Eva Intercetta il messaggio a che Bob ha spedito ad Alice. Conosce la coppia (N, r) Bob Spedisce il messaggio a ad Alice. PRIMAVERA IN BICOCCA 7 scelta da Alice, perchè Alice l’ha resa pubblica. Per ricostruire il messaggio originale b di Bob, ha bisogno di conoscere l’intero s e poi operare esattamente come fa Alice. È facile per Eva calcolare l’intero s se conosce ϕ(N ). Infatti Eva può applicare l’algoritmo delle divisioni successive. Quindi il problema di Eva è conoscere ϕ(N ) = (p − 1)(q − 1), ovvero conoscere p e q. Eva conosce N = pq ma, se p e q sono numeri primi grandi, da questa informazione non sa ricostruire p e q. Esempio. Vediamo un esempio concreto di funzionamento dell’algoritmo RSA. Supponiamo innanzitutto che a ciascuna lettera dell’alfabeto sia stato associato un numero secondo lo schema seguente A B C D E F G H I L M N O P Q R S T U V Z Spazio 2 3 4 5 6 7 8 9 29 31 12 13 14 37 16 17 18 19 43 21 22 23 Alice sceglie i numeri primi p = 5 e q = 11, calcola N = pq = 55, ϕ(N ) = ϕ(55) = 4 · 10 = 40. Inoltre Alice sceglie un numero r in modo tale che M CD(r, ϕ(N )) = M CD(r, 40) = 1. Nel nostro esempio Alice sceglie r = 37. Poi Alice calcola, tramite l’algoritmo di Euclide, due interi s e t per i quali 1 = 40t + 37s, ottenendo t = −12 e s = 13. Riporto qui i calcoli 40 = 37 · 1 + 3 3 = 40 − 37 37 = 3 · 12 + 1 1 = 37 − 12 · 3 = 37 − 12(40 − 37) = −12 · 40 + 13 · 37. 3=3·1+0 Infine Alice pubblica la coppia (N, r) = (55, 37). Bob legge le informazioni rese pubbliche da Alice e le spedisce il messaggio seguente 26 7 21 9 52 7 52 41 23 28 24 7 18 49 7 8 PRIMAVERA IN BICOCCA Per decifrarlo Alice considera il primo numero 26 e calcola 26s mod N cioè 2613 mod 55. Si tratta quindi di calcolare 2613 , dividerlo per 55 e considerarne il resto. Quello che Alice ottiene è 31. In modo alternativo, Alice può ragionare cosı̀: da 13 = 1 + 4 + 8 segue che 2613 mod 55 = (261 mod 55) · (264 mod 55) · (268 mod 55) 264 mod 55 = 456976 mod 55 = 36 268 mod 55 = 208827064576 mod 55 = 31 2613 mod 55 = 26 · 36 · 31 mod 55 = 29016 mod 55 = 31. Dunque decifrando 26 otteniamo 31 ovvero la lettera L. Facciamo ancora un passo. Consideriamo 7. Alice calcola 713 mod 55 ottenenendo 2. Come prima, in modo alternativo, si poteva ragionare come segue 713 mod 55 = (71 mod 55) · (74 mod 55) · (78 mod 55) 74 mod 55 = 2401 mod 55 = 36 78 mod 55 = 5764801 mod 55 = 31 713 mod 55 = 7 · 36 · 31 mod 55 = 7812 mod 55 = 2. Il messaggio inviato da Bob, alla luce di quanto abbiamo visto, diventa L A 21 9 52 A 52 41 23 28 24 A 18 49 A Se avete voglia, finite di decifrarlo. Referenze Un libro piacevole sullo sviluppo storico crittografia, che delinea anche gli aspetti matematici, è Simon Singh, Codici e Segreti, BUR Biblioteca Universale Rizzoli (1999)