Cryptographie : Protocoles à base de logarithme discret

publicité
LICENCE SCIENCES ET
TECHNOLOGIES
U.E. de Travaux d’Initiatives
Personnels et Encadrés
Cryptographie : Protocoles à
base de logarithme discret
BAH Mamadou Madjou
Encadrants : ROBLOT Xavier
DELAUNAY Christophe
Responsable de l’UE : CALDERO Philippe
SOMMAIRE
I – Introduction
II – Les outils nécessaires
a) Les congruences et les classes d’équivalence
b) Le groupe (Z/n Z)× et la fonction ϕ d’Euler
c) Le groupe multiplicatif cyclique (Z/p Z)×
d) L’exponentiation rapide et modulaire et implémentation des algorithmes
en Scheme et en C++
III – Le problème du logarithme discret, le protocole de Diffie-Hellmann et le
système El Gamal
1- Le problème du logarithme discret
2- Le protocole de Diffie-Hellmann
3- Le système El Gamal
a) Fabrication de la clé publique
b) Chiffrement
c) Déchiffrement
d) Signature
e) certificat
4- Aspect programmation
IV – Calculs de logarithmes discrets
a) Les attaques
1- La méthode des pas de bébé et de géant
2- La méthode ρ de Pollard
b) Les faiblesses du logarithme discret
La méthode de Pohlig-Hellmann
V − Conclusion
VI − Les références bibliographiques
2
I – Introduction
La cryptographie, art de chiffrer des messages en clair, existe depuis des
siècles parce que l’homme a toujours eu besoin de transmettre des messages
secrets. C’était le cas de Jules César ; ce dernier utilisait la cryptographie
affine pour communiquer avec son état major. Ce codage affine s’explique de la
façon suivante :
- on associe un nombre à chaque lettre de l’alphabet
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 22 24 25
- On calcule y= ax+b ; x est le nombre obtenu à partir de la lettre de
départ, a est inversible mod 26 et le couple d’entiers (a,b) est la clé de
codage.
- On calcule r, reste de la division euclidienne de y par 26.
- Puis on associe à r la lettre correspondante par lecture inverse du
tableau.
Par exemple, si on code le mot ROME avec la clé (5, 13) on obtient UFIH
Mot initial
Code x
5x+13
r
Mot codé
R
17
98
20
U
O
14
83
5
F
M
12
73
21
V
E
4
33
7
H
Jules César utilisait plus précisément un code basé sur un décalage affine c’està-dire un codage avec a=1. Il est bien clair qu’il est facile de retrouver un
message avec ce type de codage parce qu’il y a 312 (12*26) clés à tester .
Il a fallu attendre les années 70 pour que la cryptographie connaisse une
véritable expansion, notamment avec l’apparition de systèmes à clés publiques
tels que le protocole de Diffie-Hellmann, le système El Gamal (de Taher El
Gamal) et le système RSA(actuellement utilisé dans plus de 85 % des échanges
sécurisés mondiaux).
Ayant pour vocation d’assurer la confidentialité des messages, leur
authentification, leur intégrité et leur non-répudiation, cette discipline concerne
maintenant un grand public. Avec le progrès technologique et les techniques
cryptographiques modernes, il est non seulement possible de fabriquer des
cartes bleues, mais aussi d’assurer la protection du copyright, de signer des
documents électroniques et de contrôler des accès, etc.
3
II – Les outils nécessaires
a) Les congruences et les classes d’équivalence
1- Définition
Soit a, b deux entiers relatifs et n un entier strictement positif. On dit que a et b
sont congrus modulo n lorsque a-b est un multiple de n.
On note :
a ≡ b [n] ou a ≡ b (n) ou a ≡ b mod n pour dire que a est congru à b modulo n.
Cette relation de congruence est une relation d’équivalence sur l’ensemble Z
des entiers . Elle est : - réflexive
a≡ a [n]
- symétrique
a ≡ b [n] ⇒ b≡ a [n]
- transitive
a≡ b [n] et b≡ c [n] ⇒ a≡ c [n] .
2- Proposition
Les congruences sont compatibles avec l’addition et la multiplication.
Autrement dit si a ≡ b [n] et c ≡ d [n] alors a+c ≡ b+ d [n]
et ac ≡ bd [n].
3- Encore une définition
On appelle Z/n Z l’ensemble des classes d’équivalence (ou l’ensemble des
classes de congruences modulo n). Pour tout entier a on note a la classe de
congruence de a modulo n, a = {x ∈ Z ; x ≡ a (mod n) }.
4- Encore quatre propositions
Proposition 1 : (découle des définitions)
x = y ⇔ x ≡ y [n].
Proposition 2 :
L’ensemble Z/n Z est fini, de cardinal n. Plus précisément
Z/n Z = {0 , 1 , …,n-1}.
Proposition 3 :
On munit l’ensemble Z/n Z d’une addition et d’une multiplication en posant
 a + b = a+b et  a b= ab.
