Il mistero dei numeri primi e la sicurezza informatica

Il mistero dei numeri primi e la sicurezza informatica
Laura Listanti
Docente di matematica, Liceo scientifico Renato Donatelli, Terni
Premessa
Brian Butterworth, professore di neuropsicologia cognitiva all’University College di Londra e
autore del libro Intelligenza matematica, in esso così si esprime: “di tutte le facoltà che ci hanno innalzato
dallo stato di cavernicoli e utilizzatori di strumenti in pietra a quello di edificatori di città grandiose e della
scienza moderna, una delle più importanti – e anche una delle meno comprese – è quella di usare i numeri
[…] forse, se troviamo così difficile renderci conto di quanto siamo dipendenti dai numeri è proprio perché
guardiamo il mondo inforcando lenti numeriche che non ci togliamo mai”
In effetti i numeri influenzano quasi tutti gli aspetti più tipicamente umani della nostra vita. Oggi
usiamo abitualmente i numeri in quasi ogni nostra attività: per contare oggetti, per dire che ora è, per fare
statistiche, per giocare d’azzardo, per comprare, per vendere, per classificare beni e servizi, temperature e
quozienti di intelligenza sono espressi in valori numerici.
Ma, se i numeri sono importanti per la loro ovvia utilità, lo sono ancor più per la maniera in cui essi
hanno foggiato il nostro modo di concepire il mondo.
Quello dei numeri è il linguaggio con cui vengono formulate le teorie scientifiche, e tutti coloro che
si sono occupati di scienza, dall’antichità a oggi, sono stati affascinati da essi, come si può evincere dalle
seguenti citazioni, riportate in ordine cronologico.
Proclo (410-485 circa): “Ovunque c’è il numero, c’è bellezza”
Galileo Galilei(1564-1642): “questo grandissimo libro (io dico l’universo) […] non si può intendere
se prima non si impara a intender la lingua, e conoscer i caratteri, ne’ quali è scritto. Egli è scritto in lingua
matematica.”
Albert Einstein (1879-1955): [i numeri sono] “la controparte simbolica dell’universo”
Carl Friedrich Gauss (1777-1855): “se la matematica è la regina delle scienze, la teoria dei numeri è
la regina della matematica”
Piergiorgio Odifreddi, (1950): [la teoria dei numeri] “è forse la disciplina in cui le connessioni fra il
diacronico e il sincronico, il classico e il moderno, il concreto e l’astratto tipiche della matematica
contemporanea si manifestano nella maniera più spettacolare, anche se non la sola”.
1
I numeri primi
I numeri, cui ci si riferisce, sono i cosiddetti numeri naturali, quelli cioè che servono per contare: 1,
2, 3, 4,… Essi hanno, tra le altre, la singolare caratteristica per la quale, rispetto a una proprietà, si dividono
in due classi: quelli che ne sono dotati e quelli che ne sono privi. Ad esempio, rispetto alla proprietà di
essere pari, si dividono tra quelli che lo sono come 2, 4, 6, 8 ecc., e quelli che non lo sono, cioè i dispari
come 1, 3, 5, 7 ecc. Rispetto alla proprietà di essere un quadrato perfetto si dividono tra quelli che lo sono
come 1=12, 4=22, 9=32, 16=42, e quelli che non lo sono. Esistono molte altre ripartizioni, ma, di gran lunga
la più importante, è quella che li divide tra numeri che sono primi e quelli che non lo sono.
Un numero naturale si dice primo se è diverso da 1 e non è il prodotto di altri numeri naturali diversi
da sé stesso e da uno, o anche se è divisibile esattamente solo per 1 e per sé stesso. Per esempio 5 è un
numero primo perché non può essere ottenuto come prodotto di fattori diversi da 1 e da 5, solo 1x5=5; 11 è
un numero primo perché solo 1x11=11; viceversa un numero che non è primo si dice composto, ed esso
allora si può esprimere come prodotto di due o più numeri naturali diversi da 1 e da sé stesso. Per esempio
15 non è un numero primo, quindi è composto, perché 15=3x5; 10 non è primo perché 10=2x5.
Consideriamo 30, esso non è primo perché 30=5x6, ma è anche vero che 30= 3x10, come anche 30=2x15,
come anche 30=2x3x5, quindi potremo concludere che esistono diversi modi di esprimere 30 come
prodotto di numeri minori di 30 e diversi da 1 e da 30. Consideriamo 21, esso non è primo perché 21=3x7,
e non esistono altri modi di esprimere 21 come prodotto di numeri minori di 21 e diversi da 1 e da 21.
Sembrerebbe esserci allora una diversità di comportamento tra i numeri composti, alcuni come 30
ammettono diverse scomposizioni in fattori, altri come 21 ne ammettono una sola. Non è così. Infatti
quando scriviamo 30=5x6, il fattore 5 è primo, mentre 6 non è primo, pertanto 6=2x3 e di conseguenza
30=5x2x3; quando scriviamo 30=3x10, il fattore 3 è primo, mentre 10 non lo è, e pertanto 10=2x5 e di
conseguenza 30=3x2x5; allo stesso modo, quando scriviamo 30=2x15, 2 è primo, mentre 15=3x5 e di
conseguenza 30=2x3x5. In ogni caso si giunge all’unica scomposizione: 30=2x3x5 in cui i fattori 2, 3 e 5
sono tutti primi, e, nella quale, può essere cambiato solo l’ordine dei fattori, in base alla proprietà
commutativa della moltiplicazione.
Concludendo, un numero naturale o è primo o è composto, e ogni numero composto si può
esprimere in un solo modo come prodotto di numeri primi. Quest’ultima affermazione, nota già ai tempi
dei Greci, ha un ruolo così importante nel sistema dei numeri, da meritare il nome di teorema fondamentale
dell’aritmetica ed evidenzia il ruolo essenziale che assumono i numeri primi in tutto il sistema dei numeri.
Essi sono i veri e propri atomi dell’aritmetica. Come ogni molecola esistente nel mondo fisico può essere
costruita utilizzando gli atomi della tavola periodica degli elementi chimici, ogni intero che non sia primo
può essere costruito moltiplicando questi elementi di base che sono i numeri primi, e che quindi sono la
tavola periodica del matematico.
Padroneggiare questi elementi di base offre al matematico la speranza di poter scoprire nuovi
metodi per costruire la mappa di un percorso che attraversi le smisurate complessità del mondo
matematico.
2
Ma, a dispetto della loro natura fondamentale e della semplicità con cui sono formulati, essi sono
considerati gli oggetti di studio più misteriosi, essendo generosi di moltissimi problemi di facile
formulazione ma molto difficili da risolvere.
Nonostante i numeri primi siano studiati da migliaia di anni, sono più i problemi ancora aperti che
quelli risolti.
Si può ben dire che il problema dei numeri primi costituisce l’ossessione per eccellenza della
comunità dei matematici. Quasi tutti, tra i più grandi, hanno dedicato le loro ricerche alla teoria dei numeri.
Proviamo quindi a ripercorrere la trama di questa ossessione, attraverso i suoi risultati più
significativi, per giungere alle applicazioni che essa trova oggi nella progettazione di quei sistemi che
garantiscono la riservatezza delle comunicazioni elettroniche.
Mi preme però prima sottolineare tre aspetti singolari che emergeranno da questo percorso.
Tutti i matematici che si sono occupati di teoria dei numeri, lo hanno fatto perché il suo studio ha
sempre avuto il fascino di una forma di pura contemplazione senza il peso di possibili conseguenze
pratiche, e proprio per questo, essa è stata sempre considerata la “vera” matematica. Valgano, a questo
proposito le parole di Henri Poincaré: “lo scienziato non studia la Natura perché è utile farlo; la studia
perché ne trae diletto, e ne trae diletto perché la Natura è bella. Se non fosse bella, non varrebbe la pena di
conoscerla, e se non valesse la pena di conoscere la natura, la vita non sarebbe degna di essere vissuta”, e
quelle di Godfrey H. Hardy: “la ‘vera’ matematica dei ‘veri’ matematici, quella di Fermat, di Eulero, di
Gauss, di Abel e di Riemann, è quasi totalmente ‘inutile’ […] Non è possibile giustificare la vita di nessun
vero matematico professionista sulla base dell’utilità del suo lavoro”.
Oggi invece i numeri primi sono diventati lo strumento fondamentale per il mondo del commercio
elettronico, che dipende interamente dalla loro comprensione. Questa che può sembrare una
contraddizione, in realtà non lo è, in quanto ciò che distingue la “vera” matematica non è l’utilità dei suoi
risultati, ma d’altro canto, se essa è tale, i suoi risultati dovranno, prima o poi, trovare utili applicazioni,
comunque vada. E la teoria dei numeri ne è una prova.
L’altro aspetto è che l’attuale applicazione si fonda sulle scoperte relative ai numeri primi compiute
da Pierre Fermat nel XVII secolo, ma la sua validità dipende da un problema che non si è stati ancora in
grado di risolvere.
Infine, solo con metodi non elementari è stato possibile dimostrare molti dei teoremi sui numeri
primi, dove la parola elementare non significa facile, ma estraneo alla teoria di cui l’enunciato del teorema
fa parte. La dimostrazione di un teorema di una certa teoria con metodi elementari, usando cioè solo metodi
inerenti alla teoria stessa, può essere, a volte molto più complicata, se non impossibile. È questo il caso per
esempio, come vedremo più avanti, del teorema fondamentale sui numeri primi, che necessita del ricorso
alla funzione logaritmica, e dell’ultimo teorema di Fermat, dimostrato nel 1995, che fa ricorso a teorie di
matematica superiore.
3
La distribuzione dei numeri primi
Una delle prime e più naturali domande che ci si è posti riguardo ai numeri primi è stata “quanti
sono?”
La risposta fu data da Euclide, dimostrando che i numeri primi sono infiniti. La dimostrazione,
condotta con metodi elementari, e riportata nel suo libro Gli Elementi, scritto nel 300 a.C., è considerata
una delle più belle e deliziosamente ingegnose della storia della matematica. Essa parte dal presupposto che
i numeri primi non sono infiniti, da cui si deduce che dovrà esistere un elenco finito di numeri primi: p1, p2,
p3,…, pn, dove pn indica l’ultimo. Si costruisce ora il numero: N= p1 · p2 · p3 ·… · pn +1, il quale risulterà o
primo o composto. Se N è primo, per come è stato costruito, è un primo maggiore di pn contraddicendo
quindi il presupposto. Se N è composto allora può essere scritto come prodotto di alcuni dei numeri
dell’elenco, ed essere, quindi divisibile per qualcuno di essi. Ma, per come è stato costruito, N diviso per
ciascuno di essi dà sempre resto 1 e perciò deve contenere come fattore un primo diverso da quelli
dell’elenco, contraddicendo quindi il presupposto. In ogni caso, sia se N è primo o composto ci sarà un
numero primo maggiore di pn, il che consente di concludere che l’elenco dei numeri primi continua
all’infinito.
Facciamo qualche prova:
•
N1=2+1=3 (primo)
•
N2=2·3+1=7 (primo)
•
N3=2·3·5+1=31 (primo)
•
N4=2·3·5·7+1=211 (primo)
•
N5=2·3·5·7·11+1=2311 (primo)
•
N6=2·3·5·7·11·13+1=30031 =59 509 (composto)
•
N7=2·3·5·7·11·13·17+1=510511 =19·97·277 (composto).
·
In effetti nessuno sa se ci sia un numero infinito di primi della forma:
N= p1 · p2 · p3 ·… · pn +1, né, viceversa, se ci sia un numero infinito di numeri composti della stessa
forma (sebbene almeno una delle due possibilità deve essere vera).
L’altro quesito che sorge altrettanto spontaneo, ma che non è stato ancora risolto, riguarda la
distribuzione dei numeri primi all’interno dei numeri naturali. In sostanza ci si chiede se c’è un ordine
prevedibile nella successione dei numeri primi, una regola per stabilire quale sarà, per esempio, il
centesimo numero primo, oppure se essi si succedono in modo casuale.
A ragione questo problema si è meritato l’appellativo di ossessione dei numeri primi, perché i
matematici mal sopportano l’idea di dover ammettere che non esista una spiegazione del modo in cui la
natura ha scelto tali numeri, e, per una disciplina, che si dedica a trovare andamenti regolari e ordine nel
caos, essi rappresentano la sfida estrema.
E in effetti se si prova a esaminare un elenco di numeri primi, si scopre immediatamente che è
impossibile prevedere quando apparirà il successivo. Per esempio tra i dieci numeri maggiori o uguali a 2 e
4
minori o uguali a 11, ci sono 5 numeri primi, 2, 3, 5, 7, 11, esattamente la metà; tra i successivi dieci da 12
a 21, ci sono 3 numeri primi, 13, 17, 19, cioè il 30%; tra 22 e 31, ci sono ancora 3 numeri primi, 23, 29, 31,
cioè ancora il 30%; mentre tra 32 e 41, ci sono 2 numeri primi, 37, 41, cioè il 20%; e così tra 42 e 51; si
potrebbe pensare che andando avanti le cose si regolarizzino, ma, non è così.
Proseguendo nel conteggio, per esempio nell’intervallo dei cento numeri che precedono 10 000 000,
i numeri primi sono 9 999 901, 9 999 907, 9 999 929, 9 999 931, 9 999 937, 9 999 943, 9 999 971,
9 999 973, 9 999 991, cioè lo 0,09%, mentre nell’intervallo dei cento numeri che seguono 10 000 000, i
numeri primi sono 10 000 019, 10 000.079, cioè lo 0,02%.
Si osserva inoltre che esistono intervalli di numeri naturali, di ampiezza arbitraria, all’interno dei
quali non si incontra alcun numero primo. Quest’ultima osservazione è addirittura ovvia.
Ricordiamo che il prodotto dei numeri naturali da 1 a n, si indica con il simbolo n! (da leggersi n
fattoriale), cioè: n!=1⋅2⋅3⋅…⋅(n–2)⋅(n–1)⋅n.
Ad esempio 5!=1⋅2⋅3⋅4⋅5; 10!=1⋅2⋅3⋅4⋅5⋅6⋅7⋅8⋅9⋅10.
Considerato il numero n! si ha che:
n!=n⋅(n–1)⋅(n–2)⋅(n–3)⋅…⋅3⋅2⋅1, è divisibile per ciascuno dei numeri tra 1 e n;
n!+2 è divisibile per 2, in quanto sia n! che 2 sono divisibili per 2
n!+3 è divisibile per 3, in quanto sia n! che 3 sono divisibili per 3
…
n!+n è divisibile per n, in quanto sia n! che n sono divisibili per n.
Abbiamo così trovato un intervallo di numeri naturali da n!+2 a n!+n, consecutivi e nessuno di essi
primo. Dato che n può essere qualsiasi, si vede che esistono sicuramente lunghi tratti senza numeri primi.
Ancora oggi il metodo più veloce per trovare tutti i primi inferiori a un numero prefissato N è
dovuto a Eratostene (276-194 a.C.), bibliotecario della grande biblioteca di Alessandria, che i più
conoscono per aver misurato il raggio della Terra (in un tempo in cui pochi credevano che fosse sferica),
ma che i teorici dei numeri ricorderanno per sempre per il suo crivello.
Tale metodo consiste nello scrivere in ordine tutti i numeri naturali minori di N (figura 1),
cancellando tutti i multipli di 2 tranne 2, tra i rimanenti tutti i multipli di 3 tranne 3, e così via fino ad aver
eliminato tutti i numeri composti. Tutti i numeri rimasti saranno i numeri primi minori di N.
2
11
20
29
38
47
56
65
74
83
92
3
12
21
30
39
48
57
66
75
84
93
4
13
22
31
40
49
58
67
76
85
94
5
14
23
32
41
50
59
68
77
86
95
6
15
24
33
42
51
60
69
78
87
96
7
16
25
34
43
52
61
70
79
88
97
8
17
26
35
44
53
62
71
80
89
98
9
18
27
36
45
54
63
72
81
90
99
Figura 1. Il metodo del crivello di Eratostene per trovare i numeri primi.
5
10
19
28
37
46
55
64
73
82
91
100
Facciamo un esempio: vogliamo scrivere l’elenco dei numeri primi minori 100.
Scriviamo in ordine tutti i primi cento numeri naturali a partire da 2
•
cancelliamo i multipli di 2
•
cancelliamo i multipli di 3
•
cancelliamo i multipli di 5
•
cancelliamo i multipli di 7.
Fermiamoci qui e osserviamo che quando abbiamo a che fare con un numero primo p, i suoi multipli
per fattori più piccoli di p sono stati già eliminati, e il primo che non lo è stato sarà p2. Per esempio nel caso
in cui p fosse 5, il primo multiplo a non essere ancora stato eliminato è 25, infatti 10 è stato eliminato come
multiplo di 2, 15 è stato eliminato come multiplo di 3, 20 è stato eliminato come multiplo di 2, 25 è il
primo non eliminato perché non è multiplo di 2 né di 3; pertanto la procedura di cancellazione termina con
p=7, infatti, se p=11 allora p2=121 e poiché la tavola arriva fino a 100, tutti i multipli di 11 sono già stati
eliminati.
Tutti i numeri non cancellati (quelli in grassetto) sono i primi compresi nell’intervallo tra 2 e 100,
estremi inclusi, essi sono: 2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83,
69, 97.
Alla ricerca dei numeri primi
Proprio nel tentativo di farsi un’idea di come si distribuiscono i numeri primi, eminenti matematici
come Pierre de Fermat, Marin Mersenne, Leonhard Euler (Eulero), Carl Friedrich Gauss ecc. hanno
compilato e analizzato lunghi elenchi di numeri primi, alla ricerca di formule in grado di produrre, se non
tutti, almeno “molti” di essi.
Pierre de Fermat (1601-1665) ipotizzò che tutti i numeri della forma F(N)= siano primi. In effetti
per N=1
F (1) = 2 2 + 1 = 2 2 + 1 = 4 + 1 = 5
1
per N=2
F ( 2) = 2 2 + 1 = 2 4 + 1 = 16 + 1 = 17
2
per N=3
F (3) = 2 2 + 1 = 2 8 + 1 = 256 + 1 = 257
3
per N=4
F ( 4) = 2 2 + 1 = 216 + 1 = 65536 + 1 = 65537
4
sono tutti primi, ma già per N=5
F (5) = 2 2 + 1 = 2 32 + 1 = 4294967296 + 1 = 4294967297 = 641 × 6700417
5
risultato scoperto da Eulero nel 1732; questo è uno dei pochi casi in cui Fermat cadde in errore, forse
perché, come si vede questi numeri, detti numeri di Fermat, crescono molto rapidamente, già il quinto
6
numero ha dieci cifre ed era al di fuori della portata dei suoi calcoli. Ma è un ottimo esempio per
convincerci che la verità di una affermazione non può basarsi sulla verifica della sua validità in alcuni casi
particolari.
Oggi sappiamo che F(N) è composto per tutti i valori di N da 5 a 21, come pure per vari altri valori,
e l’ipotesi più diffusa, ma non dimostrata, è che F(N) sia composto per tutti i valori di N>4, sostenuta dal
fatto che non si è trovato sperimentalmente, un F(N) con N>4 che sia primo.
Carl Friedrich Gauss (1777-1855) riuscì a dimostrare che se l’N-esimo numero di Fermat è primo,
allora è possibile costruire geometricamente con riga e compasso, un poligono regolare di N lati. Dove per
riga si intende una riga non graduata, che serva solo a tracciare linee rette, e per compasso uno strumento
capace solo di tracciare circonferenze o archi di circon-ferenza e non per esempio di riportare misure. In
questo modo, all’età di soli 19 anni, Gauss riuscì a costruire il poligono di 17 lati. Allo stesso modo si
potrebbe costruire un poligono regolare di 65537 lati, essendo quest’ultimo un primo di Fermat.
Marin Mersenne (1588-1648) è famoso, fra l’altro, per il suo ruolo di intermediario nella comunità
scientifica internazionale del Seicento. In assenza di periodici scientifici, infatti, diverse persone si
assunsero il compito di comunicare a un gran numero di corrispondenti ogni scoperta scientifica di cui
fossero venuti a conoscenza, e Mersenne fu uno di questi. A lui è dovuta la pubblicazione, per la prima
volta, di gran parte del lavoro di Fermat, attraverso le sue lettere.
Anche Mersenne venne preso dalla smania di trovare delle formule che producessero numeri primi,
e, in questa ricerca, compilò un elenco di numeri primi p, per l’esattezza p=2, 3, 5, 7, 13, 17, 19, 31, 67,
127, 257, per i quali riteneva che fosse primo anche il numero della forma M(p)=, che viene oggi chiamato
numero di Mersenne. Nessuno sa come Mersenne sia stato in grado di fare questa affermazione, ma,
comunque, egli era sorprendentemente vicino alla verità. Soltanto nel 1947, quando comparvero le
calcolatrici da tavolo, fu possibile verificare la sua asserzione. Aveva fatto solo 5 errori: M(67), M(257)
non sono primi; M(61), M(89), M(107) sono primi.
Si osserva facilmente come al crescere di p il numero M(p) diventi rapidamente molto grande,
•
M(2)=22–1=3
•
M(3)=23–1=7
•
M(4)=24–1=15=3·5
•
M(5)=25–1=31
•
M(6)=26–1=63=7·3·3
•
M(7)=27–1=127
•
M(8)=28–1=255=5·3·17
…
•
M(11)=211–1=2047=23·89
…
•
M(17)=217–1=131071
7
E solo per alcuni valori di p essi sono primi, per cui l’idea sarebbe quella di cercare i valori di p per
cui M(p) è primo. Ma ciò non è facile perché la primalità di p è condizione solo necessaria per la primalità
di M(p). infatti è vero che:
1. se M(p) è primo allora anche p è primo,
2. se p non è primo allora M(p) non è primo vedi ad esempio M(4), M(6), M(8);
ma se p è primo non è detto che M(p) sia primo, vedi ad esempio M(11).
A tutt’oggi non si sa se esista un’infinità di numeri di Mersenne che siano primi (detti primi di
Mersenne), né se esista un’infinità di numeri di Mersenne che non siano primi, anche se entrambe le
asserzioni appaiono verosimili. Infatti, aumentando le capacità di calcolo dei calcolatori, aumenta il
numero dei primi di Mersenne conosciuti (tabella 1). La ricerca di primi di Mersenne sempre più grandi, ha
valore di semplice curiosità, ma il loro calcolo è utile per la misurazione della potenza di calcolo dei
calcolatori. Per esempio per dimostrare che il numero di Mersenne M8191 di 2466 cifre non è primo, usando
il test di Lucas-Lehmer, ci vollero 100 ore la prima volta, nel 1953 sul computer ILLIAC-I. Da allora il
tempo di calcolo è sceso drasticamente: da 5 a 2 ore su un IBM 7090, 40 minuti su un ILLIAC-II, da 3 a un
minuto su un IBM 360-91, e 10 secondi su un CRAY-I.
valore di p
2
3
5
7
13
17
19
31
61
89
107
127
521
2p-1
3
7
31
127
8191
131071
524287
2 147 483 647
19 cifre
27 cifre
33 cifre
39 cifre
157 cifre
607
183 cifre
1279
386 cifre
2203
664 cifre
2281
687 cifre
3217
4253
anno
autore
computer
anonimo
Pietro Antonio Cataldi
Pietro Antonio Cataldi
Leonhard Euler
I. M. Pervushin
R. E. Powers
R. E. Powers
Francois Edouard Anatole Lucas
Raphael M. Robinson
calcolatore meccanico
calcolatore meccanico
calcolatore meccanico
calcolatore meccanico
SWAC
Raphael M. Robinson
SWAC
Raphael M. Robinson
SWAC
Raphael M. Robinson
SWAC
Oct 9 Raphael M. Robinson
SWAC
969 cifre
1281 cifre
1461
1588
1588
1750
1883
1911
1914
1876-1914
30 gennaio
1952
30 gennaio
1952
25 giugno
1952
7 ottobre
1952
9 ottobre
1952
1957
1961
BESK
IBM 7090
4423
1332 cifre
1961
9689
9941
11213
19937
2917 cifre
2993 cifre
3376 cifre
6002 cifre
1963
1963
1963
1971
Hans Riesel
Alexander Hurwitz e John L.
Selfridge
Alexander Hurwitz e John L.
Selfridge
Donald B. Gillies
Donald B. Gillies
Donald B. Gillies
Bryant Tuckerman
8
IBM 7090
ILLIAC 2
ILLIAC 2
ILLIAC 2
IBM 360/91
valore di p
21701
2p-1
6533 cifre
anno
1978
23209
44497
6987 cifre
13.395 cifre
1979
1979
86243
110503
25962 cifre
33265 cifre
1982
1988
132049
216091
756839
859433
1257787
1398269
39751 cifre
65050 cifre
227832 cifre
258716 cifre
378632 cifre
420921 cifre
1983
1985
1992
1994
1996
1996
2976221
895932 cifre
1997
3021377
909526 cifre
1998
6972593
2098960 cifre
1999
13466917
4053946 cifre
2001
autore
Landon Curt Noll e Laura A.
Nickel
Landon Curt Noll
David Slowinski e Harry L.
Nelson
David Slowinski
Walter N. Colquitt e Luther
Welsch, Jr.
David Slowinski
David Slowinski
David Slowinski e Paul Gage
David Slowinski e Paul Gage
David Slowinski e Paul Gage
Joel Armengaud, George
Woltman e GIMPS
Gordon Spence, George Woltman
e GIMPS
Roland Clarkson, Woltman, Scott
Kurowski e GIMPS
Nayan Hajratwala, Woltman,
Kurowski e GIMPS
Michael Cameron e GIMPS
20996011
6320430 cifre
2003
Michael Shafer e GIMPS
24036583
7235733 cifre
2004
Josh Findley e GIMPS
25964951
7816230 cifre
2005
Martin Nowak e GIMPS
30.402.45
7
9.152.052
cifre
2005
Curtis Cooper, Steven Boone,
CMSU e GIMPS
computer
Cyber 174
Cyber 174
Cray 1
Cray 1
Cray X-MP
Cray X-MP
Cray 2
Cray C90
Cray T94
PC Pentium 90
PC Pentium 100
Pentium 200
Pentium II 350
800 MHz AMD T-Bird
PC
2 Gh Pentium 4 Dell
Dimension PC
2.4 GHz Pentium 4
Windows XP PC
2.4 GHz Pentium
4 Windows XP PC
Lavoro coordinato di
700 computers
GIMPS = Great Internet Mersenne Prime Search (www.mersenne.org/)
Tabella 1. La ricerca dei numeri primi di Mersenne.
Un’altra notevole formula che dà luogo a molti numeri primi fu scoperta da Eulero nel 1772. La
formula x2+x+41 fornisce il seguente elenco di numeri primi, inserendo tutti i numeri compresi fra 0 e 39:
41, 43, 47, 53, 61, 71, 83, 97, 113, 131, 151, 173, 197, 223, 251, 281, 313, 347, 383, 421, 461, 503,
547, 593, 641, 691, 743, 797, 853, 911, 971, 1033, 1097, 1163, 1231, 1301, 1373, 1447, 1523, 1601.
Eulero comprese che il processo era destinato a interrompersi a un certo punto. Infatti per x=41 si
ha:
412+41+41 = 412+2·41 = 41· (41+2) = 41·43
che non è primo; ma anche per x=40 il numero che si ottiene non è primo, infatti:
402+40+41= 40 · (40+1)+(40+1)=(40+1) · (40+1).
Ciononostante Eulero fu molto colpito dalla capacità della sua formula di produrre tanti numeri
primi, da domandarsi per quali altri numeri diversi da 41 si sarebbe potuto ottenere un risultato simile.
Scoprì che si poteva scegliere anche n=2, 3, 5, 11, 17 perché la formula x2+x+n producesse numeri primi
per ogni valore di x compreso fra 0 e n–2.
9
Possiamo concludere che la ricerca di formule semplici che producano soltanto numeri primi è stata
inutile ed è ancora meno probabile che conduca a buoni risultati il tentativo di trovare una formula che
produca tutti i numeri primi. Lo stesso Eulero, nel 1751, scriveva: “ci sono alcuni misteri che la mente
umana non penetrerà mai. Per convincercene non dobbiamo far altro che gettare un’occhiata alle tavole dei
numeri primi. Ci accorgeremo che non vi regna né ordine né legge”.
La svolta di Gauss
Il passo decisivo, nella ricerca di una legge da cui dipenda la distribuzione dei numeri primi, fu
compiuto quando si rinunciò agli inutili tentativi di trovare una formula che generasse tutti i numeri primi o
desse il numero esatto di essi contenuti nei primi n numeri interi. A compiere la svolta fu Gauss, il quale
affrontò il problema da un altro punto di vista. Infatti egli si chiese se era possibile prevedere non quale
fosse la posizione di un numero primo rispetto a quello precedente, ma se era possibile prevedere quanti
fossero i numeri primi minori o uguali a un certo numero x. Egli introdusse a tale scopo la funzione π (x) =
numero dei primi minori o uguali a x, e poté verificare per esempio che: π (10) = 4 perché i numeri primi
minori o uguali a 10 sono: 2, 3, 5, 7 e cioè 4 e la distanza media tra due numeri primi successivi
nell’intervallo tra 1 e 10 è 10/4 uguale a 2,5. Nella tabella 2 sono riportati alcuni valori della funzione e
della distanza media.
Tabella 2. Alcuni valori della fiunzione π (x) .
Osservando tali risultati, egli notò che ogni volta si moltiplica x per 10, si aggiunge 2,3 al rapporto
x/π(x), almeno per x abbastanza grande. Proprio questo legame tra moltiplicazione e addizione (che è la
relazione racchiusa in un logaritmo), e il fatto che 2,3 è approssimativamente il valore rappresentato dal ,
portarono Gauss a ipotizzare che
x
= log x
π ( x)
Da cui
10
π ( x) ≅
x
log( x )
Questa congettura si rivelò poi vera, e oggi è nota come teorema dei numeri primi. Una notevole
conseguenza del teorema dei numeri primi è che “la probabilità che un numero intero di x cifre, preso a
caso, sia primo è circa 1/log(10x)”. Infatti l’espressione
π ( x) ≅
x
log( x )
in altre parole, significa che nell’intervallo tra 1 e x si incontra un primo circa ogni log(x) e cioè la
probabilità che nell’intervallo dei numeri
≤
x un numero preso a caso sia primo è 1/log(x). Ad esempio
nell’intervallo dei numeri minori di 10 000 000 uno ogni log(10 000 000) è primo. Essendo
log(10 000 000) = log(107) = 7log(10) ≈ 16,11… ciò vuol dire che dei numeri minori di 10 000 000 circa 1
su 16 è primo e perciò c’è circa una probabilità su 16 che un numero di 7 cifre sia primo.
Al momento attuale molti sono i problemi non ancora risolti. Tra questi ricordiamo:
1.
la congettura dei primi gemelli: esistono infiniti numeri primi p tali che p+2 è ancora
primo? Ad esempio: 3 e 3+2; 5 e 5+2; 17 e 17+2; 29 e 29+2 ecc.
2.
la congettura di Goldbach: ogni intero pari maggiore di 2 può essere scritto come somma di
due numeri primi? Ad esempio: 4 = 2+2; 6 = 3+3; 8 = 3+5; 10 = 5+5; 12 = 5+7 ecc.
La difficoltà fondamentale di tali problemi risiede nel fatto che i numeri primi sono definiti
mediante proprietà moltiplicative, mentre i problemi in questione coinvolgono proprietà additive.
Di gran lunga il più importante tra i problemi non risolti, è quello che va sotto il nome di ipotesi di
Riemann, anche perché fu proprio la novità del metodo in essa contenuto a far compiere il passo decisivo
per la dimostrazione del teorema dei numeri primi, compiuta, indipendentemente l’uno dall’altro, nel 1896,
dai matematici Jacques Hadamard e Charles de la Vallée-Poussin.
Ricordiamo che l’ipotesi di Riemann, inserita all’ottavo posto nell’elenco dei famosi ventitré
problemi irrisolti, presentati da David Hilbert al Congresso internazionale dei matematici del 1900, e
lanciati come sfida alla comunità dei matematici del ventesimo secolo, è ancora rimasto tale, cioè senza
dimostrazione.
È oggi considerato uno dei problemi più difficili del nuovo millennio. Nel 2000 il Clay Mathematics
Institute ha offerto un milione di dollari a chi riuscirà a darne una dimostrazione.
Grazie ai calcolatori, attualmente è stato possibile verificare tali congetture in moltissimi casi. Ad
esempio la congettura di Goldbach è stata verificata per tutti i pari fino a 100 milioni, mentre l’ipotesi di
Riemann è stata verificata per un miliardo e mezzo di casi, ma ciò non è sufficiente per dimostrarne la
verità. Ed è proprio questo quello che distingue la matematica dalle altre scienze, dove una qualsiasi
ipotesi, sostenuta da verifiche sperimentali, è ritenuta valida finché non contraddetta da un caso contrario;
mentre, in matematica, un solo caso contrario serve a dimostrare la falsità dell’ipotesi, la cui verità, per
contro, deve essere dimostrata per tutti i casi possibili, il che, ovviamente, può avvenire solo
indipendentemente dalle verifiche di casi particolari anche se molti.
11
Ed è questa una delle peculiarità più belle della matematica. Qualsiasi affermazione dimostrata è
eterna e immutabile, si pensi all’infinità dei numeri primi, ciò è vero per Euclide, ma rimane vero ancora
oggi, senza possibilità di smentite.
Come ebbe a dire il matematico Hermann Hakel: “Nella maggior parte delle scienze una
generazione demolisce quello che l'altra ha costruito e ciò che uno ha fatto un altro lo disfa. Solo nella
matematica ogni generazione aggiunge un nuovo piano alla vecchia struttura.”
E che ciò susciti l’idea della bellezza è bene sintetizzato dalle parole di Bertrand Russell: “La
matematica, vista dalla giusta angolazione, non possiede solo la verità, ma la suprema bellezza: una
bellezza fredda e austera, come quella della scultura, una bellezza che non fa appello ai nostri sentimenti
più grossolani, che non ha gli ornamenti sgargianti della musica o della pittura, una bellezza pura e
sublime, capace della rigorosa perfezione che è propria solo della più grande arte.”
Anche se non è possibile presentare in termini semplici l’ipotesi di Riemann, in quanto coinvolge
concetti di matematica superiore, proviamo a delinearne le linee essenziali.
Nel 1737 Eulero introdusse e studiò una funzione, detta funzione ζ (zeta) di Eulero così definita:
+∞
1
1
1
1
= 1 + x + x + x + ............definita per x ∈ R : x > 1
x
2
3
4
n =1 n
ζ ( x) = ∑
e, sempre a Eulero è dovuta la seguente identità:
ζ (x ) =
 px 
