L’analogie avec la factorisation des grands entiers est frappante : la multiplication est facile, la factori-
sation est dure. L’exponentiation dans Zpest facile, le logarithme est dur.
Evidemment, il existe des algorithmes dont la complexit´e augmente avec la taille de p. Mais ils ont en
gros la mˆeme complexit´e que les algorithmes de factorisation. Il faut cependant se m´efier : si nn’est pas
premier et qu’il est tr`es facile `a factoriser, alors le logarithme discret modulo nn’est pas difficile.
Pour r´esumer, la fonction qui a xassocie gxmod pest essentiellement `a sens unique.
2 Comment g´enerer des nombres premiers ?
La production de clefs publiques n´ecessite des moyens de g´en´erer rapidement de grands nombres premiers.
C’est le cas dans les syst`emes RSA et ElGamal, entre autre. On a vu que si on choisit un nombre au
hasard entre 1 et N, la probabilit´e qu’il soit premier est environ de 1/log N. Il «suffit »d’avoir un
moyen efficace de tester si un grand nombre est premier, et au bout de log Ntests on en obtiendra un,
en moyenne.
Dans le fond, la solution repose sur la propri´et´e suivante des nombres premiers :
Th´eor`eme 1 (Petit th´eor`eme de Fermat, 1601–1665).Si pest un nombre premier, alors ap≡amod p
pour tout entier a.
D´emonstration
D’abord, si a= 0 ou a= 1, alors c’est vrai. On se concentre donc sur les cas a > 2. Comme pest
premier, le seul diviseur commun que aet ppeuvent avoir est... p.
Si aest un multiple de p, alors a≡0 mod pet ap≡0 mod p, donc on a le r´esultat annonc´e.
Si an’est pas un multiple de p, alors P GCD(a, p) = 1. Consid´erons les nombres :
0 mod p, a mod p, 2amod p, . . . , (p−1)amod p.
On pr´etend que ces nombres sont tous distincts. En effet, si on avait ax mod p=ay mod p, alors
on trouverait ax ≡ay mod p. Comme aest inversible, on aurait, en multipliant par l’inverse de a,
x≡ymod p.
Puisque la liste ci-dessus est compos´ee de pnombres distincts, et que le premier est z´ero, alors les
autres sont forc´ement 1,2, . . . , p −1 mais dans un ordre qu’on ne connait pas. Du coup, en ´eliminant
z´ero et en multipliant les autres entre eux on trouve :
a×2a× · · · × (p−1)a≡1×2×·×(p−1).mod p
On multiplie des deux cˆot´es par a:
ap×2× · · · × (p−1) ≡a1×2×·×(p−1).mod p
Comme chacun des nombres 2,3, . . . , p−1 est premier avec p, on peut tous les ´eliminer en multipliant
par leurs inverses respectifs. On obtient donc :
ap≡amod p.
Application L’int´erˆet de ce th´eor`eme est notamment le suivant. On veut tester si nest premier. Pour
cela, on calcule 3nmod n. Si on ne trouve pas 3, c’est que nn’est pas premier. Si on trouve 3, alors n
est probablement premier. Ce test est surprenament efficace. Il n’y a que 262 nombres inf´erieurs `a 106
qui sont consid´er´es `a tort comme premier (c’est 91 le plus petit).
Comment faire pour am´eliorer la d´etection des composites ? Si un nombre npasse le test, alors on peut
essayer de v´erifier si 5n≡5 mod n, par exemple. Cela ´elimine encore des candidats. Il n’y a plus que 59
nombres inf´erieurs `a 106qui passent les deux tests `a tort.
On serait donc tent´e d’´ecrire l’algorithme suivant :
2