CRITTOGRAFIA E ARITMETICA MODULARE 1. Introduzione

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.