2x
3x
5x
7x
11x

⋅ x
⋅ x
⋅ x
⋅ x
⋅ .......... = ∏  x
2 − 1 3 − 1 5 − 1 7 − 1 11 − 1
p  p −1
x
dove il prodotto è esteso a tutti i numeri primi.
Ed è proprio questa identità che è alla base della notevole importanza assunta dalla funzione ζ nella
teoria dei numeri e in particolare per quanto riguarda la distribuzione dei numeri primi nell’insieme dei
naturali. Infatti a destra di essa appaiono esplicitamente i numeri primi, mentre a sinistra compare la
funzione ζ, definita indipendentemente da essi.
Riemann, nel 1859, propose di considerare la funzione ζ, come funzione di variabile complessa,
cioè definita per x numero complesso, ed effettuò il cosiddetto prolungamento analitico di ζ all’intero piano
complesso, costruendo la nuova funzione ζ, oggi nota come funzione zeta di Riemann. Egli provò che gli
zeri della funzione ζ (cioè i valori della variabile per cui la funzione restituisce il valore 0) sono x = –2,
x = –4, x = –6,… detti zeri banali di ζ; e alcuni numeri complessi (non reali) x, con parte reale compresa tra
0 e 1, estremi inclusi. L’ipotesi di Riemann afferma che tutti gli zeri non banali di ζ hanno la caratteristica
di avere la parte reale uguale a
1
2
.
Dalla validità di questa ipotesi discende una serie enorme di proprietà sui numeri primi. Ci sono
attualmente centinaia di “quasi teoremi” che iniziano con “supponiamo che l’ipotesi di Riemann sia
vera…”. Se l’ipotesi venisse dimostrata, tutti questi “quasi teoremi” diventerebbero veri teoremi.
12
I test di primalità e la fattorizzazione
Abbiamo fin qui concentrato l’attenzione sul comportamento dei numeri primi, ma come è possibile,
preso un intero a caso x, provare se x è primo o composto?
Il metodo più ovvio consiste nel dividere il numero x per tutti gli interi che lo precedono. Infatti se
una qualunque di tali divisioni dà resto zero, il numero x è composto e divisore e quoziente sono suoi
fattori, mentre se nessuna di tali divisioni, per ciascuno degli interi minori x, dà resto zero, il numero x è
primo.
In effetti la procedura delle divisioni può essere interrotta all’intero minore della , in quanto se x è
composto, esso sarà il prodotto di almeno due fattori, per esempio x= F1⋅F2, ed essendo x= x ⋅ x , se
F1> x , F2 < x . Ad esempio 29= 29 ⋅ 29 e
29 ≅ 5,... quindi si può fermare la procedura quando il
divisore è 5. Infatti 29:2 dà resto 1, 29:3 dà resto 2, 29:4 dà resto 1, 29:5 dà resto 4. Si può quindi
concludere che 29 è primo, perché se avesse avuto un fattore maggiore di 5, ne avrebbe avuto sicuramente
uno minore di 5, il che non è.
Ma anche limitando le divisioni alla radice quadrata, l’algoritmo sarebbe comunque inapplicabile,
perché per giungere a conclusione richiede un tempo che cresce esponenzialmente al crescere del numero
di cifre di n, pertanto può risultare intollerabilmente lungo, anche con gli strumenti di calcolo più veloci:
anni, secoli, più della vita presunta dell’Universo. Ad esempio, è stato dimostrato che il numero 244 497–1,
formato da 13 595 cifre, è primo. Se un calcolatore fosse in grado di controllare un milione di divisioni al
secondo e si fermasse alla radice quadrata del numero, è stato calcolato che gli occorrerebbero 106684 anni
per espletare il suo compito. L’inconveniente deriva dal fatto che il metodo delle divisioni non solo ci dice
se il numero è primo o composto, ma risolve anche il problema della fattorizzazione di un numero, in
quanto nel caso in cui il numero risulta composto ci fornisce i fattori della sua scomposizione.
A tutt’oggi è facile trovare numeri primi grandi o testare la primalità di un numero, mentre è
difficile fattorizzare un intero che sia il prodotto di due numeri primi grandi. Ovviamente i termini “facile”,
“difficile”, “grande”, sono relativi alla conoscenza e alla tecnologia disponibili. Attualmente sono
considerati “grandi” numeri di alcune centinaia di cifre, mentre “facile” rappresenta un tempo di secondi e
“difficile” di secoli.
L’efficacia dei test di primalità attualmente usati dipende dal fatto che è possibile stabilire se un
numero è primo senza essere costretti a trovarne i fattori, qualora risultasse composto. Alcuni metodi usati
sono di tipo probabilistico, cioè stabiliscono che un intero è probabilmente primo con una probabilità di
errore che si può rendere piccola quanto si vuole.
Il più semplice, al tempo stesso velocissimo e potente, si basa sul piccolo teorema di Fermat. Il
teorema stabilisce che se p è un numero primo e a un intero minore di p allora ap–a è un multiplo di p cioè
è divisibile per p.
Ad esempio:
•
se p=7 e a=2 allora 27–2=128–2=126=7·18 cioè multiplo di 7
•
se p=7 e a=3 allora 37–3=2187–3=2184=7·312 cioè multiplo di 7
13
•
se p=7 e a=4 allora 47–4=16384–4 = 16380 = 7·2340 cioè multiplo di 7
•
se p=5 e a=4 allora 45–4=1024–4=1020=5·204 cioè multiplo di 5
•
se p=3 e a=4 allora 43–4=64–4=60=3·20 cioè multiplo di 3.
L’importanza del teorema sta nel fatto che ci fornisce un metodo per stabilire se un numero è primo
o no, infatti costruiamo un numero del tipo ap–a, verifichiamo se è multiplo di p, se non lo è siamo sicuri
che p non è primo. Ad esempio, vogliamo sapere se 15 è primo, costruiamo
215–2=32768–2=32766
32766=15·2184+6
cioè non è divisibile per 15 quindi sicuramente 15 è composto e infatti 15=3·5.
Ma cosa si può dire se invece ap–a è divisibile per p? Sfortunatamente non possiamo essere sicuri
che p sia primo, anche se è molto probabile che lo sia.
Proviamo: 217–2=131072–2=131070=17·7710 e infatti 17 è primo. Provando 2341–2, si trova che
esso è divisibile per 341, ma 341 non è primo essendo 341=11·31. Sono detti pertanto pseudoprimi i
numeri composti che passano il test. Non proviamo a calcolare 2341 perché sarebbe un numero
mostruosamente grande, fuori dalla nostra portata, ma vedremo tra poco come si può aggirare l’ostacolo.
Riassumendo, il piccolo teorema di Fermat afferma che è vero:
1.
se p è primo e a è un intero minore di p allora ap–a è divisibile per p;
2.
se ap–a non è divisibile per p allora p non è primo
ma, se ap–a è divisibile per p allora p può essere primo ma anche composto, ciò perché la divisibilità per p
è condizione necessaria ma non sufficiente perché p sia primo. Concludendo possiamo dire che, usando
questo teorema per verificare la primalità di un numero, se scopriamo che ap-a non è divisibile per p siamo
sicuri che p è composto, ma se è divisibile per p, allora p è probabilmente primo, nel senso che può essere
un primo autentico o pseudoprimo.
La cosa interessante è che la probabilità che un numero composto sia uno pseudoprimo (cioè che
superi il test di primalità ma non sia primo come per esempio 341), su una base casuale diminuisce
fortemente all’aumentare del numero. Un numero di 1000 cifre composto ha circa una possibilità su 10123
di essere uno pseudoprimo su una base scelta a caso. La tabella 3 riporta tali probabilità in funzione del
numero di cifre.
Cifre in x
Limite superiore per
Cifre in x
P(x)
Limite superiore
per P(x)
Cifre in
x
Limite superiore
per P(x)
60
0,0716
0,0000846
100
0,0000000277
200
3,85·10–27
120
5,28·10
300
80
–12
–17
150
1,49·10
5,8·10–29
400
5,7·10–42
500
2,3·10–55
700
1,8·10–82
1000
1,2·10–123
2000
8,6·10–262
5000
7,6·10–680
10000
1,6·10–1331
100000
1,3·10–10584
Tabella 3. Probabilità che un numero composto sia pseudoprimo.
Nel 2002 tre ricercatori indiani, Manindra Agrawal, Neeraj Kayal e Nitin Saxena, hanno costruito un
algoritmo, denominato AKS (dalle iniziali dei nomi), sempre basato sulla fondamentale proprietà enunciata dal
14
piccolo teorema di Fermat, ma che risulta deterministico e che riduce in maniera drastica il tempo di calcolo.
L’algoritmo fornisce una svolta significativa in un settore lungamente atteso e di grande interesse pratico, ma
per ora non sembra che possa avere immediata applicazione, in quanto molto più lento dei test probabilistici, i
quali, d’altra parte, sono quasi certi per i numeri primi di centinaia di cifre che servono attualmente in
crittografia.
Storia della crittografia
La crittografia, che letteralmente significa scrittura nascosta, nasce dalla necessità di segretezza di alcune
informazioni, e pertanto, con tale termine, intendiamo lo studio dei metodi che consentono la trasmissione sicura
dell’informazione.
D’altro canto l’esistenza di informazioni segrete genera il desiderio di svelarle, e da tale desiderio nasce
la crittoanalisi, con cui intendiamo lo studio di metodi che consentono la decifrazione dei messaggi crittografati.
La storia della crittografia d’altra parte altro non è che la secolare battaglia tra crittografi e crittoanalisti.
Infatti ogni sistema crittografico rimane valido finché un crittoanalista non individua un suo punto debole, sulla
base del quale, riesce a elaborare il sistema di decifrazione.
Crittografi e crittoanalisti insieme hanno dato un grande contributo al progresso scientifico e tecnologico.
Infatti, tutti i metodi della crittografia e della crittoanalisi fanno ricorso a metodi e strumenti di una vasta varietà
di scienze, come la matematica, la linguistica, la teoria dell’informazione, la fisica quantistica, le quali, a loro
volta, sono da essi arricchite e stimolate.
L’idea, su cui si basa un metodo crittografico, consiste nel concordare tra mittente e destinatario, che
vogliono scambiarsi un messaggio, senza che venga intercettato da terzi, una procedura per alterare il testo in
chiaro del messaggio. Il destinatario può ricavare il testo originale, applicando al testo cifrato la procedura
inversa. Chi intercetta il messaggio, non conoscendo la procedura, non può ricostruire il messaggio. La sicurezza
del metodo sta nella difficoltà, da parte del crittoanalista, di poter ricostruire la procedura dall’analisi del
messaggio cifrato.
Prima dell’era informatica, i metodi crittografici erano essenzialmente due: per trasposizione o per
sostituzione.
Nella trasposizione le lettere sono mutate di posto, generando, di fatto un anagramma. Ma la
trasposizione non può essere casuale. Infatti, nel caso di messaggi brevi, non sarebbe sicura, in quanto i pochi
caratteri alfabetici, che costituiscono il messaggio, possono essere combinati in pochi modi diversi, per cui
diventa facile ricostruire il messaggio per tentativi. Ad esempio la parola “mio”, consta di 3 caratteri alfabetici,
esistono al massimo sei sequenze diverse: mio, moi, imo, iom, omi, oim; analizzandole tutte e sei è facile
ricostruire la sequenza “mio”. Ma, al crescere della lunghezza del messaggio, cresce mostruosamente anche il
numero delle sequenze, infatti un anagramma di una parola di n lettere, altro non è che una permutazione di n
elementi e, si dimostra che il numero totale delle permutazioni di n elementi è dato da n! (si legga n fattoriale),
uguale al seguente prodotto n(n–1)(n–2)(n–3)…(n– (n–1)). Pertanto se il messaggio è costituito, ad esempio, da
20 lettere, i possibili anagrammi sono 20!=20·19·18·17·16·15·14·13·12·11·10·9·8·7·6·5·4·3·2·1 cioè più di 1000
miliardi, e anche se si potesse controllare un anagramma al secondo ci vorrebbero più di trentuno secoli per
analizzarli tutti. In questo caso la comunicazione risulterebbe sicura, essendo impossibile analizzare tutte le
15
possibili sequenze e ricostruire il messaggio, ma, di fatto, è inutilizzabile anche dal destinatario, perché di fronte
allo stesso problema.
Per rendere efficace tale metodo è necessario che mittente e destinatario si accordino su un criterio di
trasposizione, fissato in anticipo e più è complicato tale criterio e più è sicuro il metodo.
Esiste il metodo della trasposizione cosiddetta a inferriata. Esso consiste nella trascrizione di un testo
lungo due linee orizzontali, una superiore e una inferiore, passando da una all’altra a ogni successivo carattere
alfabetico. Finita la trascrizione, la seconda fila di caratteri sarà accodata alla prima per dare origine al testo
cifrato. Ad esempio:
testo del messaggio: incontriamoci stasera alle sette:
testo del messaggio cifrato: icnraoitsralstenotimccsaealeet:
Il destinatario ricostruisce il testo originale applicando la trasposizione inversa.
Esistono molti altri tipi di trasposizione, per esempio si può variare il numero delle file, su cui trascrivere
il messaggio, oppure si può passare da una fila all’altra ogni due caratteri, anziché dopo ogni singolo carattere e
così via. Da osservare che ogni carattere alfabetico mantiene la propria identità ma cambia la posizione.
Nella sostituzione ogni carattere alfabetico del messaggio originale viene sostituito con un altro carattere
alfabetico, secondo un criterio stabilito. In questo caso ogni carattere alfabetico mantiene la posizione ma
cambia la propria identità.
Sostanzialmente esso necessita di determinare, come primo passo, un alfabeto cifrante, che è ottenuto
rimescolando, secondo un criterio, l’alfabeto ordinario. In questo modo a ogni carattere dell’alfabeto ordinario
corrisponde un carattere dell’alfabeto cifrante. Per cifrare il messaggio si sostituisce ogni carattere del messaggio
con il corrispondente carattere dell’alfabeto cifrante. Per decifrare il messaggio si applica la procedura inversa.
Il primo esempio documentato di cifratura per sostituzione si trova nel De bello gallico di Giulio Cesare,
detto anche cifrario di Cesare. Qui l’alfabeto cifrante era ottenuto da quello ordinario, spostando a destra di tre
posti ogni carattere alfabetico, ad esempio, per cifrare il messaggio si sostituisce ogni lettera con la
corrispondente dell’alfabeto cifrante (figura 2)
16
Figura 2. Cifrario di Giulio Cesare.
Per decifrare si sostituisce ogni lettera del messaggio cifrato utilizzando la corrispondenza inversa.
Come si può facilmente osservare, in questo metodo, l’alfabeto cifrante altro non è che una
riorganizzazione dell’alfabeto ordinario, che si può ottenere con un qualsiasi spostamento tra 1 e il numero delle
lettere dell’alfabeto ordinario. Per esempio, nel caso dell’alfabeto italiano, che consta di 21 lettere, si possono
effettuare 20 diversi spostamenti e ottenere quindi 20 diversi alfabeti cifranti. Essendo l’alfabeto cifrante una
riorganizzazione dell’alfabeto ordinario, non è detto che questa debba essere ottenuta, utilizzando il criterio
dello spostamento, ma può coincidere con un qualsiasi anagramma dell’alfabeto ordinario. Si vede quindi
facilmente come aumentano gli alfabeti cifranti, nel nostro caso, il loro numero, per quanto detto
precedentemente, uguaglia il numero delle permutazioni di 21 elementi e cioè 21!, e cioè oltre 50 miliardi di
miliardi.
A partire da questo esempio, cerchiamo di chiarire in termini generali il significato di metodo
crittografico, intendendo con esso un algoritmo, che mediante una chiave, trasforma un messaggio in chiaro in
un messaggio cifrato o crittogramma.
Ad esempio, nel metodo descritto sopra, l’algoritmo equivale alla procedura con cui ogni lettera
dell’alfabeto in chiaro è sostituita dalla corrispondente lettera dell’alfabeto cifrante, la chiave equivale al
particolare alfabeto cifrante, scelto per la cifratura o decifrazione di un particolare crittogramma.
Inoltre c’è da sottolineare l’importanza concettuale della distinzione tra algoritmo e chiave. Infatti la sola
conoscenza dell’algoritmo senza la chiave, non permette di decifrare il crittogramma. Ed è questo uno dei
principi fondamentali della crittografia, formulato in modo definitivo nel 1883 dall’olandese Auguste
Kerckhoffs von Nieuwenhof, noto anche come legge di Kerckhoffs: “la sicurezza di un crittosistema non deve
dipendere dal tener celato il crittoalgoritmo. La sicurezza dipenderà solo dal tener celata la chiave”.
Le caratteristiche di un efficace sistema crittografico possono essere riassunte nelle seguenti:
1.
segretezza della chiave;
2.
semplicità della chiave (per evitare possibili malintesi o errori al momento dello scambio tra
mittente e destinatario);
3.
alto numero di potenziali chiavi tra cui scegliere.
17
Come si può notare la 2) e la 3) sono collegate tra loro, infatti, nel sistema descritto sopra, si potrebbe
scegliere una chiave più semplice, sacrificando il numero di chiavi potenziali.
Infatti, invece di generare l’alfabeto cifrante da una riorganizzazione casuale dell’alfabeto ordinario, lo si
può fare a partire da una parola chiave come nel seguente esempio. Supponiamo di accordarci sulla parola
chiave ‘laura’, si eliminano eventuali spazi e lettere ripetute, quindi la parola chiave diventa ‘laur’, a questo
punto, la sequenza l a u r sarà l’inizio dell’alfabeto cifrante, cui seguiranno tutte le altre lettere mancanti in
ordine alfabetico partendo dall’ultima lettera della chiave, per cui l’alfabeto cifrante che si ottiene sarà l a u r s t
v z b c d e f g h i m n o p q.
I crittosistemi, basati sulla sostituzione, hanno dominato la scena per tutto il primo millennio della nostra era,
finché i crittoanalisti non trovarono il suo punto debole ed elaborarono un metodo per decifrarne i crittogrammi prodotti.
La violazione di tali sistemi si basa su un’idea, dovuta per prima a crittoanalisti arabi, nella quale si
combinano conoscenze di linguistica, statistica e matematica, nota con il nome di analisi delle frequenze.
Essa è descritta dallo studioso del IX secolo Abu Yusuf ibn Ishaq al-Kind, sopran-nominato il filosofo
degli arabi, in una sua monografia, dal titolo Sulla decifrazione dei messaggi crittati, ritrovata nell’archivio
ottomano Sulaimaniyyah di Istanbul solo nel 1987. Nel testo si legge:
Un modo di svelare un messaggio crittato, se conosciamo la lingua dell’originale, consiste nel trovare
un diverso testo chiaro nella stessa lingua, abbastanza lungo da poter calcolare la frequenza di ciascuna
lettera.
Chiamiamo “prima” quella che compare più spesso, “seconda” quella che la segue per frequenza,
“terza” la successiva, e così via, fino a esaurire tutte le lettere del campione di testo chiaro.
Esaminiamo poi il testo in cifra che vogliamo interpretare, ordinando (in base alla frequenza) anche i
suoi simboli. Troviamo il simbolo più comune, e rimpiazziamolo con la “prima” lettera dell’esempio
chiaro; il simbolo che lo segue per frequenza sia rimpiazzato dalla “seconda” lettera, il successivo simbolo
più comune sia rimpiazzato dalla “terza”, e così via, fino ad aver preso in considerazione tutti i simboli del
crittogramma che intendevamo svelare.
Tabella 4. Frequenze delle diverse lettere in italiano.
Per superare l’analisi delle frequenze, furono ideati diversi nuovi metodi crittografici tra cui ricordiamo
1.
il metodo di sostituzione omofonica;
2.
il metodo di sostituzione polialfabetica.
18
Il metodo di sostituzione omofonica consiste nel sostituire ogni lettera con un numero di simboli, per
esempio numeri, proporzionale alla sua frequenza. Così, ad esempio la lettera a, avendo una frequenza di 11, 74,
viene sostituita da 11 simboli, la lettera b con un solo simbolo, la lettera c con 4 simboli ecc., secondo la tabella 5.
Il metodo di sostituzione polialfabetica consiste nell’uso di più alfabeti cifranti, su un’idea di Leon
Battista Alberti che propose di utilizzarne due. L’algoritmo consiste nel sostituire la prima lettera del messaggio
in chiaro con la corrispondente del I alfabeto cifrante, la seconda lettera con la corrispondente del II alfabeto
cifrante, la terza con la corrispondente del I e così via passando alternativamente dal I alfabeto al secondo. Come
nell’esempio della figura 3.
Tabella 5. Corrispondenza lettere e simboli nella sostituzione omofonica.
Figura 3. Il metodo di sostituzione polialfabetica.
Su tale idea si basa il metodo di Blaise de Vigenère, diplomatico francese, nato nel 1523, il quale utilizza
tanti alfabeti cifranti, quante sono le lettere dell’alfabeto in chiaro, ad esempio nell’alfabeto italiano, che consta
di 21 lettere, utilizza 21 alfabeti cifranti.
Il primo passo consiste nel costruire la tavola di Vigenère, in cui nella prima riga è riportato l’alfabeto in
chiaro, e, in ognuna delle 21 righe successive, è riportato un alfabeto cifrante, spostato di una lettera rispetto a
quello della riga precedente, così nella riga 1 è riportato l’alfabeto spostato di una lettera, nella riga 2, quello
spostato di due lettere, nella riga 3 quello spostato di tre, fino alla riga 20 in cui è riportato quello spostato di 20
lettere (figura 4).
19
Figura 4. La tavola di Vigenère.
Il secondo passo consiste nello scegliere una parola chiave: per esempio ‘vero’. Pertanto il messaggio in
chiaro “non andare” verrebbe cifrato come nella figura 5.
La differenza sostanziale tra la cifratura omofonica e quella polialfabetica è che in quella omofonica a
ogni lettera corrispondono più simboli, ma ogni simbolo è il corrispondente di una sola lettera, cioè è una
corrispondenza 1
→
m, che invertita diventa m 1; in quella polialfabetica a ogni lettera corrispondono più
→
simboli e anche ogni simbolo è il corrispondente di più lettere cioè m m, che rimane tale anche invertendola.
→
Il vantaggio della cifratura polialfabetica è pertanto la sua resistenza all’analisi delle frequenze. Oltre ad
ammettere un enorme numero di chiavi, infatti si può scegliere qualunque parola del dizionario, qualunque
combinazione di parole, si può perfino ricorrere a neologismi, rendendo impossibile il controllo di tutte le chiavi
possibili. Ed ecco perché è ritenuta più affidabile e non ha mai smesso di essere usata.
Figura 5. Cifratura polialfabetica del messaggio “non andare”.
20
Oggi sono noti tutti i punti deboli del sistema di Vigenère, ed esistono vari procedimenti per decifrare i
crittogrammi generati da tale sistema, che sfruttano ad esempio la modularità nel ripetere la chiave o
osservazioni sulle ripetizioni del testo cifrato. Ci sono testimonianze storiche che uno di tali procedimenti sia
stato ideato da Sir Charles Babbage, famoso per aver progettato e mai realizzato la macchina alle differenze,
progenitrice degli odierni calcolatori. La prima descrizione resa pubblica del metodo però è del 1863, portata a
compimento dall’ufficiale prussiano F. W. Kasiski.
Un’osservazione decisiva fu che le insidie del metodo di Babbage potevano essere evitate utilizzando
nella cifratura di Vigenère una chiave molto lunga e fatta da lettere che si succedono in modo casuale: se un
messaggio cifrato non presenta delle ripetizioni, se non è possibile tentare di indovinare la chiave, cadono tutti
gli appigli necessari per effettuare con successo la crittoanalisi.
Tale osservazione fu ulteriormente sviluppata da G. S. Vernam, che nel 1926 introdusse l’idea di usare
una chiave casuale lunga quanto il messaggio stesso.
Oggi sappiamo, grazie agli studi di Claude Shannon del 1949, che tale metodo può definirsi
“teoricamente sicuro”.
In pratica però ciò comporta la difficoltà di costruire lunghe stringhe di lettere assolutamente casuali e di
scambiarsi segretamente e continuamente queste chiavi. In sostanza risulta impraticabile: per ogni messaggio
scambiato in modo sicuro è necessario prima trasmettere in modo sicuro il messaggio contenente la chiave.
I metodi usati per buona parte del Novecento sono delle rielaborazioni sempre più complesse delle idee
descritte finora, ottenute anche con la costruzione di dispositivi per la meccanizzazione delle procedure di
cifratura e decifratura. Un esempio tra i più conosciuti è la macchina Enigma usata dai tedeschi durante la
Seconda guerra mondiale, inventata dall’ingegnere Arthur Scherbius. Enigma consisteva di diversi ingegnosi
elementi combinati in un potente e sofisticato dispositivo per la produzione di scritture segrete. In particolare ma
macchina aveva tre componenti collegati da fili elettrici: una tastiera per immettere le lettere del testo chiaro;
un’unità scambiatrice che cifra la lettera trasformandola nel corrispondente elemento del crittogramma; e un
visore con varie lampadine, che accendendosi indicano la lettera da inserire nel crittogramma.
Lo sforzo per violare questa cifratura richiese anni di lavoro, e fu portato a compimento dalla Scuola
Inglese Governativa di Codici e Cifre di Bletchley Park, di cui faceva parte Alan M. Turing, noto oggi ai più per
i suoi studi sull’intelligenza meccanica.
La crittografia nell’era dell’informatica
Nel 1945 fu realizzato ENIAC (Electronic Numerical Integrator And Calculator), un’apparecchiatura
contenente 18 000 valvole elettroniche capace di effettuare 5000 calcoli al secondo, considerato il capostipite
dei moderni calcolatori.
Dopo il 1945 fu l’informatica a fare da protagonista nella battaglia tra crittografi e crittoanalisti, operando
una decisiva svolta nelle metodologie di entrambi. Infatti i metodi precedenti l’era dell’informatica basavano la
propria sicurezza sull’enorme numero di chiavi disponibili e sulla loro lunghezza, ma che viene messa in crisi
dalla crescente potenza di calcolo dei computer. Un computer molto potente, infatti, potrebbe individuare quella
giusta in pochi minuti anche nel caso di un milione di chiavi da esaminare.
Tutti i metodi crittografici esaminati finora necessitano di:
21
1.
un algoritmo generale di cifratura G
2.
di una chiave K che deve rimanere segreta
3.
di un algoritmo di decifrazione H=G–1 (inverso di G)
e agiscono secondo il seguente schema:
il messaggio in chiaro M, tramite l’algoritmo G e la chiave K, viene cifrato in MC, quest’ultimo, tramite
l’algoritmo H e la stessa chiave K viene decifrato in M (figura 6).
Figura 6. Schema di metodi crittografici.
La sicurezza di tali sistemi risiede interamente nella segretezza delle chiavi. Ne segue che per distribuire
agli utenti le chiavi è necessario ricorrere a canali sicuri.
Gli svantaggi che ne derivano sono essenzialmente:
1.
difficoltà nella distribuzione delle chiavi agli utenti;
2.
mancata autenticazione dei messaggi; mittente e destinatario condividono la stessa chiave,
pertanto non c’è modo di impedire che il destinatario si invii messaggi che poi sembrino
provenienti dal mittente. Si pensi quali problemi possono provocare simili falsificazioni nella
posta elettronica o nei sistemi bancari elettronici.
La svolta avvenne nel 1976 a opera di Diffie e Hellmann che proposero un metodo detto a chiave
pubblica il quale non necessita di uno scambio preventivo delle chiavi segrete. L’dea è chiarita dal seguente
esempio noto come esempio del doppio lucchetto.
Supponiamo di avere due utenti Mitt e Dest, e Mitt voglia spedire un messaggio segreto a Dest.
1.
Mitt mette il messaggio in una scatola che chiude con il proprio lucchetto LMitt (di cui solo lui ha
la chiave) e spedisce la scatola a Dest;
2.
Dest, ricevuta la scatola, aggiunge un proprio lucchetto LDest (di cui solo lui ha la chiave) e
rispedisce la scatola a Mitt;
3.
Mitt, ricevuta la scatola con il doppio lucchetto, toglie il lucchetto LMitt e rispedisce la scatola a
Dest;
4.
Dest, ricevuta la scatola, può togliere il lucchetto LDest e leggere il messaggio di Mitt.
Il problema della distribuzione delle chiavi sembra risolto, perché lo schema a doppia chiave non richiede
la condivisione delle stesse. Tuttavia la realizzazione pratica di un tale sistema si scontra con un altro problema,
quello riguardante l’ordine in cui cifrature e decifrature sono eseguite. In altre parole, in un sistema crittografico
è essenziale l’ordine con cui avvengono le rispettive cifrature e decifrature, in quanto la cifratura eseguita per
22
ultimo andrebbe decifrata per prima (è un po’ come quando la mattina infiliamo prima le calze e poi le scarpe,
ma alla sera togliamo prima le scarpe e poi le calze).
L’esempio del doppio lucchetto in cui ciò non avviene, sembra tuttavia funzionare come idea perché ai
fini dell’apertura della scatola non ha importanza l’ordine di rimozione dei lucchetti.
Anche se il trucco dei due lucchetti non sembra immediatamente applicabile, tuttavia fu il giusto punto di
partenza per la realizzazione di un sistema crittografico che aggira l’ostacolo della distribuzione delle chiavi.
Infatti l’idea è che mittente e destinatario generano ciascuno due chiavi distinte: una chiave di cifratura E
(da utilizzare nell’algoritmo di cifratura); e una chiave di decifrazione D (da utilizzare nell’algoritmo di
decifrazione). Le chiavi sono correlate, nel senso che servono per effettuare operazioni inverse (figura 7).
Figura 7. Le chiavi correlate per effettuare operazioni invese.
Il trucco consiste nell’impossibilità di poter derivare la chiave D dalla chiave E mediante algoritmi di
calcolo (figura 8).
Ogni utente può rendere pubblica la propria chiave di cifratura E, indicandola magari sull’elenco
telefonico, senza compromettere la propria chiave di decifrazione, che rimane segreta, di pubblico dominio sono
anche gli algoritmi di cifratura G e decifrazione H.
Figura 8. Inapplicabilità del metodo del doppio lucchetto.
Pertanto l’esempio del doppio lucchetto viene così interpretato:
1.
il destinatario pubblica la chiave di cifratura E e mantiene segreta la chiave di decifrazione D;
2.
il mittente applica GE al messaggio M trasformandolo nel messaggio cifrato MC cioè
GE(M)=MC, che spedisce al destinatario;
3.
il destinatario applica HD al messaggio cifrato MC riottenendo M cioè HD(MC)=M.
23
La sicurezza di un tale sistema si fonda sulla difficoltà di poter:
1.
ritrovare il testo cifrato provando ad applicare l’algoritmo GE, che è pubblico, ad ogni possibile
testo in chiaro, il cui numero pur essendo enorme è comunque finito;
2.
ricavare l’algoritmo HD da GE;
in quanto entrambe le tecniche sono computazionalmente inattuabili, nel senso che richiedono un tempo
di calcolo di lunghezza al di fuori di ogni possibile considerazione, anche per i più potenti calcolatori.
Per descrivere tali algoritmi sono necessari alcuni concetti matematici che andiamo a illustrare.
Figura 9. Schema di cifrario a chiave pubblica.
L’aritmetica modulare
L’aritmetica modulare, la cui introduzione è dovuta a Gauss, costituisce un sistema di calcolo con
importanti applicazioni nei test di primalità e nei metodi che stanno alla base della sicurezza delle comunicazioni
elettroniche. Con essa infatti si hanno i seguenti vantaggi: 1) si riduce lo spazio dei numeri su cui gli algoritmi
sono chiamati ad operare e quindi si aumenta la velocità di calcolo; 2) si riesce a rendere difficili alcuni problemi
computazionali che sono semplici (o addirittura banali) nell’algebra ordinaria, al fine di aumentare la sicurezza
nelle comunicazioni. L’idea è semplice ma potente. Forse non lo sappiamo ma usiamo spesso l'aritmetica
modulare. Potremmo chiamarla aritmetica dell'orologio.
Infatti pensiamo ad un normale orologio con 24 ore. Se sono le 15 ed un amico ci comunica che sarà a
casa nostra tra 5 ore, sappiamo che egli verrà alle 20, infatti 15+5=20. Ma, se sono le 23 e dobbiamo partire fra 7
ore, certamente non diciamo che la partenza sarà alle 30, anche se 23+7=30. Sappiamo che dovremo partire alle
6. Allo stesso modo se sono le 20 che ora sarà tra 14 ore? Non diremo 34 anche se 20+14=34, ma diremo che
sono le 10. Come si spiega tutto ciò?
Immaginiamo di segnare sul quadrante dell’orologio 24 ore. Se la lancetta segna le 23, aggiungere 7 ore
significa spostarsi di 7 posti fino ad arrivare alle 6. Si giunge allo stesso risultato calcolando 23+7=30, ed
osservando che 30=1⋅24+6 o che è lo stesso 30:24 =1 con resto 6, che significa che 30 lo si ottiene facendo fare
alla lancetta un giro completo più 6.
24
Se la lancetta segna le 20 e aggiungiamo 14 ore l’orologio segnerà le 10 perché 20+14=34, ma 34:24= 1
con resto 10, per cui 34 lo si ottiene percorrendo un giro completo più 10.
Proviamo con il normale orologio a 12 ore. I numeri che vediamo sul quadrante sono 0, 1, 2, 3, 4, 5, 6, 7,
8, 9, 10, 11. Il numero 12 non compare perché, a partire da 0, trascorse 12 ore, torniamo di nuovo a 0. Questa
volta per fare un giro completo occorrono 12 ore. Pertanto se sono le 7, che ore saranno tra 24 ore? Saranno
ancora le 7 perché 7+24=31, ma 31:12 = 2 con resto 7, cioè si compiono 2 giri completi più 7; se sono le 8, tra 6
ore saranno le 2, perché 8+6=14, ma 14:12=1 con resto 2. Dagli esempi dovrebbe risultare chiaro allora che ciò
che contano non sono i risultati delle somme ma i loro resti nelle divisioni per il numero delle ore segnate sul
quadrante dell’orologio.
La stessa cosa succede con i giorni della settimana, se pensiamo a un orologio con 7 ore sul quadrante.
Facciamo corrispondere ai giorni della settimana i numeri da 0 a 6 (figura 10).
domenica
↓
0
Lunedì
↓
1
Martedì
↓
2
Mercoledì
↓
3
Giovedì
↓
4
Venerdì
↓
5
Sabato
↓
6
Figura 10. Corrispondenza dei giorni della settimana con i numeri da 0 a 6.
Se per esempio oggi è venerdì che giorno sarà tra 12 giorni?
Dovremo calcolare 5+12=17, ma i giorni si ripetono ogni 7, pertanto, osservando che 17:7 =2 con resto 3,
possiamo concludere che a partire da 5 e aggiungendo 12 si compiono 2 giri completi più 3, ed essendo 3 il
numero corrispondente a mercoledì, concludiamo che sarà mercoledì. Facciamo un altro esempio: se oggi è
lunedì (1), che giorno sarà tra 20 giorni? Calcoliamo 1+20=21, 21:7= 3 con resto 0, quindi sarà domenica.
Il numero n delle ore sull’orologio costituisce quello che si chiama il modulo e individua l’aritmetica di
modulo n, in cui l’insieme dei numeri con i quali si opera, indicato con Zn, è l’insieme dei possibili resti della
divisione per n e cioè Zn={0, 1, 2, 3, …, n–1}e le operazioni si eseguono con le regole illustrate negli esempi
precedenti.
L’esempio dell’orologio a 24 ore costituisce la cosiddetta aritmetica finita di modulo 24, in essa Z24={0,
1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23} essendo questi ultimi i possibili resti
della divisione per 24. L’orologio a 12 ore costituisce l’aritmetica finita di modulo 12, in essa Z12={0, 1, 2, 3, 4,
5, 6, 7, 8, 9, 10, 11}, essendo questi ultimi i possibili resti della divisione per 12. L’esempio dei giorni della
settimana è l’aritmetica finita di modulo 7, in cui Z7={0, 1, 2, 3, 4, 5, 6} essendo questi ultimi i possibili resti
della divisione per 7. Riassumiamo costruendo un’aritmetica finita di modulo 4. I possibili resti della divisione
per 4 sono: 0, 1, 2, 3 quindi Z4={0,1,2,3}. L’addizione e la moltiplicazione in Z4 si esegue come negli esempi
della tabella 6.
25
operazioni
indicate
2+2
Risultato
nell’aritmetica
ordinaria
4
3+2
5
2+1
3
3⋅3
9
3⋅2
6
2⋅2
4
Risultato
nell’aritmetica
modulo 4
0 perché 4:4=1
con resto 0
1 perché 5:4=1
con resto 1
3 perché 3:4=0
con resto 3
1 perché 9:4=2
con resto 1
2 perché 6:4=1
con resto 2
0 perché 4:4=1
con resto 0
Tabella 6. Addizione e moltiplicazione nell’aritmetica finita di modulo 4.
Si possono costruire le tavole dell’addizione e della moltiplicazione dell’aritmetica modulo 4, che costituiscono
le tabelline di questa aritmetica, sulla base delle quali si esegue qualsiasi addizione e moltiplicazione modulo 4.
Nella tabella 7 sono spiegate le tabelline dell’aritmetica in modulo 4.
+ 0 1 2 3
x 0 1 2 3
0 0 1 2 3
0 0 0 0 0
1 1 2 3 0
1 0 1 2 3
2 2 3 0 1
2 0 2 0 2
3 3 0 1 2
3 0 3 2 1
Tabella 7. Tavole dell’addizione e della moltiplicazione dell’aritmetica modulo 4.
Infine per indicare che due numeri a e b, divisi per n danno lo stesso resto, si usano le seguenti notazioni
tutte equivalenti tra loro:
a=b mod n; a–b=0 mod 4; a ≡ b (mod n) che si legge a è congruo b modulo 4.
Esempio:
26=12 mod 7 è la stessa cosa di
26–12=0 mod 7 che è la stessa cosa di
26 ≡ 12 (mod 7) e tutte e tre stanno a indicare che 26 e 12, divisi per 7 danno lo stesso resto che è 5, e
pertanto sono tutti equivalenti a 5.
Facciamo vedere come sfruttare l’aritmetica modulare per calcolare potenze come 2341 (figura 11). Il
metodo si basa sulla proprietà che il resto del quadrato di un numero a per un dato modulo n è uguale al
quadrato del resto dello stesso numero a per lo stesso modulo n cioè a2 mod n =(a mod n)2.
26
22 mod 341=4
24=(22)2=(22 mod 341)2=42=16mod341=16
28=(24)2=(16)2=256mod341=256
216= (28)2=(256)2=65536mod341=64
232=(216)2=(64)2=4096mod341=4
264=(232)2=42=16mod341=16
2128=(264)2=(16)2=256mod341=256
2256=(2128)2=(256)2=65536mod341=64
2341=2(256+64+16+4+1)
= 2256
x 264
x
216
x
24
x
2
x
21
x 1
64
=
1024 mod
341
1
x
64
64
x 16
= 1
1024 mod
341
Figura 11. Il metodo per calcolare 2341.
La funzione di Eulero
Per ogni intero n>1 si definisce la funzione di Eulero = numero di interi minori di n e primi con esso. Ad
esempio:
•
φ (5) = 4 perché gli interi minori di 5 sono 1, 2, 3, 4 ed essi sono tutti primi con n,
•
φ (6) = 2 perché gli interi minori di 6 sono 1, 2, 3, 4, 5 e fra essi solo 1 e 5 sono primi con 6,
•
φ (7 ) = 6 perché gli interi minori di 7 sono 1, 2, 3, 4, 5, 6 ed essi sono tutti primi con 7,
•
φ (12) = 4 perché gli interi minori di 12 sono 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 e fra essi solo 1, 5, 7,
11 sono primi con 12.
Se si conosce la scomposizione in fattori del numero n, il seguente teorema ci fornisce un metodo per
calcolare . Infatti esso afferma che: per ogni n>1, non primo,
p1, p2, …, pn sono i fattori primi di n, presi senza molteplicità.
27

