Test et preuve de primalit . Logarithme discret. change de clef

Arithm´etique pour la cryptographie, suite
Charles Bouillaguet
26 mars 2015
1 Exponentiation et logarithme modulo n
Quand aet ksont deux grands entiers, il est difficile de calculer akcar le r´esultat prend trop de place (sa
taille est kfois la taille de a). Cependant, akmod n, lui, est plus petit que n, mˆeme si kest arbitrairement
grand. Mais comment faire ?
1.1 Exponentiation modulaire rapide
L’algorithme suivant a ´et´e expos´e par le math´ematicien arabe al-Kashi en 1427.
def pow_mod(a, k, n):
y= 1
z=a
l=k
while l> 0:
# ici, a^k est congru `a y*z^l modulo n
q,r=divmod(l, 2)
if l%2!=0:
y=(y *z) %n
z=(z *z) %n
l=q
return y
L’invariant de la boucle est clairement vrai lors de l’entr´ee dans la boucle. V´erifions maintenant qu’il est
maintenu par une it´eration. On effectue la division euclidienne de `par 2 :
`= 2q+r
En fait, les valeurs ´evoluent de la fa¸con suivante : z0z2, y0y·zret `0q. Par cons´equent :
y0·z0`0y·zr·z2qmodn
y·z2q+r
y·z`.
Par hypoth`ese, ceci vaut akmod n. CQFD.
Enfin, sachez qu’en Python, ceci est calcul´e par la fonction ped´efinie pow(a, k, n).
Pour finir, cette proc´edure effectue au maximum 2 log2kmultiplications modulo n, et donc sa complexit´e
est Olog k×log2n.
1.2 Logarithme «discret »modulo n
Le probl`eme qui consiste `a calculer x´etant donn´e get gxmod nest appel´e le probl`eme du logarithme
discret. Ici, «discret »ne signifie pas «qui n’attire pas trop l’attention », mais s’oppose `a «continu ».
En 2015, on ne connait pas d’algorithme efficace pour calculer le logarithme discret lorsque nest un
grand nombre premier. Le rˆole du modulo est crucial : en effet, ´etant donn´e deux entiers get x, calculer
x´etant donn´e get gxest assez facile (en effet, xest environ le nombre de bits de gxdivis´e par celui de
g).
1
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 apamod p
pour tout entier a.
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 a0 mod pet ap0 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, . . . , (p1)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,
xymod 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× · · · × (p1)a1×2×·×(p1).mod p
On multiplie des deux cˆot´es par a:
ap×2× · · · × (p1) a1×2×·×(p1).mod p
Comme chacun des nombres 2,3, . . . , p1 est premier avec p, on peut tous les ´eliminer en multipliant
par leurs inverses respectifs. On obtient donc :
apamod p.
Application L’inerˆ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 5n5 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 tene d’´ecrire l’algorithme suivant :
2
def maybePrime(n, tries=32):
for iin range(2, tries):
if pow(i, n, n) != i:
return False
return True
Malheureusement ceci ne suffit pas. Il y a en effet des nombres composites qui passent le test, quel que
soit le nombre d’essais choisis. Il s’agit des infˆames nombres de Carmichael. Le plus petit est 561. Il a ´et´e
d´emontr´e en 1994 qu’il y en a une infinit´e, et mˆeme plus pr´ecis´ement, il y en a environ n0.285 qui sont
plus petits que n.
Il existe un algorithme plus sophistiqu´e, le test de Miller-Rabin, qui ne se trompe jamais quand il r´epond
«composite », et qui se trompe avec probabilit´e 1/4 quand il r´epond «premier ». Si on le r´ep`ete kfois,
il se trompe donc avec probabilit´e 1/4k.
3´
Echange de clef de Diffie-Hellman
Voyons comment faire de la cryptographie avec le probl`eme du logarithme discret. Le protocole d’´echange
de clef de Diffie-Hellman est historiquement le premier m´ecanisme cryptographique qui ne n´ecessite pas
de clef publique. Il a ´et´e invene en 1976 par Diffie (1944–) et Hellman (1945–). Il semble qu’il ait ´et´e
´egalement invent´e un an plus tˆot par les services secrets britanniques, mais cela a ´et´e gard´e secret jusqu’en
1997. En 2015, l’´echange de clef Diffie-Hellman est tr`es largement utilis´e (par exemple, c’est le cas quand
je me connecte `a ma banque).
Pour fonctionner, le procole n´ecessite que les deux participants poss`edent en commun un grand nombre
premier painsi qu’un ´el´ement gZp(le «en´erateur »). Comme gest un ´el´ement de Zp, on n’´ecrira pas
«modulo p»`a chaque fois. Il est sous-entendu que les calculs effectu´es `a partir de grestent dans Zp.
Tout le monde peut utiliser les mˆemes valeurs de pet g. Il y a des valeurs recommand´ees dans certains
standards. La RFC 3526 sp´ecifie des valeurs possibles, comme par exemple :
p= 22048 21984 1+264 ·21918 ·π+ 124476
g= 2
Sinon, on peut en g´en´erer soi-mˆeme, `a condition de faire un peu attention. Voici la description du
protocole :
1. Alice choisit un nombre al´eatoire xplus petit que p1. Elle calcule gxet l’envoie `a Bob.
2. Bob choisit un nombre al´eatoire yplus petit que p1. Il calcule gyet l’envoie `a Alice.
3. Alice calcule K= (gy)x=gxy.
4. Bob calcule K= (gx)y=gxy.
`
A la fin du protocole, Alice et Bob poss`edent donc en commun la valeur K. C’est essentiellement un
nombre al´eatoire modulo p, si xet ysont choisis au hasard. Pour en tirer une clef secr`ete, on peut par
exemple le hacher. On peut ensuite utiliser l’AES.
L’id´ee, c’est que d’´eventuels espions ne peuvent pas apprendre Ken observant l’´echange. En effet, ils
voient passer gxet gy, mais `a moins de pouvoir r´esoudre le logarithme discret dans Zpils ne peuvent
pas apprendre xou y. De plus, on ne connait pas d’algorithme efficace pour calculer gxy ´etant donn´e gx
et gy.
Dans une assez large mesure, il est mˆeme impossible de reconnaˆıtre la solution si on l’a sous le nez. En
effet, sous les bonnes circonstances, il n’existe pas d’algorithme capable de tester si un triplet d’´el´ements
de Zpest de la forme (gx, gy, gxy).
Attention au milieu. Sous cette forme de base, le protocole peut ˆetre victime d’une attaque par le
milieu. Une des solutions pour l’´eviter consiste `a ce que chaque participant signe sa «part ». On parle
alors d’´echange de clef authentifi´e. Cependant la v´erification des signatures n´ecessite la connaissance de
la clef publique du partenaire. Ceci peut se faire avec des certificats.
3
Variante ´eph´em`ere. Imaginons un serveur web s´ecuris´e. De nombreux clients se connectent, et ´eta-
blissent une connexion s´ecuris´ee grˆace `a un ´echange de clef Diffie-Hellman authentifi´e. Ceci peut ˆetre
r´ealis´e de deux mani`eres :
Soit le serveur utilise le mˆeme gxpour tout le monde. Dans ce cas-l`a, son gxdoit ˆetre authentifi´e par
un certificat sign´e par une autorit´e. On parle de Diffie-Hellman statique.
Soit le serveur g´en`ere un nouveau gx`a chaque nouvelle connection. Il doit alors le signer, et sa clef
publique de v´erification doit ˆetre authentifi´ee par un certificat. On parle de Diffie-Hellman ´eph´em`ere.
La diff´erence entre les deux, outre le temps de calcul pour le serveur, se trouve dans ce qui se passe si
quelqu’un parvient `a «casser »l’´echange de clef, et `a acqu´erir le nombre secret xdu serveur.
Dans le cas statique, si quelqu’un parvient `a r´ecup´erer x, alors il peut non seulement d´echiffrer tous les
´echanges futurs du serveur, mais aussi les ´echanges pass´es. Ceci n’arrive pas avec le mode ´eph´em`ere.
4 Chiffrement ElGamal
Est-ce qu’on peut faire du chiffrement `a clef publique en «imitant »ce qui se passe dans l’´echange de
clef Diffie-Hellman ? Oui, comme cela a ´et´e d´emontr´e en 1985 par Taher ElGamal.
Ce syst`eme a ´et´e largement impl´ement´e dans les logiciels libres de crypto (GPG par exemple), car
RSA ´etait couvert par des brevets jusqu’`a un pass´e tr`es r´ecent. Le chiffrement ElGamal est du coup la
principale alternative `a RSA de nos jours.
4.1 G´en´eration des clefs
Pour produire sa paire de clefs, Alice :
choisit un nombre premier pet un «g´en´erateur »gcomme dans le cas de Diffie-Hellman.
choisit au hasard un nombre secret xdans {1,2, . . . , p 1}
calcule h=gx
La partie publique de la clef est la description de G,q, le g´en´erateur gainsi que h. La clef secr`ete est x.
4.2 Chiffrement
Pour envoyer un message chiffr´e `a Alice, Bob doit d’abord le coder comme un ´el´ement mZp. Ensuite
Bob :
Choisit au hasard un nombre y∈ {1,2, . . . , p 1}.
Fabrique son chiffr´e Cet l’envoie `a Alice :
C=gy, m ·hy.
L’id´ee c’est que le message mest «masqu´e »(comme avec un masque jetable) par hy=gxy . C’est ici
que l’analogie avec l’´echange de clef DH apparaˆıt.
Notez que le chiffrement est non-d´eterministe. Sauf dans de rares situations, c’est un avantage. Par contre,
le chiffrement est mall´eable : ´etant donn´e les chiffrement de uet v, on peut produire celui de uv :
C(u)=(gy, u ·hy)
C(v)=(gz, v ·hz)
Si on les multiplie entre eux, coordonn´ee par coordonn´ee, on trouve :
gy+z, uv ·hy+z
C’est-`a-dire ce qu’on obtiendrait en chiffrant uv avec l’al´ea y+z.
Cette mall´eabilit´e peut ˆetre un probl`eme dans certaines circonstances, et c’est pourquoi des pr´ecautions
sont prises pour empˆecher qu’elle ne pose trop de probl`emes.
4
4.3 D´echiffrement
Apr`es avoir re¸cu le message chiffr´e C= (a, b) de Bob, Alice peut :
Calculer h=ax, qui vaut donc gxy .
Calculer h1, c’est-`a-dire l’inverse de hdans Zp.
calculer b·h1, qui vaut men principe.
On verra plus tard que le chiffrement ElGamal est sˆur sous des hypoth`eses raisonnables.
5 Comment fabriquer ses propres param`etres ?
On a vu comment fabriquer de grands nombres premiers. Par contre, il faut faire attention en fabriquant
le «g´en´erateur »pour Diffie-Hellman o`u ElGamal. Voyons le probl`eme qui peut se poser `a travers un
exemple. On choisit p= 181 (c’est bien un nombre premier) et g= 42.
Alice choisit x= 118 et calcule gx= 59.
Bob choisit y= 33 et calcule gy= 59.
Coincidence ? Pour s’en rendre compte, on calcule gipour plusieurs valeurs de i:
i1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
gi42 135 59 125 1 42 135 59 125 1 42 135 59 125 1 42 135 59
Et l`a, c’est l’horreur : il semble que gine puisse prendre que 5 valeurs distinctes. Du coup, il n’y aurait
que 5 «masques »diff´erents possibles dans le chiffrement ElGamal. Autant dire que ¸ca ne chiffre pas
beaucoup.
On note hgi=gi|iNgest le «g´en´erateur »d’un tel ensemble. Il semble ici que la taille de h42i
soit ´egale `a 5, alors que Z181 poss`ede beaucoup plus d’´el´ements.
En fait, le probl`eme vient de ce que g5= 1. En effet, pour voir ce que vaut gi, posons la division de i
par 5 : i= 5q+r. On a alors :
gi=g5q+r=g5q·gr=gr.
Et on voit bien que gine peut prendre que 5 valeurs, de fa¸con cyclique.
5.1 Ordre d’un ´el´ement modulo p
efinition : Ordre d’un ´el´ement modulo p
Si 0 < a < n est premier avec n(donc si aZnest inversible), alors l’ordre de amodulo nest
le plus petit entier λ > 0 tel que aλ1 mod n.
L’inerˆet principal de cette notion d’ordre, par rapport `a nos pr´eoccupations, est exprim´e dans le r´esultat
suivant :
Lemme 1. Si aest inversible dans Znet que son ordre est λ, alors on a :
uvmod λauavmod n.
emonstration
=Par d´efinition, on a uv=kq pour un certain entier k. On a donc :
auakq+vmod n
(aq)k·av
av.
= Il nous faut montrer que uvest un multiple de λ. On suppose sans perte de g´en´eralit´e que
uv(on a qu’`a les ´echanger si ce n’est pas le cas).
Comme on a auavmod net que aest inversible, on multiplie le tout par l’inverse de a
puissance v:
auv1 mod n.
5
1 / 7 100%
La catégorie de ce document est-elle correcte?
Merci pour votre participation!

Faire une suggestion

Avez-vous trouvé des erreurs dans linterface ou les textes ? Ou savez-vous comment améliorer linterface utilisateur de StudyLib ? Nhésitez pas à envoyer vos suggestions. Cest très important pour nous !