Muni de ces deux opérations Z/n Z est un anneau commutatif unitaire.
Proposition 4 :
Pour tout n∈N ∗, Z/n Z est un corps commutatif si et seulement si n est un
nombre premier.
4
b) Le groupe (Z/n Z)× et la fonction ϕ d’Euler
1- Le groupe (Z/n Z)×
1-1 Théorème
L’ensemble des éléments inversibles de l’anneau Z/n Z muni de la
multiplication est un groupe. On le note (Z/n Z)×.
1-2 Théorème
soit  a∈ Z/n z, a est inversible si et seulement si PGCD(a,n)=1.
2- La fonction ϕ d’Euler
2-1 Définition
Soit n∈N ∗, on appelle ϕ(n) le nombre d’entiers strictement positifs inférieurs
à n et premiers avec n. C’est donc le cardinal de l’ensemble des éléments
inversibles de l’anneau Z/n Z.
2-2 Théorème d’Euler
Si PGCD(a,n)=1 alors aϕ(n) ≡ 1 (mod n).
Preuve :
Il suffit d’appliquer le théorème de Lagrange : « soit G un groupe fini de
cardinal n, soit a∈G, on a an=1».
Si PGCD(a,n)=1, a ∈ (Z/n Z)× . Or par définition de ϕ , (Z/n Z)× est de
cardinal ϕ(n). Donc  aϕ(n) = 1. D’où le résultat.
2-3 Théorème
Si a et b sont premiers entre eux, ϕ(ab) = ϕ(a)ϕ(b).
Preuve
Cela résulte du théorème des restes chinois : « si q1 , q2 ,…,qr sont deux à
deux premiers entre-eux, le système de congruences
x ≡ a1 (mod q1)
x ≡ a2 (mod q2)
:
x ≡ ar (mod qr)
est équivalent à une unique congruence x ≡ a (mod q1 q2… qr).
Théorème des restes chinois (version 2)
Si a et b sont premiers entre-eux, les anneaux Z/ab Z et Z/a Z × Z/b Z
sont isomorphes. »
Donc, ici, c’est cette dernière version qui nous intéresse.
2-4 Trois propriétés de l’indicatrice d’Euler
Propriété 1 : Si n est premier alors ϕ(n)= n − 1.
Propriété 2 : Si n= p1α1…prαr alors ϕ(n)= p1α1 − 1(p1 –1)… prαr−1(pr –1)
Propriété 3 : (résulte de la propriété 2) ϕ (n) = n * Π (1 − 1/p)
p|n
5
2-5 Théorème : Pour tout entier naturel n supérieur ou égal à 1,
Σ
ϕ (d) = n
d|n , d > 0
Preuve Posons ϕ d (n) = # { x ∈ (Z/n Z) | PGCD(x, n)=d}.
On a ∑ ϕ d (n) = n.
d|n
Or, pour tout diviseur d de n ϕ d (n) = ϕ (n/d) car ϕ (n/d) est le nombre
d’entiers a dans l’ensemble {1,…,n/d} avec PGCD(a, n/d)=1, soit le nombre
d’entiers b dans {1,…,n} avec PGCD(b, n)= d.
Donc ∑ ϕ d (n) = ∑ ϕ (n/d) = ∑ ϕ (d) = n.
d|n
d|n
d|n
c) Le groupe multiplicatif cyclique (Z/p Z)×
1- Définition
Un groupe G est dit cyclique s’il existe a∈G tel que G=<a> c’est –à-dire le
sous groupe engendré par l’élément a. On dit que a est un générateur.
2- Théorème
Soit G un groupe multiplicatif cyclique d’ordre n et g un générateur de G.
Les autres générateurs sont les g t, avec t premier avec n.
Plus généralement, soit g un élément d’ordre n d’un groupe G.Pour tout entier
e, l’ordre de g e est n/PGCD(n, e).
Preuve : On va d’abord commencer par montrer le deuxième point.
Soit d le PGCD de n et e . Notons n=n′ d et e= e′ d avec n′ et e′ des entiers.
L’ordre de g e est le plus petit entier naturel non nul k tel que (g e ) k =1, par
conséquent n | e k . Donc n′ | e′ k
(*).
Puisque PGCD(n′ , e′)=1 , (*) est satisfaite si et seulement si k est un multiple de
n′ = n| d = n| PGCD(n, e).
On vient donc de montrer que l’ordre de g e est n/PGCD(n, e). Si g e est un
générateur , son ordre est n. Par conséquent, PGCD(n, e)=1.
D’où la preuve du premier point.
Corollaire :
Le nombre de générateurs d’un groupe cyclique de cardinal n est ϕ (n).
Petit théorème de Fermat
Si p est premier et a n’est pas divisible par p alors a p −1 ≡ 1 [ p].
Preuve : Immédiat par le théorème d’Euler et la propriété 1 de la fonction ϕ
d’ Euler.
6
Remarque sur ce théorème :
Ce théorème fournit une condition nécessaire de primalité. Soit n un entier,
n −1
si a
et 1 ne sont pas congrus modulo n, avec (a,n) = 1, alors on est sûr que n
n’est pas premier. Cependant si an −1 et 1 sont congrus modulo n, n n’est pas
forcément premier. En effet il existe des nombres appelés nombres de
Carmichael qui vérifient le petit théorème de Fermat sans être premiers et il y
en a une infinité.
Définition : Soit n un nombre composé impair. Si a n’est pas divisible par n
et satisfait a n −1 ≡ 1 [ n] , on dit que n est pseudo premier pour la base a. Si de
plus n est pseudo-premier pour tous les entiers a tels que PGCD(a, n)=1 , on dit
que n est un nombre de Carmichael.
Exemple : Le plus petit nombre de Carmichael est 561=3*11*17 . Pour se
convaincre que a561-1 ≡ 1 [ 561], il suffit de montrer que a561 – a est multiple de
3, 11 et 17 et conclure par le théorème des restes chinois car 3 , 11 et 17 sont
deux à deux premiers entre-eux.
Théorème : Si p est premier, le groupe multiplicatif (Z/p Z)× est cyclique.
Preuve :
Si p est premier l’anneau (Z/p Z , + ,*) est un corps commutatif. Donc le
polynôme X d –1 possède au plus d racines dans Z/p Z.
Soit x ∈ (Z/p Z)× et d son ordre. Donc x d =1 et puisque x p-1=1 par le petit
théorème de Fermat, on a x p-1-qd=1 pour tout entier q et d doit donc être un
diviseur de p-1. Les d éléments 1,x,x²,…, x d-1 de (Z/p Z)× sont distincts et
constituent un sous-groupe de (Z/p Z)× et sont tous des racines du polynôme
X d –1. Vu que ce polynôme possède au plus d racines, on en déduit que tout
élément d’ordre d de (Z/p Z)× fait partie du sous groupe engendré par x. Or ce
sous-groupe contient exactement ϕ (d) éléments d’ordre d. Si l’on note Gd
l’ensemble des éléments de (Z/p Z)× d’ordre d , on vient de montrer que # Gd = 0
ou # Gd =ϕ (d). Ecrivons que (Z/p Z)× se partitionne en la réunion des Gd , on
obtient p-1 = ∑ # Gd .
d|(p-1)
Par le théorème 2-5 , # Gd =ϕ (d) pour tous les diviseurs d de p-1.
Conclusion : # G(p-1) =ϕ (p-1) ≠ 0 ce qui prouve l’existence d’un générateur
(parfois appelé élément primitif).
Le théorème qui précède est très important (car les protocoles utilisés ici
sont implémentés dans le groupe cyclique (Z/p Z)× ) . Comme il est possible
d’implémenter les protocoles à base de logarithme discret dans un autre groupe
cyclique différent de (Z/p Z)× , je vais énoncer un théorème dû à Gauss.
Cependant, dans ces groupes, le problème du logarithme discret doit être
difficile à résoudre en temps raisonnable.
7
Théorème de Gauss : Le groupe multiplicatif (Z/n Z)× est cyclique si et
seulement si n est de la forme 2, 4, p k , 2p k où p est un nombre premier impair.
d) L’exponentiation rapide et modulaire
L’exponentiation rapide
Il s’agit de calculer a b sans utiliser la méthode naïve a*a*a*a…*a . Voici
donc un algorithme très efficace permettant de calculer a b avec a un nombre
entier et b un grand nombre entier.
Procédure : si b=0 , je retourne 1
Si b=1 , je retourne a
Si b est pair, je calcule (a k)2
Si b> 2 et impair, je calcule a*(a k)2
Et si k> 1, on recommence.
Implémentation de l’algorithme en Scheme :
(define exp_rap;-> nombre
(lambda(x n); x et n des nombres
(cond ((= n 0) 1)
; si n=0, je retourne 1
((= n 1) x)
; si n=1, je retourne x
((even? n) (exp_rap (sqr x) (/ n 2))) ; si n est pair, je calcule (x²)^n/2
(else (* x (exp_rap (sqr x) (/ (- n 1) 2)))))))
; sinon,
; j'appelle la fonction avec les arguments x² et (n-1)/2 et je multiplie le
resultat par x.
;(exp_rap 2 3);->8
;(exp_rap 2 0);->1
;(exp_rap 2 160);>1461501637330902918203684832716283019655932542976
L’exponentiation modulaire
C’est tout simplement l’exponentiation rapide avec modulo c’est-à-dire
calculer a b mod n.
8
(define exp_mod; -> nombre
(lambda(a b n); a, b et n des nombres
(cond ((= b 0) 1)
((= b 1) (modulo a n))
((even? b) (exp_mod (sqr a) (/ b 2) n)) ; si n est pair
(else (modulo(* a (exp_mod (sqr a) (/ (- b 1) 2) n)) n))))) ;
; si n>2 et impair
;(exp_mod 2 4 5);->1
;(exp_mod 7 7 31);->28
;(exp_mod 28 2006 13);->4
Voici un autre programme pour calculer l’exponentiation modulaire écrit en
C++.
9
#include<iostream>
using namespace std;
int exp_mod(int a, int b, int n)
{
int res=1;
while(b > 0)
{ if(b % 2!=0)
res=res*a % n;
a=a*a % n;
b=b/2;
}
return res;
}
int main(void)
{
int a, b, n, res;
cout<<"-----L'exponentiation modulaire-----"<<endl;
cout<<endl;
cout<<"-----Ce programme calcule a^b mod n-----"<<endl;
cout<<endl;
cout<<"tapez a :"<<endl;
cin>> a;
cout<<"tapez b :(l'exposant)"<<endl;
cin>> b;
cout<<"tapez n : "<<endl;
cin>> n;
cout<<endl;
cout<<"res="<<exp_mod(a,b, n)<<endl;
system ("pause");
return 0;
}
10
III – Le problème du logarithme discret, le protocole de Diffie-Hellmann et le
système El Gamal
1- Le problème du logarithme discret
Définition :
Soit p premier, g un générateur du groupe (Z/p Z)× c’est-à-dire
(Z/p Z)× = {g0 , g1,…,gp−2 } . Si a ∈ (Z/p Z)× , le logarithme discret de a en
base g est l’unique entier α tel que α ∈ {0 ,1 ,…,p−2} et a= g α .
Le problème du logarithme discret consiste à trouvé α et c’est un problème
réputé difficile.
2- Le protocole d’échange de clés de Diffie-Hellmann
Alice et Bob veulent se mettre d’accord sur une clé secrète commune (qui leur
servira, par exemple, pour un système de chiffrement traditionnel) et ne
disposent que d’un canal de communication non sûr c’est-à-dire non protégé.
Pour cela, ils se mettent d’accord (sur le canal) sur un grand nombre premier p
et un entier g (avec 2≤ g≤ p-2) générateur du groupe (Z/p Z)× dont l’ordre est
suffisamment élevé (c’est-à-dire p-1).
Alice choisit un entier a ∈{0,1,…,p-2} au hasard, calcule A=g a mod p et envoie
A à Bob en gardant secret a.
De même, Bob choisit un entier b ∈{0,1,…,p-2} au hasard, calcule B=g b mod p
et envoie B à Alice en gardant secret b.
Leur clé sécrète commune est g ab mod p .
Alice accède à la clé en calculant B a mod p et Bob accède à la clé en calculant
Ab mod p.
Remarque : On pense que retrouver g ab (en temps raisonnable) est presque
impossible sauf si l’on est capable de résoudre le problème du logarithme
discret.
3- Le système El Gamal
On prendra Alice comme destinataire du message et Bob l’expéditeur. On
notera (Z/p Z)× l’espace des messages en clair et (Z/p Z)× × (Z/p Z)×
l’espace des chiffrés.
a) Fabrication de la clé publique
Alice choisit un grand nombre premier p, un générateur g mod p et un entier
a∈{0,1,…,p-2} aléatoirement comme dans le protocole de Diffie-Hellman. Elle
calcule A= g a mod p . Sa clé sécrète est a et sa clé publique (p, g, A) .
Si Bob souhaite envoyé un message en clair m à Alice, il doit donc disposer
d’un moyen de connaître la clé publique d’Alice.
11
b) Chiffrement
Bob souhaite chiffrer un message en clair m ∈{0,1,…,p-1}. Il se procure la clé
publique d’Alice et choisit un entier b ∈{0,1,…,p-2} au hasard puis il calcule :
B= g b mod p et C=Ab m mod p.
En fin il envoie (B,C) à Alice.
Remarque : le message m est multiplié par la clé de Diffie-Hellman.
c) Déchiffrement
Alice reçoit le couple (B,C) et retrouve le message m en calculant
p-1-a
B
C modp .
Vérification: Bp-1-a C≡ gb(p-1-a) Ab m≡ (gp-1)b (ga)-b Ab m≡ A-b Ab m≡ m mod p
Un petit exemple: Alice choisit p= 31, g= 7. Puis elle choisit aléatoirement sa
clé sécrète a = 7 et elle calcule A= g a mod p = 28 . Donc sa clé publique est
(p=31, g=7, A=28). Bob veut chiffrer m=18. Il choisit aléatoirement b=11 et
calcule B=g b mod p = 20 et C=Ab m mod p = 14 puis il envoie
(B,C)=(20,14) à Alice. Alice retrouve m en calculant Bp-1-a C mod p= 18.
d) Signature
Il s’agit de résoudre le problème lié à l’authenticité du message c’est-à-dire
prouver au destinataire que le message a été envoyé par le vrai expéditeur et
non par quelqu’un d’autre.
Maintenant Bob souhaite signer son message. Pour cela, il choisit sa clé
sécrète (un entier s modulo un grand nombre premier p) et calcule sa clé
publique (p, g, P) avec P=g s mod p.
Il choisit encore au hasard un entier k premier avec p-1 et calcule :
- u= g k mod p
- l’unique solution v de l’équation m= us + kv mod (p-1) (*)
Remarque : En exponentiant (*), on obtient : g m = P u u v mod p (**)
Pour finir, Bob signe son message m par (u, v).
Comme Alice a déjà le message m et que la clé (p, g, P) de Bob est publique,
il suffit qu’elle calcule et compare les deux termes de l’égalité (**).
Si les deux termes sont égaux, alors Bob est celui qu’il prétend être. On voit
que personne ne peut signer à la place de Bob sans connaître le secret s.
L’efficacité de la signature d’El Gamal repose donc sur le problème du
logarithme discret.
Exemple : Bob souhaite maintenant signer le message m=18. Il choisit un
nombre premier p=37, un générateur g=5 et sa clé secrète s=11. Il calcule
P=g s mod p=2. Donc sa clé publique est (p=37, g=5, P=2) . Il choisit une
deuxième fois un entier k=17 au hasard mais avec PGCD(k, p-1)=1 et
calcule u= g k mod p=22.Enfin il calcule l’unique solution v de l’équation
12
-224 = 17v mod 36. Soit 8=17(-v) mod 36. Or l’inverse de 17 modulo 36 est
17. Donc –v=8*17 mod 36=28, soit v=8 mod 36. Bob signe donc son
message par (u=22,v=8).
Alice veut vérifier cette signature. Elle calcule g m mod p = 36 et
P u u v mod p=36. Comme les deux termes sont égaux, elle est sûre que c’est
bien Bob qui a signé le message.
e) Certificat
Quand Bob souhaite transmettre un message à Alice, il doit être sûr que la clé
publique qu’il utilise appartient à Alice et réciproquement. Il ne suffit pas
qu’Alice ou Bob garde leur clé secrète. En effet, si un attaquant, Oscar, est
capable de remplacer la clé publique d’ Alice, il pourra non seulement
déchiffrer les messages secrets envoyés à Alice mais aussi signer des documents
au nom d’Alice. Pour résoudre donc ce problème, ils doivent utiliser une
institution de confiance. Si Alice utilise un système à clés publiques, elle doit
être enregistrée par l’autorité de certification du système. Alice communique
son nom et certaines informations utiles à l’autorité de certification et celle-ci
vérifie ces informations avant de générer et signer un certificat établissant une
connexion vérifiable entre Alice et ses clés publiques. Le certificat doit contenir
au moins les informations suivantes :
- Le nom d’utilisateur ou le pseudonyme d’Alice ;
- Ses clés publiques ;
- Les noms des algorithmes dans lesquels ces clés sont utilisés.
- Le nom de l’autorité de confiance ;
- Le numéro de série du certificat, les dates de début et de fin de validité du
certificat.
Ce certificat est ensuite stocké dans un annuaire dans lequel seul l’autorité de
confiance a droit d’écrire. Bien sûr tous les utilisateurs de l’autorité de
confiance peuvent lire les informations de cet annuaire.
D’ailleurs cette institution de confiance peut même fabriquer les clés privées et
publiques pour Alice et les autres utilisateurs surtout s’ils utilisent le système
RSA car on a besoin de grands nombres premiers aléatoires pour les clés RSA et
il n’est pas facile de trouver ces nombres. Si on fait l’analogie entre un certificat
et un passeport, dans ce cas c’est la préfecture qui sera l’institution de
confiance.
13
4- Aspect programmation
Voici 3 programmes écrits en C++. Le premier calcul la clé publique du
système El Gamal, le deuxième fait le chiffrement et le dernier le déchiffrement.
#include<iostream>
using namespace std;
int exp_mod(int g, int e, int p)
{
int res=1;
while(e > 0)
{ if(e % 2!=0)
res=res*g % p;
g=g*g % p;
e=e/2;
}
return res;
}
int main(void)
{
int g, e, p, A;
cout<<"-----Le systeme d'El Gamal-----"<<endl;
cout<<endl;
cout<<"-----Ce programme calcule la cle publique-----"<<endl;
cout<<endl;
cout<<"tapez g :(le generateur)"<<endl;
cin>> g;
cout<<"tapez e :(la cle secrete)"<<endl;
cin>> e;
cout<<"tapez p : (p est un nombre premier)"<<endl;
cin>> p;
cout<<endl;
cout<<"la cle publique " ;
cout<<"(p, g ,A)="<<"("<<p<<","<<g<<","<<exp_mod(g,e,p)<<")"<<endl;
system ("pause");
return 0;
}
14
#include<iostream>
using namespace std;
int exp_mod(int g, int e, int p)
{
int res=1;
while(e > 0)
{ if(e % 2!=0)
res=res*g % p;
g=g*g % p;
e=e/2;
}
return res;
}
int main(void)
{
int g,b,p,A,m;
cout<<"-----Le systeme d'El Gamal-----"<<endl;
cout<<endl;
cout<<"-----Ce programme chiffre un message en clair-----"<<endl;
cout<<endl;
cout<<"tapez g :(le generateur)"<<endl;
cin>> g;
cout<<"tapez b : (un entier choisit aleatoirement)"<<endl;
cin>>b;
cout<<"tapez p : (p est un nombre premier)"<<endl;
cin>> p;
cout<<"tapez A : (la valeur trouvee dans la cle publique"<<endl;
cin>> A;
cout<<endl;
cout<<"B="<<g<<"^"<<b<<"mod"<<p<<"="<<exp_mod(g, b, p)<<endl;
cout<<endl;
cout<<"le message a chiffrer est m=";
cin>>m;
cout<<endl;
cout<<"C="<<A<<"^"<<b<<"*"<<m<<"mod"<<p<<"="<<m*exp_mod(A,b,p)%p<<endl;
cout<<endl;
cout<<"le cryptogramme est (B,C)=";
cout<<"("<<exp_mod(g,b,p)<<","<<m*exp_mod(A,b,p)%p<<")"<<endl;
system ("pause");
return 0;
}
15
#include<iostream>
using namespace std;
int exp_mod(int g, int e, int p)
{
int res=1;
while(e > 0)
{ if(e % 2!=0)
res=res*g % p;
g=g*g % p;
e=e/2;
}
return res;
}
int main(void)
{
int B,C,e,p;
cout<<"-----Le systeme d'El Gamal-----"<<endl;
cout<<endl;
cout<<"-----Ce programme dechiffre un message code-----"<<endl;
cout<<endl;
cout<<"tapez B :"<<endl;
cin>> B;
cout<<"tapez C : "<<endl;
cin>> C;
cout<<"tapez p : (p est un nombre premier)"<<endl;
cin>> p;
cout<<"tapez e :(la cle secrete)"<<endl;
cin>> e;
cout<<endl;
cout<<"le message en clair est :";
cout<<"B^("<<p<<"-1-"<<e<<")"<<"C mod"<<p<<"="<<C*exp_mod(B,p-1-e,p)%p;
cout<<endl;
system("pause");
return 0;
}
16
IV – Calculs de logarithmes discrets
Rappel : soit g un générateur de (Z/p Z)×, y ∈ (Z/p Z)× . On cherche x ∈
{0 ,1 ,…,p−2} tel que y= g x mod p.
Au lieu de calculer le logarithme discret par la méthode naïve qui consiste à
calculer successivement g, g2, g3,… jusqu’à obtenir y=g x, on va voir dans
cette partie des algorithmes parfois efficaces pour calculer le logarithme
discret.
a)
Les attaques
1- L’algorithme pas de bébé/pas de géant
Principe de la méthode :
i. On pose m=√ (p-1)
ii. On écrit x sous la forme x=mq+ r avec 0≤ r < m.
Puisque m≥ √ (p-1) et x < p-1, il est clair que q≤ √ (p-1).
Rechercher x tel que y= gx, revient donc à rechercher q et r vérifiant
0≤ r< m , 0≤ q≤√(p-1) et g qm+r ≡ y mod p
ou encore
0≤ r< m , 0≤ q≤√(p-1) et (g m) q ≡ y g -r mod p
iii. On calcule d’abord (les pas de bébé) l’ensemble
B={ (y g -r mod p , r) : 0≤ r< m }
Si nous trouvons dans cet ensemble, un couple (1,r), alors y g -r = 1 mod p.
Donc y = g r mod p et x = r car 0≤ r< m .
Sinon, on calcule les pas de géant. On calcule δ = g m mod p, et pour
q=0,1,…,m-1, on calcule δ k jusqu’à ce qu’on obtienne q tel que :
δ q ≡ g q m≡ y g -r (mod p).
Exemple: Soit p= 1009, déterminons le logarithme discret de 8 dans la base 5.
On veut x tel que 8= 5x mod 1009.
On a m =√ 1008 =32. On calcule les pas de bébé :
B= { ( 8* 5 – r mod 1009, r) : 0≤ r< 32 }= { (8,0), (607,1), (525, 2),
(105,3), (21, 4), (206,5), (243,6), (654,7), (938,8), (793,9), (764,10),
(960,11), (192,12), (442,13), (492,14), (502,15), (504,16),(908,17),
(787,18), (561,19), (314,20), (870,21), (174,22), (842,23), (572,24),
(518,25), (709,26), (949,27), (997,28), (603, 29), (726,30), (347,31) }
δ = 5 32 mod 1009 = 256
17
On calcule donc les pas de géant G = { (256
G = { (1 , 0), (256, 1), (960,2)}
q
mod 1009 , q) : 0≤ q≤ 31 }
Le couple (960,11) figure parmi les pas de bébé et (960,2) figure parmi les pas
de géant. Or x = 32*2+11=75 ∈ {0 ,1 ,…,1007}. Par conséquent x=75 est le
logarithme discret de 8 dans la base 5.
Pour résoudre ce problème, il a fallu 32 opérations pour calculer les pas de
bébé, 3 opérations pour calculer les pas de géant et 32 éléments à stocker.
Cet algorithme demande O(√p) multiplications et comparaisons et nécessite
le stockage de O(√p) éléments. Il faudra donc noter que si p -1> 2160, le calcul
du log discret avec cet algorithme devient impossible.
2- La méthode ρ de Pollard
L’algorithme ρ de Pollard est un algorithme probabiliste de complexité
O(√ p) en temps (par le paradoxe des anniversaires) et O(1) en espace.
Le paradoxe des anniversaires :
En effectuant k tirages successifs avec remise dans un ensemble à n éléments,
la probabilité d’avoir choisi deux fois un même élément est supérieure à ½ pour
k≥ (1+ √( 1+8nln(2)))/2.
Si A est l’événement : « tous les éléments choisis sont distincts », on a :
P(A) = n(n-1)…(n-(k-1))
nk
k-1
= Π (1 - i/n)
i=1
k-1
Or ∀ x ∈ R, ( 1+ x) ≤ e . Donc P(A) ≤ Π e
i=1
x
–i/n
k-1
≤ e ( - Σ i/n ) ≤ e( - k(k-1) ) .
i=1
2n
Finalement, P(A) ≤ ½ si k² -k-2nln(2) ≥ 0.
Donc pour k≥ (1+ √( 1+8nln(2)))/2 , la probabilité d’avoir choisi deux fois un
même élément est supérieur à ½ car le contraire de l’événement « tous les
éléments choisis sont distincts » est l’événement « au moins deux éléments
choisis soient identiques ».
Rappel : On cherche toujours x ∈ {0 ,1 ,…,p−2} tel que y= g x mod p.
Principe de la méthode :
On partitionne (Z/p Z)× en G1 , G2 , G3 ( (Z/p Z)× = en G1 ∪ G2 ∪ G3 ) et on
définit la fonction f : (Z/p Z)× → (Z/p Z)× par
g z si z ∈ G1 ,
f(z)= z² si z ∈ G 2
yz si z ∈ G3
18
On construit une suite récurrente d’éléments : z i+1 = f(z i ) avec z0 un élément
défini par le tirage aléatoire d’un nombre a0 ∈ {1 ,…,p−1}. On exprime alors
les termes de cette suite comme : z i = g ai y bi pour i≥ 1 avec
ai + 1 mod ϕ (p) si zi ∈ G1
ai + 1 = 2ai
mod ϕ (p) si zi ∈ G 2
ai
mod ϕ (p) si zi ∈ G3
et
bi
si zi ∈ G1
bi + 1 = 2bi
mod ϕ (p) si zi ∈ G 2
bi + 1 mod ϕ (p) si zi ∈ G3
et avec comme valeur initiale pour a0 la valeur aléatoire choisie initialement et
pour b0 =0.
Comme nous travaillons dans un groupe fini, la suite (z i ) i≥ 0 sera
périodique de période T à partir d’un certain rang. Par conséquent, il existe s et
T tels que
z s+T = z s (s est le plus petit indice pour lequel l’égalité est vérifiée. Finalement
on obtient la relation : ai - ai +T ≡ x(bi +T - bi ) mod ϕ (p) .
Si (bi +T - bi ) est inversible modulo ϕ (p) l’équation n’a qu’une solution et cette
solution c’est le logarithme discret. Sinon, il y a plusieurs solutions et si elles
sont nombreuses, on peut les tester successivement, sinon on recommence
l’algorithme avec une autre valeur initiale a0 .
b) Les faiblesses du logarithme discret
La méthode de Pohlig-Hellmann
C’est aussi une méthode qui permet de calculer le logarithme discret et elle
n’ est efficace que si p-1 n’a que de petits facteurs premiers.
Principe de la méthode :
Soit p un nombre premier, g un générateur du groupe multiplicatif cyclique
(Z/p Z)×. Soit p-1 = p1λ1 p2λ2 …pkλk
la décomposition en facteurs premiers
×
du cardinal de (Z/p Z) . On cherche x ∈ {0 ,1 ,…,p−2} tel que y= g x mod p.
On pose g i = g ni et y i = y ni
avec n i = (p-1) .
piλ i
On remarque que g i engendre un groupe G i d’ordre piλ i et que y i = g i xi .
19
Pour déterminer x , on calcule d’abord y i , g i et x i (logarithme discret de y i
dans la base g i ) puis on cherche le logarithme discret x à l’aide du théorème
des restes chinois c’est-à-dire on cherche l’unique solution x ∈ {0 ,1 ,…,p−2}
des congruences simultanées x ≡ x i mod (piλ i ).
Remarque : l’algorithme pas de bébé/pas de géant utilise O(√(piλ i )) opérations
pour calculer x i .
Réduction à un ordre premier
Le calcul du logarithme discret dans les groupes cycliques dont l’ordre est
une puissance d’un nombre premier peut se ramener au calcul du logarithme
discret dans des sous-groupes d’ordre premier.
Soit G un groupe cyclique d’ordre p e , p premier et e un entier positif. On veut
résoudre a= b k . On pose k = k0 + k1p +…+ k e-1 pe-1
avec 0≤ k i ≤ p et 0≤ i ≤ e-1 .
On peut voir que chaque coefficient k i est un logarithme discret dans un
groupe d’ordre p c’est –à-dire b m ki = ai n avec m= p e-1 et n= p e-i-1 .
V – Conclusion
La sécurité du système El Gamal repose sur la difficulté de résoudre le
problème du logarithme discret dans le groupe cyclique (Z/p Z)× . Cependant il
faudra faire attention en ce qui concerne le choix du nombre premier p car si le
cardinal de (Z/p Z)× admet des petits facteurs premiers, un attaquant, Oscar,
pourra retrouver le logarithme discret en utilisant notamment l’algorithme de
Pohlig-Hellman. Toute personne capable de résoudre le problème de logarithme
discret pourra facilement casser le cryptosystème d’El Gamal mais à l’inverse
être capable de casser le cryptosystème d’El Gamal ne veut pas dire pouvoir
résoudre le problème du logarithme discret.
Même si dans le système d'El Gamal le message chiffré est deux fois plus long
que le message original , notons que le fait d’utiliser un paramètre aléatoire k
est un plus en termes de sécurité car le même message m chiffré à deux moments
différents donnera deux messages chiffrés différents.
20
VI - Les références bibliographiques
[1] DELEGLISE, Marc. Cours de Calcul formel et Cryptographie (Chapitre 1).
Licence d’informatique. Université Lyon1- Ecole Normale Supérieure de Lyon.
[2] ZEMOR, Gilles. Cours de cryptographie. Paris : Cassini, 2000.227p.
[3] BUCHMANN, Johannes. Introduction à la cryptographie . Paris : Dunod,
2006.261p.
[4] MARTIN, Bruno. Codage, cryptologie et applications. Lausanne : Presses
polytechniques et universitaires romandes, 2004.350p.
[5] DELAHAYE, Jean Paul. Merveilleux nombres premiers – voyage au cœur
de l’arithmétique. Paris : Belin, 2000.336p.
[6] Wikipédia - Nombre de Carmichael. Disponible sur
<http://fr.wikipedia.org/wiki/Nombre_de_Carmicha%C3%ABI>. (Consulté le
15 Avril 2007).
21
Téléchargement