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