CRITTOGRAFIA E ARITMETICA MODULARE GIANCARLO RINALDO 1. Introduzione Spesso ci può capitare di sentire domande o affermazioni del tipo: • A cosa serve la matematica? • La matematica ha scoperto tutto ciò che c’era da scoprire! • Io la matematica non la capisco e (quasi) me ne vanto! Se si và un pò più a fondo nel problema si scopre d’altra parte che: • La matematica serve ad esempio a fare una transazione bancaria in tutta sicurezza (Es. Bancomat). • Esistono un insieme di problemi aperti e comprensibilissimi che non sono stati risolti! • La matematica è cultura! Ad esempio studiare la logica matematica permette di formulare più compiutamente un pensiero nella nostra lingua madre. Avere nozioni di probabilità e statistica ci permette di comprendere dati e modellizzare eventi: Siamo ogni giorno tempestati da tabelle e percentuali. Capire l’algebra e la teoria dei numeri ci consente di comprendere la crittografia! 2. Prima lezione: Il codice Cesare e la somma modulare. Il primo metodo per crittografare i messaggi risale a Giulio Cesare (testimonianze in tal senso giungono da Plutarco e Svetonio). Il metodo è piuttosto banale ma utile a noi per 2 motivi: (1) Storico; (2) Ci introduce alle congruenze. Consideriamo il nostro alfabeto (ad es. di 21 lettere) e lo “spostamento” di ogni singola lettera del nostro messaggio originale di 3 posizioni. Esempio 2.1. Messaggio originale: PER SEMPRE TU ED IO Messaggio criptato: SHUVHPSUHZAHGNR 1 2 GIANCARLO RINALDO Può essere utile la seguente tabella: A → D B → E C → F D → G E → H · → · · → · · → · · → · T → Z U → A V → B Z → C Per decriptare dobbiamo fare l’operazione inversa: anche in questo caso la tabella è estremamente utile! Nota 2.2. La funzione di crittazione e dunque anche quella di decriptazione sono funzioni biiettive. Nota 2.3. Questo procedimento a prima vista non sembra aver nulla a che fare con la matematica. Nella prossima sezione vedremo che invece esiste una interpretazione legata ad una particolare aritmetica. 3. Le congruenze mod m. L’insieme Zm . Esistono particolari fenomeni come quelli temporali che hanno una certa “ciclicità”. Ad esempio: (1) Ore del giorno; (2) Giorni della settimana; (3) Note musicali. (1) La venticinquesima ora è la prima del giorno seguente; (2) Il nono giorno è il martedı̀; (3) La nona nota è il RE. Per questi fenomeni l’aritmetica “standard” può non essere sufficiente. Un oggetto che ben rappresenta l’incremento di ognuno di questi “fenomeni” è l’orologio modulare (vedi [4]). Familiarizzamo con l’applicativo. Esempio 3.1. Alla partenza il programma ci chiederà il numero di “ore”. battiamo 7 ed Invio. Dammi le ore 7 CRITTOGRAFIA E ARITMETICA MODULARE 3 A questo punto apparirà il nostro orologio. Possiamo immaginare l’1 come il Lunedı̀, il 2 come il Martedı̀, . . ., lo 0 come la Domenica. Potremmo chiederci qual’è il 23o giorno? Basterà battere a ed inserire 23. Inserisci il valore per a 23 L’orologio avrà il 2 colorato. Cioè l’orologio ha compiuto 3 giri e si è fermato nella seconda posizione che rappresenta il nostro Martedı̀. Come possiamo calcolare l’“ora” d’arrivo senza percorrere il quadrante dell’orologio più volte? Teorema 3.2 (Euclide). Siano a, m ∈ N, a si può esprimere come: a = mq + r, 0 ≤ r ≤ m − 1. Esempio 3.3. Sia a = 23, m = 7 23 = mq + r = 7 · 3 + 2, 0 ≤ 2 ≤ 6. È chiaro che per fare “funzionare” l’orologio ci interessa solo il resto della divisione. Possiamo in generale dire che due numeri sono uguali fissate le ore di un orologio se hanno resto uguale. Cioè ad esempio 2 ≡ 23 mod 7 La congruenza si comporta generalmente bene come l’uguaglianza che già conosciamo. In particolare è anch’essa una relazione di equivalenza. Una nota storica: La definizione del simbolo di congruenza, ≡, e le sue proprietà vennero introdotte da C.F. Gauss agli inizi del XVIII secolo. Definizione 3.4. Si dice che due numeri a, b ∈ N sono congrui modulo m e si scrive a ≡ b mod m se a = mq + r, b = mq 0 + r, 0 ≤ r ≤ m − 1. 4. La somma modulo m Per la criptazione e decriptazione di un messaggio tramite il codice Cesare con la chiave b anche diversa da 3, può essere utile una tabella contenente tutte le possibili corrispondenze tra alfabeto in chiaro e criptato. Una tabella del genere la possiamo facilmente ottenere tramite PariGP (vedi [3]) immettendo il seguente codice: 4 GIANCARLO RINALDO m=21; M=matrix(m,m,i,j,(i+j-1)%m); for(i=1, m, print(M[i,])) Cosa osserviamo? Nella riga i-esima della tabella c’è una traslazione di (i − 1)-posizioni dei numeri da 0 a m − 1 (Codice cesare). Nota 4.1. Si osservi come dato un messaggio criptato mediante il codice Cesare, trovata la decriptazione di una lettera tutte le altre lettere siano automaticamente decriptabili (ad.es. Se A=7 si ottiene B=8, C=9 e cosı̀ via)! Esercizio 4.2. Due ragazzi criptano una frase tramite il codice Cesare. Il resto della classe la decripta. Esercizio 4.3. Sia a = 7, m = 21, si calcoli il valore di −a, cioè a + (−a) ≡ 0 mod 21 Da ora in poi chiameremo c() la nostra funzione di criptazione e d() la funzione di decriptazione. Esercizio 4.4. Che caratteristiche deve avere la funzione di criptazione per essere ben definita? E la funzione di decriptazione? Sia b la chiave a il mio messaggio (un numero ad esempio). Definizione 4.5. La funzione di criptazione è definita come: c(a) := a + b mod m. Dato che d(c(a)) = d(a + b) = a, è sufficiente considerare la funzione d(x) di decriptazione tale che d(x) := x + b0 mod m. 0 dove b è la chiave di decriptazione. Si osservi la seguente relazione: b + b0 ≡ 0 mod m. dove b0 = m − b. 5. Seconda Lezione: Il prodotto modulare Nella precedente lezione si è osservato come il codice Cesare abbia il difetto di “mescolare” poco il nostro alfabeto. E se invece di usare la somma usassimo il prodotto? Cioè se considerassimo la funzione di criptazione c(a) := a · b mod m. Vogliamo osservare se: CRITTOGRAFIA E ARITMETICA MODULARE 5 (1) Ho un migliore “mescolamento”; (2) Per ogni chiave b, la funzione che si ottiene è una “valida” funzione di criptazione. Esercizio 5.1. Sia m = 21 e b = 5. Si calcoli alfabeto di partenza e di arrivo. Osservazioni. Esercizio 5.2. Sia m = 21 e b = 3. Si calcoli alfabeto di partenza e di arrivo. Osservazioni. Esercizio 5.3. Tramite l’orologio modulare: (1) Si fissi m = 21; (2) Si attivi la funzione di colorazione c; (3) Si ponga a = b ∈ {1, . . . , 20}; (4) Si facciano delle somme successive tramite il tasto +. Ripetendo il punto (4) si ottiene al primo passo a + b = 2b. L’orologio assegnerà il risultato in a, al secondo passo a + b = 3b. E cosı̀ via. Si osservi come particolari valori di a = b colorino tutto l’orologio, altri no. Anche per il prodotto si costruisca la tabella contenente tutte le possibili corrispondenze tra l’alfabeto in chiaro e quello criptato. Modificando la tabella della somma in Pari-GP si ottiene: m=21; M=matrix(m,m,b,a,(a*b)%m); for(i=1, m, print(M[i,])) Nota 5.4. Nelle righe b ∈ {3, 6, 7, 9, 12, 14, 15, 18}, si osservi come l’insieme a · b sia un sottoinsieme di {0, . . . , m − 1}. Detto insieme è indotto dal M CD(m, b). Teorema 5.5. Se M CD(b, m) 6= 1 la funzione c(a) := ab mod m. non é invertibile. Il modo più ovvio per ottenere il massimo numero di chiavi è usare m numero primo, con m maggiore uguale al numero di simboli del nostro alfabeto. Ad esempio m = 23. Esercizio 5.6. Due ragazzi criptano una frase con il prodotto modulare. Il resto della classe la decripta. Anche in questo caso in circa 10-15 minuti si potrà decriptare il messaggio. 6 GIANCARLO RINALDO Nota 5.7. Si osservi come, sia nella somma che nel prodotto, la funzione di criptazione abbia agito su ogni singola lettera in modo inpendente dalla posizione. In tal modo la singola lettera x avrà un unico corrispettivo criptato c(x). In effetti per decrittare un qualsiasi messaggio lo strumento fondamentale è l’analisi delle frequenze delle lettere in un testo. Ad esempio nella lingua italiana l’insieme delle vocali “A”, “E” ed “O” hanno una frequenza di oltre il 40% in un testo scritto sul totale delle lettere presenti. Applicando le criptazioni descritte fino a questo punto non vengono nascoste in alcun modo le frequenze delle lettere rendendo banale la decriptazione. Nota 5.8. Si osservi inoltre che un attacco del tipo forza bruta, effettuato mediante la sostituzione di tutte le lettere in tutti i modi possibili, non è effettuabile attraverso l’attuale potenza di calcolo degli elaboratori elettronici. Si dovrebbero infatti effettuare 21! prove, verificando per ognuna di esse se il testo ha significato. Nota 5.9. Si osservi infine che anche questo cifrario soffra di una eccessiva regolarità nell’alfabeto criptato dovutà alla linearità della funzione (se la chiave b = 3 allora c(1) = 3, c(2) = 6, c(3) = 9 e cosı̀ via). 6. Cifrario di Vigenere Per ovviare “parzialmente” al problema osservato nella Nota 5.7 B. de Vigenere (ed anche G.B. Bellaso) nel XVI secolo, inventò un cifrario che venne considerato inattaccabile per tre secoli. Esso è sostanzialmente un codice Cesare esteso. Ecco un esempio del suo funzionamento. Si prenda una parola chiave ad esempio :“MELA” {11, 5, 10, 1} e la frase da criptare, ad esempio: AT T ACCAREIM M EDIAT AM EN T E = {1, 18, 18, 1, 3, 3, 1, 16, 5, 9, 11, 11, 5, 4, 9, 1, 18, 1, 11, 5, 12, 18, 5}. Si sommi la “M” alla prima lettera da criptare, la “E” alla seconda, e cosı̀ via. ATTACCAREIMMEDIATAMENTE+ MELAMELAMELAMELAMELAMEL= NBGBPHMSRPZNRIUBHFZFBBQ Esercizio 6.1. Cosa si nota nella frase criptata? CRITTOGRAFIA E ARITMETICA MODULARE 7 Nota 6.2. Per decriptare un messaggio del genere è necessario dedurre la lunghezza della parola chiave. Questa è identificabile dalla periodicità di alcune lettere nel messaggio cifrato. È chiaro che in questo caso la frase deve essere un pò più lunga per essere decriptata. Il massimo comun divisore n tra le distanze di lettere ripetute (metodo Kasiski 1863), è con elevatà probabilità, la lunghezza della chiave. Una volta trovata la n si può dividere la frase in n parti, ognuna codificata con un codice Cesare distinto. Esercizio 6.3. Decriptare la frase: NEL MEZ ZOD ELC AMM IND INO STR AVI TAM IRI TRO VAI PER 123 123 123 123 123 123 123 123 123 123 123 123 123 123 OGO NGC AQG FNF BOP LPG LPR TVU BAN UCP LTN UTR ZCN QGU UNA SEL VAO SCU RAC HEL ADI RIT TAV IAE RAS MAR RIT A 123 123 123 123 123 123 123 123 123 123 123 123 123 1 VPD TGO ZCR TEA SCF IGO BFN SMZ UCB LCH SCV NCU SMZ B Da quanto detto si può intuire il fondamentale: Teorema 6.4 (Shannon, 1949). Un cifrario la cui chiave è di tipo Vigenere con lunghezza uguale alla lunghezza del messaggio ed usata una sola volta è inattaccabile. Nota 6.5. Si osservi che grazie a questo teorema si sia definito un protocollo di comunicazione tra spie. Si utilizza un quaderno in cui in ogni pagina è presente una chiave abbastanza lunga da contenere un messaggio. La spia utilizzerà la chiave del foglietto una volta e poi la strapperà. Questo metodo è noto come “One Time Pad”. Ovviamente questo metodo non è implementabile tramite protocolli di comunicazione informatici in quanto presupporrebbe un canale sicuro tramite il quale spedire la chiave lunga quanto il messaggio. Ma in questo caso si potrebbe usare il canale sicuro per spedire il messaggio stesso visto che non vi è nessun tipo di guadagno (la lunghezza del messaggio e della chiave sono identiche). 7. Crittografia a chiave pubblica Nel capitolo precente si è studiato il cifrario di Vigenere che si può considerare il capostipite dei cifrari a blocchi. Questi cifrari vengono utilizzati nella crittografia a chiave privata. Dove cioè dalla chiave per crittografare è facile calcolare la chiave per decriptare i messaggi. 8 GIANCARLO RINALDO Un metodo più moderno e più sicuro ma che ha un costo compuazionale più elevato è il cifrario a chiave pubblica. Esso utilizza le funzioni “one way” (a “senso unico”): Definizione 7.1. Una funzione si dice a “senso unico” se: (1) y = f (x) è facile da calcolare; (2) x = f −1 (y) è molto difficile da calcolare. Esempio 7.2. Un esempio di funzione a “senso unico” è la seguente. Sia P = {{p, q} : con p, q numeri primi} e sia M = {p · q : con p, q numeri primi} Si consideri la funzione f (p, q) = p · q. Questa è ovviamente biiettiva ma f (p, q), cioè il prodotto di due numeri primi, è facile da calcolare. Viceversa f −1 (pq), cioè la fattorizzazione di pq nei suoi primi p e q, è problema tutt’altro che banale. Infatti oltre 2000 anni di ricerca nella teoria dei numeri non sono stati sufficienti a dare un metodo “soddisfacente” per la fattorizzazione di un numero dato. In particolare si studierà la crittografia RSA che è appunto legata al problema della fattorizzazione di un numero naturale in numeri primi. Sono necessarie alcune premesse. 8. Alfabeto allargato e cambio di base Si immagini di voler utilizzare un cifrario moltiplicativo (1) c(a) = a · b mod m con m primo, per quanto osservato nella Nota 5.7, per rendere il cifrario più sicuro dobbiamo necessariamente criptare più di una lettera alla volta. Per fare ciò dobbiamo considerare coppie, triple (o più generalmente n-uple) di lettere come un singolo simbolo (numero). Ad esempio, si consideri il messaggio come una sequenza di coppie di lettere. Ogni coppia di lettere una volta tradotta in numero viene criptata tramite la funzione (1). Per cui c(P IP P O) = c(P I + P P + Ot) = c(P I) + c(P P ) + c(Ot) dove + non è altro che il concatenamento delle stringhe. Si osservi che se ho un numero dispari di lettere si dovrà aggiungere uno spazio, come in questo esempio. CRITTOGRAFIA E ARITMETICA MODULARE 9 Allora come codificare le coppie (o n-uple) di lettere in modo naturale? Ci dà un aiuto la notazione posizionale araba. Si osservi la notazione decimale i numeri 15 e 51 hanno diverso significato! 51 = 5 · 101 + 1 · 100 In generale si può considerare un qualsiasi numero in notazione decimale come cn cn−1 . . . c0 = cn · 10n + cn−1 · 10n−1 + · · · + c0 · 100 dove ci sono le cifre, cioé i simboli {0, 1, . . . , 9}. Si potrà quindi sostituire l’insieme {0, 1, . . . , 9} con l’insieme {t, A, B, . . . , Z}. In questo caso si avranno 22 simboli il cui valore sarà t → 0 A → 1 B → 2 C → 3 D → 4 E → 5 F → 6 G → 7 H → 8 I → 9 L → 10 M → 11 N → 12 O → 13 P → 14 Q → 15 R → 16 S → 17 T → 18 U → 19 V → 20 Z → 21 Adottando la notazione posizionale la stringa “AD” diventerà AD = 1 · 221 + 4 · 220 = 26 In generale ogni simbolo del nostro nuovo alfabeto varierà nell’intervallo [0, 21 · 22 + 21 = 483]. 10 GIANCARLO RINALDO Se si vuole utilizzare una chiave b moltiplicativa, per massimizzare il numero di chiavi potenziali (vedi Teorema 5.5), si dovrà utilizzare un alfabeto con un numero di simboli primo. Sfortunatamnte 483 non lo è. Il primo più vicino è 487. Ecco un esempio in Pari GP di criptzione della stringa (sequenza di lettere) “PIPPO ” tramite la chiave b = 5 su un alfabeto allargato di 487 simboli: m=487 Ab=Vec(" ABCDEFGHILMNOPQRSTUVZ") Frase=Vec("PIPPO ") CodFrase=vector(#Frase/2) for(i=1,#Frase,for(j=1,#Ab,if(Ab[j]==Frase[i], CodFrase[i]=j))) CodBlock=vector(#Frase/2) for(i=1,#CodBlock,CodBlock[i]=CodFrase[2*i-1]*22+ CodFrase[2*i]) CodCript=vector(#CodBlock) for(i=1,#CodBlock,CodCript[i]=(CodBlock[i]*5)%m) 9. Numeri primi Da quanto osservato in precedenza il protagonista dei nostri ragionamenti è il numero primo. Ricordiamo che un numero si dice primo se è divisibile solo per se stesso e 1 (Pitagora 500 a.C.) . Quindi sono primi 2, 3, 5, 7, 11, . . . Si osserva dunque che tutti i numeri pari (4, 6, 8, . . .) non sono primi, tutti i multipli di 3 (6, 9, 12, . . .) non sono primi e cosı̀ via. È dunque lecito chiedersi: I numeri primi sono infiniti? Dobbiamo ad Euclide (300 a.C.) il notevole teorema che grazie ad una elegante dimostrazione chiarisce come i numeri primi siano infiniti. Consideriamo i primi 3 numeri primi: 2, 3, 5. Se considero n = 2 · 3 · 5 + 1, è facile osservare che se si divide il numero n per 2, per 3 o per 5 la divisione darà come resto 1. Dunque n sará primo rispetto ai precedenti, dunque un nuovo primo. Se allunghiamo il nostro elenco ed aggiungiamo anche il 7 e consideriamo n = 2 · 3 · 5 · 7 + 1 Anche in questo caso avremo che dividendo n per 2, 3, 5, 7 otterremo 1. Quindi preso un qualsiasi insieme finito di primi è possibile costruirne uno nuovo numero, primo con i precedenti! CRITTOGRAFIA E ARITMETICA MODULARE 11 Dunque se per assurdo ipotizzo che i numeri primi sono p1 , p2 , . . . , pn arrivo alla contraddizione dato che p1 p2 . . . pn + 1 è primo con p1 , è primo con p2 , . . . , è primo con pn . Nota 9.1. In generale non esiste un metodo efficiente per decidere se un numero è primo. Viceversa ne esistono vari per dire se non lo è. Ad esempio tutti i numeri che hanno per ultima cifra un numero pari sono divisibili per 2 dunque non sono primi. Esiste un metodo per calcolare i numeri primi che stanno nell’intervallo da 1 a m. Esso è abbastanza intuitivo. Questo si chiama crivello di Eratostene (200 a.C.). Facciamo un esempio: Abbiamo i numeri da 2 a 20 nell’insieme S S = {2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20}. Al primo passo prendo il primo numero dell’insieme S, il 2 lo inserisco nell’insieme P dei primi, e cancello tutti i multipli di 2 in S. Avrò S1 = {3, 5, 7, 9, 11, 13, 15, 17, 19} Al secondo passo prendo il primo numero dall’insieme S1 , il 3, lo inserisco nell’insieme P dei primi, e cancello tutti i multipli di 3 in S1 . Avrò S2 = {5, 7, 11, 13, 17, 19} A questo punto si osserva che il primo numero dall’insieme S2 , il 5, ha quadrato superiore a 20 dunque il crivello si può fermare. I numeri primi saranno l’unione di P ed S2 P ∪ S2 = {2, 3, 5, 7, 11, 13, 17, 19}. Nota 9.2. Si osservi che calcolare i multipli di 5 sarebbe stato inutile in quanto i multipli 5·a con a < 5 erano stati già cancellati, mentre quelli con a ≥ 5 non appartengono all’insieme! Nota 9.3. Il metodo appena descritto ha un elevato costo computazionale, e tutti i metodi che danno una costruzione certa di uno od una serie di numeri primi hanno una complessità di calcolo analoga a quella del Crivello di Eratostene. 12 GIANCARLO RINALDO È interessante osservare come gli infiniti numeri primi siano distribuiti tra i numeri naturali in modo abbastanza irregolare. Un modo per osservare questa irregolarità è quello di calcolare la distanza tra due numeri primi successivi. P=primes(200) D=vector(#P-1,i,P[i+1]-P[i]) Non sembra esserci nessuna regola! Osservate inoltre come le distanze 2 (legate ai cosiddetti primi gemelli) si diradino ma continuino ad esistere. Questo ci porta ad una questione ancora aperta: Esistono infiniti primi gemelli? 10. Test di primalità Si faccia il seguente esperimento con l’orologio modulare: Esercizio 10.1. Si ponga m =7. Si ponga a = b = 2 e si facciano delle moltiplicazioni successive (tasto *). L’operzione che si stà eseguendo è: 2x mod 7 Si ripeta lo stesso calcolo con a = b = 3. Poi con a = b = 4 e cosı̀ via. Si osserva che per x = 6 o suoi sottomultipli 2x ≡ 1 mod 7 Verifichiamo quanto detto con Pari GP m=7; M=matrix(m,m,i,j,(i^j)%m); for(i=1, m, print(M[i,])) Si può provare con diversi valori di m (primi o meno). Si deduce il seguente Teorema 10.2. Sia m un numero primo allora am−1 ≡ 1 mod m Questo è noto come “piccolo Teorema di Fermat” (XVII secolo), la cui dimostrazione viene data da Eulero il secolo successivo. Nota 10.3. Dato un numero m per verificare se esso è un primo (probabile) usiamo il Teorema 10.2. Scegliamo una base (ad esempio a = 2) la eleviamo ad m − 1, e osserviamo se è congrua a 1 mod m. Se non lo è allora il numero non è primo in caso contrario possiamo verificare per a = 3. Dopo un certo numero di passi il numero è quasi certamente primo. CRITTOGRAFIA E ARITMETICA MODULARE 13 Proviamo alcuni esempi Esempio 10.4. Si verifichi quali tra questi numeri è primo : 3041, 2773, 65537, 4294967297. Per verificare eseguire i seguenti comandi in Pari GP m=65537; a=Mod(2,m); a^(m-1) 11. Potenze modulari Nelle precedenti sezioni si è visto come criptazioni del tipo c(x) = bx + d mod m dette anche cifrari affini siano in generale “deboli” a causa della regolarità della funzione di criptazione. Si comportano invece bene sistemi non lineari quale ad esempio c(x) = xb mod m D’altra parte anche per numeri relativamente piccoli (dove ad esempio a, x, m, sono numeri a 3, 4 cifre) il calcolo di ab mod m è arduo anche con un elaboratore molto potente. Esiste però un metodo estremamente efficiente che ci permette di calcolare le potenze modulari. Sia b = bn bn−1 · · · b0 l’esponente b scritto in base 2, dove bi ∈ {0, 1}, cioè b = b0 + 2b1 + 22 b2 + . . . + 2n−1 bn−1 + 2n bn . Si osservi come 1 +b ab = ab0 +b1 2 1 2 3 n−1 +b 2n n 2 2 +b3 2 +...+bn−1 2 2 3 n−1 ab = ab0 ab1 2 ab2 2 ab3 2 · · · abn−1 2 n abn 2 . Dunque ab = ab0 (ab1 (ab2 (ab3 (· · · (abn−1 (abn )2 )2 · · · )2 )2 )2 . A questo punto si osservi che a2 mod m = (a mod m)(a mod m) 14 GIANCARLO RINALDO ed applicando questa proprietà all’interno delle parentesi quando il valore ottenuto è maggiore o uguale ad m, si perverrà facilmente alla soluzione. Esempio 11.1. 513 mod 97 13 = 1101 13 5 = 51 (50 (51 (51 )2 )2 )2 Sviluppando le parentesi interne si ottiene 25 mod 97 5 · 25 = 125 ≡ 28 282 = 784 ≡ 8 82 = 64 mod 97 mod 97 mod 97 64 · 5 = 320 ≡ 29 mod 97 12. Soluzioni di congruenze lineari Nel caso della crittografia affine c(x) = bx mod b è necessario calcolare b−1 per poter decriptare un messaggio. Questo problema si può ricondurre all risoluzione di una equazione congruenziale del tipo 7x ≡ 1 mod 192. Si osservi che 7 e 192 sono primi tra loro e questo ci assicura che l’equazione ha una soluzione. Risolvere l’equazione congruenziale è equivalente a risolvere l’equazione 7x + 192y = 1 con x ed y numeri interi. Si osservi che 192 − (27)7 = 3 7 − (2)3 = 1 Dunque 1 = 7 − 2(3) 1 = 7 − 2(192 − (27)7) 1 = (55)7 − (2)192. Cioè 7 · 55 ≡ 1 mod 192. Cioè la chiave inversa a a b = 7 è b−1 = 55 modulo 192. CRITTOGRAFIA E ARITMETICA MODULARE 15 13. Piccolo esempio di RSA Bruno vuole mandare ad Anna un messaggio: il numero 4. Prende da internet n = 221, e = 7, numeri per spedire un messaggio ad Anna. 47 = 4(4(4)2 )2 47 = 4(64)2 47 = 4(4096) 4096 = 221(18) + 118; 4(118) = 472 = 2(221) + 30 Anna riceve il messaggio (30). Lei sola (?!) conosce la decomposizione in fattori primi del numero 221 = (13)(17). Quindi lei sola può calcolare il prodotto (p − 1)(q − 1). (12)(16) = 192. E lei sola può calcolare l’inverso modulo 192 di 7 (vedi sezione 12) che è 55. 3055 ≡ 4 mod 221. È un facile esercizio calcolare 3055 mod 221 grazie a quanto detto in sezione 11. Ad ogni modo ecco il codice in Pari-GP ? a=Mod(30,221) %1 = Mod(30, 221) ? a^55 %2 = Mod(4, 221) 14. RSA Perchè funzioni RSA abbiamo bisogno del seguente teorema che generalizza il teorema di Fermat Teorema 14.1 (Eulero). Siano p, q numeri primi e sia e un numero primo con p e q. Allora e(p−1)(q−1) ≡ 1 mod pq. Anna che deve ricevere messaggi pubblica n = pq dove p e q sono primi e pubblica anche e, primo con p e q. Ovviamente Anna non pubblica p e q ma solo n. Inoltre calcola d tale che d·e≡1 mod (p − 1)(q − 1). Anche d deve rimanere segreto. 16 GIANCARLO RINALDO Se Bruno vuole mandare ad Anna un messaggio m criptato calcola c = me mod n. Anna una volta ricevuto il messaggio criptato c calcola m tramite d m = cd mod n. Perchè? cd = (me )d mod n. D’altra parte e·d≡1 Quindi esiste t ∈ Z tale che mod (p − 1)(q − 1). e · d = t(p − 1)(q − 1) + 1 per cui cd = (me )d = med = mt(p−1)(q−1)+1 = mt(p−1)(q−1) · m ≡ m mod n. Come si può calcolare un numero pseudoprimo grande? Si consideri la seguente Nota 14.2. La probabilità che un numero p ∈ N sia primo è circa 1 , ln p dove ln p è il logaritmo naturale di p. Nota 14.3. Se volessimo calcolare un numero primo con 100 cifre dato che log(10^100)=230.2585092994045684017991455 Dovremmo fare circa 300 tentativi per trovare un numero primo. Saltiamo i numeri pari per rendere un pò più efficiente la ricerca. a=10^100 forstep(i=1,300,2, if(ispseudoprime(a+i),print(a+i))) A questo punto abbiamo un metodo per calcolare p, q, e (prendiamo 3 numeri pseudo primi grandi). Per calcolare d tramite Pari-GP d=Mod(e,(p-1)*(q-1))^-1 References [1] M. Curzio, P. Longobardi, M. Maj, Lezioni di Algebra, Liguori Editore, 1994. [2] C. Paar, Applied cryptography and data security, Lecture notes, http://www. crypto.rhur-uni-bochum.de/, 2000. [3] Pari Team, PARI/GP, version 2.1.5, http://pari.math.u-bordeaux.fr/, Bordeaux,2003. [4] G. Rinaldo, Clock, http://ww2.unime.it/algebra/rinaldo, Messina, 2005.