φ
( n ) = n ⋅ 1 −

1  
1 
1 

 dove
 ⋅ 1 −
 ⋅ ....... ⋅ 1 −
p1  
p2 
p

n 
Ad esempio:
1
1
2 1
essendo 12 = 3⋅2⋅2, (12) = 12 ⋅ 1 −  ⋅ 1 −  = 12 ⋅ ⋅ = 4 ;
3 2
 3  2
φ
1
1
2 1
essendo 6=2⋅3, (6 ) = 6 ⋅ 1 −  ⋅ 1 −  = 6 ⋅ ⋅ = 2 ;
3
2
3 2

 

φ
p −1 q −1
 1   1
⋅
= ( p − 1) ⋅ (q − 1) .
se n=p⋅q, (n ) = n ⋅ 1 −  ⋅ 1 −  = n ⋅
p
q
p
q

 

φ
Ovviamente se n è un numero primo = n–1.
Vale inoltre il seguente teorema di Eulero: per n>1 e per ogni a<n e primo con n si ha .
Ad esempio, per n=6 φ (6 ) = 2 infatti i primi con 6 sono 1 e 5 per il teorema di Eulero si ha:
12 = 1 ≡ 1 mod 2
52 = 25 ≡ 1 mod 2
per n=5 φ (5) = 4 e i primi con 5 sono 1, 2, 3, 4 e per il teorema di Eulero si ha:
14 = 1 ≡ 1 mod 5
24 = 16 ≡ 1 mod 5
34 = 81 ≡ 1 mod 5
44 = 256 ≡ 1 mod 5
Si può notare come nel caso in cui n è un numero primo si ritrova il piccolo teorema di Fermat.
Infatti per n primo φ (n ) = n–1 e per il teorema di Eulero per ogni a<n e primo con n. Ricordiamo infatti
che il piccolo teorema di Fermat afferma che se n è un numero primo e a un intero minore di n allora è
divisibile per n, che con il linguaggio dell’aritmetica modulare diventa , che può essere riscritto e se a è primo
con n allora è che è equivalente a .
Infine si prova che per ogni a<n e primo con esso esiste l’inverso di a e esso è dato da aφ ( n )−1 . Infatti
a⋅a
φ
( n )−1
φ
=a
(n)
≡ 1modn per il teorema di Eulero. Si ricorda che l’inverso di un numero a è quel numero che
moltiplicato per a dà 1, indicato convenzionalmente con a–1.
Ad esempio, per n=5,, i primi con 5 sono 1, 2, 3, 4 e per ognuno di questi esiste l’inverso, infatti:
•
l’inverso di 1 è 1
•
l’inverso di 2 è 2
•
l’inverso di 3 è 3
•
l’inverso di 4 è 4
φ
φ
φ
φ
(5 ) −1
= 14 −1 = 13 = 1 ≡ 1mod5 e infatti
(5 )−1
= 24 −1 = 23 = 8 ≡ 3mod5 e infatti
(5 )−1
= 34 −1 = 33 = 27 ≡ 2mod5 e infatti
(5 )−1
= 4 4 −1 = 43 = 64 ≡ 4mod5 .
Le funzioni unidirezionali
Chiamiamo funzione da un insieme A a un insieme B, qualunque procedura che associa a ogni elemento
di un insieme A (detto dominio), uno e un solo elemento di un insieme B (detto condominio). In simboli f:
A
→
B. Se poi indichiamo con x il generico elemento dell’insieme A e con y il generico elemento dell’insieme B,
la f indica la procedura che ad ogni x∈A associa un y∈B e cioè y=f(x), ad esempio “fare il doppio di…”,
28
prendendo come dominio e codominio l’insieme dei numeri interi, è in questo senso una funzione, perché dato
ad esempio il numero 3 lo trasforma nel numero 6, come 5 lo trasforma in 10 e così via.
Molte funzioni matematiche sono cosiddette bidirezionali, nel senso che è facile dato un determinato x
generare il corrispondente y, ma è altrettanto facile, invertire la funzione cioè ritrovare l’elemento x originario a
partire dal suo corrispondente.
Facciamo qualche esempio:
•
•
funzione:
x fare il doppio 2⋅x= y;
3
funzione inversa:
y=2⋅x
6=2⋅3
funzione:
x fare il quadruplo 4⋅x aggiungere 1 ⋅y=4⋅x +1;
→
→
x;
fare la metà
→
→
→
→
5
→
fare il quadruplo
→
→
2⋅3 = 6
fare la metà 3
→
→
→
4⋅5
→
fare il doppio
→
aggiungere 1
→
4⋅5 +1=21
→
y=4⋅x +1 sottrarre 1 4⋅ x dividere per 4 x;
funzione inversa:
→
→
sottrarre 1
21=4⋅5 +1
→
→
→
4⋅ 5
→
→
dividere per 4
→
5.
Le funzioni unidirezionali sono invece quelle funzioni facilmente calcolabili, ma che non si possono invertire.
Le funzioni cosiddette pseudounidirezionali (dette anche funzioni trappola a molla segreta) sono invece
quelle funzioni facilmente calcolabili, ma che non altrettanto facilmente si possono invertire, a meno che non si
conoscano alcune informazioni (la molla segreta) utilizzate nella loro costruzione.
L’aritmetica modulare gioca un ruolo determinante in questo caso, infatti permette di trasformare
funzioni bidirezionali in funzioni pseudounidirezionali.
Facciamo l’esempio della funzione “fare il quadruplo”, in simboli f(x)=4⋅x. È facilmente calcolabile,
perché dato x per ottenere f(x) basta moltiplicare per 4, ma è altrettanto facile calcolare la sua inversa perché
dato f(x) basta dividere per 4 per ottenere l’originario x. Ma anche se non avessimo la procedura inversa di
dividere per 4, sarebbe facile ritrovare l’elemento originario anche procedendo per tentativi ed eliminazione:
infatti se per esempio f(x) =20, si può tentare x=3. in tal caso f(x)=12, troppo piccolo quindi x deve essere
maggiore di 3. Si può allora pensare a 6, ma f(x)=24, troppo grande, quindi x deve essere minore di 6, e così via.
Vediamo cosa accade se calcoliamo utilizzando una aritmetica modulare. Per esempio consideriamo la
stessa funzione f(x)=4⋅x in una aritmetica modulo 7. Possiamo osservare che la funzione non si comporta più in
modo regolare come prima, per accorgersene basta costruire una tabella (tabella 8).
x
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
f(x)=4⋅x
4
8
12
16
20
24
28
32
36
40
44
48
52
56
60
f ( x )=4⋅mod 7
4
1
5
2
6
3
0
4
1
5
2
6
3
0
4
Tabella 8. La funzione f(x)=4⋅x in una aritmetica modulo 7.
Anche in questa semplice situazione è chiaro che è più complicato invertire la funzione e pertanto i valori
di x sono molto meglio protetti. Si può fare anche l’esempio della funzione esponenziale f(x)=3 x (tabella 9).
x
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
3
1
8
27
64
125
216
343
512
729
1000
…
…
…
…
…
3
1
8
5
9
4
7
2
6
3
10
…
…
…
…
…
f(x)=x
f(x)=x mod 11
Tabella 9. La funzione f(x)=3 x in aritmetica modulo 11.
29
Il cifrario a chiave pubblica RSA
Uno dei più noti sistemi crittografici a chiave pubblica, che sfrutta le idee precedentemente descritte, è il
metodo RSA, proposto dai matematici R. L. Rivest, A. Shamir e L. Adlemann nel 1978. Esso risolve il problema
dello scambio delle chiavi, in quanto queste ultime sono conosciute solamente ai rispettivi proprietari, che non le
hanno preventivamente concordate e scambiate.
Illustriamo schematicamente come i due utenti Mitt e Dest possano scambiarsi un messaggio segreto
utilizzando il metodo RSA. Entrambi Mitt e Dest, indipendentemente l’uno dall’altro, poi:
1.
scelgono in modo casuale due numeri primi p, q grandi (di 200-300 cifre in base 10);
2.
calcolano N = p⋅q e Φ(N) = (p–1)⋅(q–1);
3.
scelgono un intero e<Φ(N) e primo con Φ(N), tale numero e sarà la chiave pubblica;
4.
calcolano il numero d, inverso di e mod Φ(N), tale cioè che e⋅d 1mod Φ(N), tale numero d sarà
≡
la chiave privata;
5.
rendono pubblici i numeri N ed e.
Mitt per spedire un messaggio a Dest compie le seguenti operazioni:
1.
codifica il messaggio in un modo standard usando i numeri < N;
2.
trasforma ogni numero M di tale codifica in Me (mod N) e lo spedisce a Dest;
per decodificare il messaggio ricevuto Me, Dest calcola (Me)d =Me⋅d =M–1=M (modN), riottenendo il messaggio
originale.
Figura 12. Schema di cifrario con metodo RSA.
30
Figura 13. Esempio di applicazione di metodi RSA.
In che cosa consiste la sicurezza del metodo? Da quanto esposto si osserva che per decodificare il
messaggio bisogna
1.
conoscere d (chiave segreta);
2.
essendo d l’inverso di e nell’aritmetica mod Φ(N), essendo e noto, è necessario conoscere Φ(N);
3.
ma, noto N, per calcolare Φ(N) è necessario conoscere i fattori primi di N, cioè è necessario fattorizzare
N, che è un problema computazionalmente difficile, per quanto osservato in precedenza.
Anche se non è stato dimostrato che non si possa rompere il codice in altro modo, e cioè senza conoscere Φ(N) e i
fattori di N, a tutt’oggi si può affermare che la sicurezza del metodo dipende essenzialmente dai seguenti fatti.
Per codificare il messaggio bisogna saper costruire dei numeri primi grandi, e tale operazione è
computazionalmente veloce; si può infatti dimostrare che la complessità computazionale di opportuni test di
primalità per stabilire se un numero n è primo, utilizzando il linguaggio di quel ramo della matematica nota
come teoria della complessità, è “quasi-polinomiale”.
Per violare il sistema bisogna saper fattorizzare interi grandi ottenuti come prodotto di due primi, tale
problema è computazionalmente “lento”, cioè, con il linguaggio della teoria della complessità, appartiene alla
classe dei problemi non polinomiali. Tale marcata differenza tra la velocità di esecuzione delle operazioni di
costruzione di numeri primi grandi e di fattorizzazione di interi grandi garantisce la sicurezza del metodo,
almeno per un tempo sufficientemente lungo. Ad esempio, con la tecnologia attuale l’operazione di
fattorizzazione di un intero di 140 cifre in base 10, prodotto di due numeri primi casuali calcolati in pochi
secondi su un computer disponibile in commercio, richiede, utilizzando vari supercomputers operanti
parallelamente, circa un mese!
La RSA Security Inc. gestisce una sfida a livello mondiale, ove vengono premiati coloro che fattorizzano
gli interi proposti da loro in una particolare lista. Ad esempio, il 3 dicembre del 2003, è stato fattorizzato
31
rsa576 =
188198812920607963838697239461650439807163563379417382700763356422988859715234
665485319060606504743045317388011303396716199692321205734031879550656996221305
168759307650257059
un numero di 174 cifre decimali, prodotto di due primi di 87 cifre:
p=
398075086424064937397125500550386491199064362342526708406385189575946388957261
768583317
q=
472772146107435302536223071973048224632914695302097116459852171130520711256363
590397527
Le chiavi attualmente utilizzate dall'RSA sono a 309 cifre decimali.
La firma digitale
Consideriamo al solito un mittente che deve inviare a un destinatario un messaggio m. La codifica di m
con il metodo descritto, assicura l’autenticità del messaggio, ma non fornisce alcuna sicurezza sulla sua
paternità. Infatti il messaggio m, pur essendo autentico, potrebbe essere stato inviato da qualcuno che si spaccia
per il mittente. Questa è un'importantissima questione, particolarmente nella trasmissione di messaggi, che oltre
a dover essere segreti, devono garantire la loro origine.
Si dovrebbe quindi disporre di un analogo della firma manuale, detta appunto firma digitale. La firma
digitale deve allora essere progettata in modo da possedere le stesse caratteristiche di una firma manuale e cioè:
l’autenticità, la non falsificabilità e l’impossibiltà di essere riutilizzata. Facciamo vedere come lo stesso metodo
RSA può essere utilizzato per progettare una firma digitale.
La situazione è la seguente: il mittente (di seguito indicato con Mitt) invia un messaggio m con la firma
F, al destinatario (di seguito indicato con Dest). Siano a, b, rispettivamente le chiavi pubblica e segreta di MITT;
siano e, d, rispettivamente le chiavi pubblica e segreta di DEST.
La procedura per apporre la firma digitale F al messaggio m è illustrata nei seguenti passi, riassunti nel
grafico della figura 14.
1.
Mitt cripta la firma F (cioè i suoi dati identificativi), usando la propria chiave segreta (b),
ottenendo Fb;
2.
il messaggio m con la firma F criptata viene ulteriormente criptato con la chiave pubblica di
Dest (e), ottenendo (m Fb)e;
3.
Dest decodifica il messaggio con la sua chiave segreta (d), ottenendo
((m Fb)e)d = (me F(be)) d =m(e d)F(be d) = mFb
in cui la firma di Mitt è ancora criptata;
4.
Dest decodifica la firma di Mitt con la chiave pubblica di Mitt (a), ottenendo
(Fb)a = F(ba) = F.
32
Grafico firma digitale
pubblica
segreta
d
e
segreta
pubblica
b
a
Mitt
decodifica
decodifica
codifica
6
4
2
b
Fb
1
e
(Fb)e
d
((Fb)e)d=(Fb)ed=(Fb)1=Fb
7
5
3
a
(Fb)a=(F)ba=(F)1=F
codifica
Dest
8
Figura 14. Grafico firma digitale.
Bibliografia
Thomas Beth, Comunicazioni e sicurezza su Internet, in “Le Scienze”, n. 330, febbraio 1996.
Brian Butterworth, Intelligenza matematica. Vincere la paura dei numeri scoprendo le doti innate della mente,
Rizzoli, Milano 1999.
John H. Conway, Richard K. Guy, Il libro dei numeri, Hoepli, Milano 2003.
Richard Courant, Herbert Robbins, Che cos’è la matematica?, Boringhieri, Torino 1971.
Philip J. Davis, Il mondo dei grandi numeri, Zanichelli, Bologna 1973.
Keith Devlin, Dove va la matematica, Bollati Boringhieri, Torino 1994.
Jean Dieudonné, L’arte dei numeri: matematica e matematici oggi, Mondadori, Milano 1989.
Martin E. Ellmann, La crittografia a chiave pubblica, in La matematica della complessità, Quaderni n. 67,
settembre 1992, Le Scienze.
Paolo Ferragina, Fabrizio Luccio, Crittografia: principi – Algoritmi – Applicazioni, Bollati Boringhieri, Torino
2001.
Godfrey H. Hardy, Apologia di un matematico, Garzanti, Milano 1989.
Morris Kline, Storia del pensiero matematico, Einaudi, Milano 1991.
Serge Lang, La bellezza della matematica, Bollati Boringhieri, Torino 1991.
Mauro Leoncini, Modelli di calcolo e complessità computazionale, in La matematica computazionale, Quaderni
n. 84, giugno 1995, Le Scienze.
Fabrizio Luccio e Linda Pagli, P = NP?, in La matematica della complessità, Quaderni n. 67, settembre 1992,
Le Scienze.
Piergiorgio Odifreddi, La Matematica del Novecento: dagli insiemi alla complessità, Einaudi, Torino 2000.
33
“Periodico di matematiche”, Serie VII, Volume 7, Numero 2-3, luglio-dicembre 2000, Mathesis.
“Periodico di matematiche”, Serie VIII, Volume 1, Numero 1, gennaio-marzo 2001, Mathesis.
Carl Pomerance, Alla ricerca dei numeri primi, in “Le Scienze”, n. 174, febbraio 1983.
Simon Singh, Codici e segreti: la storia affascinante dei messaggi cifrati dall’antico Egitto a Internet, Rizzoli,
Milano 1999.
Marcus du Sautoy, L’enigma dei numeri primi: l’ipotesi di Riemann, l’ultimo grande mistero della matematica,
Rizzoli, Milano 2004.
Gary Stix, I segreti meglio custoditi: la crittografia quantistica è passata dalla teoria al laboratorio, per
approdare finalmente alle applicazioni, in “Le Scienze”, n. 438, febbraio 2005.
34