La deuxi`eme partie du r´esultat annonc´e entraine donc la premi`ere.
Supposons donc que ak≡1 mod p, notons λl’ordre de amodulo p. D’apr`es le lemme 1, on trouve donc
k≡0 mod λ, autrement dit λdivise k.
Ceci permet de tester un peu plus efficacement si un nombre est une racine primitive ou pas :
Lemme 3. a6= 0 est d’ordre qmodulo psi et seulement si
i)aq≡1 mod p.
ii) Pour tout nombre premier dqui divise qon v´erifie que aq/d 6≡ 1 mod p.
La preuve est dans PAC 2018. Mais l’id´ee est en gros que les nombres p−1
d, o`u dest un diviseur premier de
p−1, sont «les plus grands »diviseurs possibles de p−1. Si l’ordre de gest plus grand que tout ¸ca, alors
c’est que c’est exactement p−1.
3.3 Comment g´en´erer des racines primitives ?
Lemme 3 donne des crit`eres permettant de v´erifier qu’un g´en´erateur donn´e a bien un ordre donn´e. Il peut
donc servir `a tester si un g´en´erateur est une racine primitive, en v´erifiant qu’il est bien d’ordre p−1. La
difficult´e, c’est qu’il faut connaˆıtre la factorisation de l’ordre potentiel en facteurs premiers. Et si pest un
nombre al´eatoire de 1000 bits, calculer la factorisation de p−1 n’est pas forc´ement facile.
Pour ˆetre sˆur d’avoir une racine primitive, plusieurs solutions sont possibles. L’une d’entre elles consiste `a
choisir un nombre premier pde telle sorte qu’on connaisse la factorisation de p−1. Le probl`eme, c’est que
s’assurer du caract`ere al´eatoire et impr´evisible de pdevient plus compliqu´e, mˆeme si c’est possible.
Une solution plus simple consiste `a utiliser des nombres premiers sˆurs. On choisit au hasard un nombre premier
ptel que q= (p−1)/2 est aussi premier. Alors, il est facile de tester si des ´elements de Zpsont des racines
primitives : la factorisation de p−1 en facteurs premiers est... 2q. Du coup, un ´el´ement a∈Zqest une racine
primitive modulo qsi et seulement si a26≡ 1 mod pet aq6≡ 1 mod p.
Le probl`eme est que tout ceci n’est pas tr`es efficace (la g´en´eration d’un gros nombre premier sˆur est assez
lente, disons quelques heures sur un ordinateur normal en 2017).
3.4 G´en´erations de param`etres offrant une s´ecurit´e suffisante
En fait, dans bon nombre de situations il n’est pas indispensable d’ˆetre sˆur que le g´en´erateur est une racine
primitive. On peut se contenter de la certitude que son ordre est «suffisamment grand ». Pour cela, une
possibilit´e est la suivante :
1. Choisir l’ordre qd´esir´e, qui doit ˆetre un nombre premier d’au moins 256 bits en 2017.
2. Choisir un nombre uniform´ement al´eatoire kde la bonne taille (1792 bits, par exemple).
3. Si p= 1 + kq n’est pas premier, revenir `a l’´etape 2.
4. Choisir un ´el´ement g∈Zpde mani`ere arbitraire.
5. Si g6= 1 et que gq≡1 mod p, alors gest d’ordre au moins q. Sinon, retourner `a l’´etape 4.
6. Si on veut que gsoit d’ordre exactement q, il suffit de v´erifier en outre que gk6≡ 1 mod p.
En gros, on fabrique un nombre premier pde telle sorte que p−1 est un multiple de q.
3.5 S´ecurit´e des param`etres
Sans trop rentrer dans les d´etails, la s´ecurit´e des algorithmes de calcul du logarithme discret d´ependent de
deux param`etres : la taille de pet la valeur de l’ordre.
Une premi`ere famille d’algorithmes (le «calcul d’index ») a une complexit´e qui est la mˆeme que celle qui
consiste `a factoriser un entier de la mˆeme taille que p. Ceci n´ecessite donc que psoit assez grand (2048 bits
minimum en 2017).
D’autres algorithmes, plus simples, peuvent marcher si l’ordre a un probl`eme : si l’ordre est tr`es faible, une
recherche exhaustive peut en venir `a bout. D’autre part, il existe des algorithmes g´en´eriques dont la complexit´e
est en O√q(la m´ethode ρou bien l’algorithme baby steps / giant steps. Ceci implique donc de s’assurer
que l’ordre est un nombre de 256 bits au moins en 2017.
5