Algorithmes de cryptographie et le probl`eme du
Transcription
Algorithmes de cryptographie et le probl`eme du
Algorithmes de cryptographie et le problème du logarithme discret Vitor Lima (vitor [email protected]) 31 janvier 2013 1 Introduction La cryptographie est un domaine de l’informatique et des mathématiques qui étudie procédés pour qu’un message ne puisse être compris que par un ensemble particulier de communicateurs (i.e. personnes, ordinateurs, logiciels, ...). Normalement, cet ensemble est l’ensemble de ceux qui ont une clée. Aujourd’hui, la cryptographie est utilisée, par exemple, dans les transactions bancaires, les achats sur internet et les communications confidentielles. Les systèmes de cryptographie sont traditionnellement divisés en symétrique (comme DES, AES et RC4) et asymétrique (comme RSA et ElGamal). Dans ce texte, on verra deux algorithmes de cryptographie asymétrique qui sont basés sur le problème du logarithme discret et quelques algorithmes pour résoudre ce problème. 2 Quelques définitions et notations Définition 2.1 (Ordre d’un groupe). Soit A = (G, ·) un groupe fini, alors, on défini l’ordre de A comme le cardinal de G et on note o(G) = |G| Si le groupe est infini, on dit que son ordre est infini. Définition 2.2 (Ordre d’un élément). Soient (G, ·) un groupe, e l’élément neutre de G et g ∈ G. On définit l’ordre de g comme min{x ∈ N∗ : g x = e}, et on le note o(g). Remarque 2.3. L’ordre du groupe < g > est égal à l’ordre de l’élément g. Pour voir cette proprieté, il faut remarquer que < g >= {g 0 , g 1 , g 2 , ..g o(g)−1 } possède o(g) éléments. Définition 2.4 (Grand O). On note O(f (x)), où f est une fonction à valeurs positifs, l’ensemble des fonctions asymptotiquement plus petites que f , i.e. g(x) ∈ O(f (x)) ⇔ ∃(c, x0 ) ∈ R∗ : ∀x ≥ x0 , g(x) ≤ cf (x) 1 Remarque 2.5. Dans les algorithmes de cryptographie, généralement, on travaille avec des nombres très grands (comme 1024 bits), alors, les opérations de multiplications sont très chères. Pour cette raison, quand on fait le calcul de la complexité asymptotique (trouver à quelle ensemble ”Grand O” de fonction l’algorithme appartient), on compte le nombres de multiplications (et aussi de division) faites. 3 Problème du Logarithme Discret Définition 3.1. Soit A = (G, ·) un groupe et (g, h) ∈ G2 . Le problème du logarithme discret (PLD) consiste à trouver x ∈ Z tel que g x = h. Si un tel x existe, on l’appelle logarithme discret de h dans la base g et on le note x = logg h (ou, parfois, x = indg h). Remarque 3.2. Une condition nécessaire et suffisante pour que ce problème possède une solution est h ∈< g > . En particulier, si G =< g > (g est un générateur de G), le PLD a toujours solution. Remarque 3.3. La solution n’est pas forcement unique. En fait, si g est d’ordre fini et si g x = h, alors, pour tout α ∈ Z, on a g x+αo(g) = g x e = h Proposition 3.4 (Quelques propriétés du logarithme discret). Soit (G, ·) un groupe. 1. (Logarithme d’un produit) Si (g, h, k) ∈ G3 alors logg hk = logg h + logg k. 2. (Changement de bases) Si x = logg h alors x = logn h logn g (si logn h est défini dans le groupe). Preuve : 1. En fait, par les propriétés de la loi interne du groupe, si on a g x = h et g y = k, alors, on a g x+y = hk. Par la définition du logarithme discret, logg hk = x + y, or x = logg h et y = logg k, donc logg hk = logg h + logg k. 2. Soit z ∈ G. S’il existe y ∈ Z tel que ny = g (ça veut dire, y = logz g), on a : z xy = (z y )x = g x = h, alors, par définition logz h = xy = logg h logz g. 4 4.1 Comment résoudre le PLD Recherche exhaustive La façon la plus simple de résoudre un PLD consiste à calculer g i pour tout i appartient à {1, 2, 3, .., o(g)} et voir quelle valeur de i satisfait g i = h. On peut commencer en voyant si g et h sont égaux, s’ils ne le sont pas, on mutiplie g par lui même, en obtenant g 2 et on le compare avec h. S’ils sont encore différent, on multiplie g 2 par g pour obtenir g 3 et on compare cette valeur avec h. On continue ainsi jusqu’à trouver la réponse. Notons que dans le pire cas on va faire un nombre de multiplications égal à l’ordre de g, donc, la complexité asymptotique de cette méthode est O(o(g)). 2 4.2 4.2.1 Baby-step, giant-step L’algorithme Soient A = (G, ·) un groupe, (g, h) ∈ G2 et N = o(g). On peut résoudre le PLD g x = h de la manière suivante : Si on écrit la division euclidienne de x par n, x = nq + r, avec 0 ≤ r < n, on a g x = h ⇔ g nq+r = h ⇔ g r = hg −nq et comme 0 ≤ x ≤ N , N −r N 0 ≤ nq + r ≤ N ⇒ 0 ≤ q ≤ ≤ . n n √ N Alors, si on choisit n = 1 + b N c, on a n ≤ n et on peut construire deux listes : {g r }0≤r<n : g 0 , g 1 , g 2 , , g 3 , .., g n−1 (∗) 2 {hg −qn }0≤q≤n : hg 0 , hg −n , hg −2n , .., hg −n (∗∗) et chercher g i dans (∗) 1 et hg −jn dans (∗∗) tels que g i = hg −jn . Ainsi, on trouvera la solution du PLD x = i + jn Voici une implémentation en language C, en utilisant la bibliothèque GMP 2 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 void b a b y s t e p ( mpz t g , mpz t h , mpz t p , mpz t n , mpz t x ) { unsigned long int i ; long int j = 0 ; mpz t N; mpz t∗ g r ; /∗ l i s t e g ˆ r ∗/ unsigned long int ∗ i n d i c e s ; /∗ i n d i c e [ i ] = k <=> g r [ i ] = g ˆk ∗/ mpz t hgNq ; /∗ hgˆ(−Nq) ∗/ mpz t i n v ; /∗ gˆ(−N) ∗/ mpz init (N) ; mpz sqrt (N, n ) ; mpz add ui (N, N, 1 ) ; g r = m a l l o c ( mpz get ui (N) ∗ s i z e o f ( mpz t ) ) ; i n d i c e s = m a l l o c ( mpz get ui (N) ∗ s i z e o f ( long int ) ) ; mpz init set ui ( g r [ 0 ] , 1 ) ; /∗ on c a l c u l e l a s u i t e { g ˆ r } r = 1 , . . ,N ( Baby s t e p ) ∗/ f o r ( i = 1 ; i <= mpz get ui (N) ; i ++){ indices [ i − 1] = i − 1; mpz init ( g r [ i ] ) ; mpz mul ( g r [ i ] , g r [ i − 1 ] , g ) ; mpz mod ( g r [ i ] , g r [ i ] , p ) ; } /∗ on t r i e l e s v a l e u r s ( k , g ˆk ) par r a p p o r t à g ˆk ∗/ 1. Pour que l’agorithme soit plus efficace, on trie la première liste 2. GNU MP est une bibliothèque portable écrite en C pour l’arithmétique en précision arbitraire sur des entiers, rationnels et virgule flottante. (Cf. gmplib.org) 3 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 q u i c k s o r t ( gr , i n d i c e s , 0 , mpz get ui (N) ) ; /∗ on c a l c u l e gˆ(−N) ( Giant s t e p ) ∗/ mpz init set ( inv , g ) ; e x p o n e n t i a t i o n r a p i d e ( inv , N, p ) ; i n v e r s e ( inv , p , i n v ) ; mpz init set ( hgNq , h ) ; /∗ on c h e r c h e l e s é lé m e n t é g a l e s dans l e deux s u i t e s ∗/ f o r ( i = 0 ; i <= mpz get ui (N) ; i ++){ /∗ busque b i n a i r e ( c h e r c h e r hgNq dans l e t a b l e a u g r ) ∗/ j = b u s q u e b i n a i r e ( gr , hgNq , 0 , mpz get ui (N) ) ; i f ( j >= 0 ) { mpz mul ui (N, N, i ) ; mpz add ui (N, N, i n d i c e s [ j ] ) ; mpz set ( x , N) ; break ; } /∗ s i non , on c a l c u l e l e p r o c h a i n v a l e u r de gˆ(−Nq) ∗/ mpz mul ( hgNq , hgNq , i n v ) ; mpz mod ( hgNq , hgNq , p ) ; } /∗ on e n l e v e l a memoire ∗/ f o r ( i = 0 ; i <= mpz get ui (N) ; i ++){ mpz clear ( g r [ i ] ) ; } mpz clear ( i n v ) ; mpz clear ( hgNq ) ; f r e e ( gr ) ; } 4.2.2 Complexité Pour faire la première liste, on fait n multiplications (de g avec la dernière valeur calculée). Après, on calcule l’inverse modulo p de g (on peut le faire en O((log p)2 ) et on calcule g −n (avec l’algorithme de exponentiation rapide, on peut calculer g −n en O(log n)). Après, pour calculer la deuxième liste, on fait aussi O(n) produits de g −n avec la dernière valeur calculée (en considérant la première valeur de la liste égal à h). Ainsi, à la fin, on a : √ O(n) + O((log p)2 ) + O(log n) + O(n) = O(n) = O( N ) En fait, en pratique, la complexité n’est pas aussi bonne que ça, car, en considérant les opérations de comparaison, pour trier la première liste on a besoin de O(n log n) étapes et pour trouver l’élément de la première liste, on a aussi besoin de O(n log n) étapes. Alors, √ si on √ considére aussi ces opérations dans le calcul de la complexité, on a O(n log n) = O( N log N ). 3 3. Comme on a vu dans la première section, les multiplications sont plus chères que les comparaisons, mais, comme N est, en général, très grand, on ne peut pas négliger le coût de trier la liste et de chercher les éléments. 4 4.2.3 Exemple Pour illustrer le fonctionnement de cet algorithme, considérons l’exemple suivant : Z ∗ , ·), g = 2 et h = 7. On essaye trouver x tel que g x = h avec cet Soient p = 59, A = ( pZ algorithme. Alors, comme √ A =< g >, on a o(g) = o(A) = p − 1 = 58, donc, on a N = 58. En plus, on calcule n = 1 + b N c = 7 + 1 = 8 et on fait la premier liste : {g r (mod 59)}0≤r<n : 1, 2, 4, 8, 16, 32, 5, 10. Après, on calcule g −n : on sait que g −1 = 30, car gg −1 ≡ 60 ≡ 1 (mod 59). Et comme 308 ≡ 3 (mod 59), on a g −1 = 3. Ainsi, on calcule chaque élément de la deuxième liste et essaye trouver une colision : {hg −nq (mod 59)}0≤q<n : 7, 21, 4 On s’arrête à hg −n2 ≡ 4 (mod 59), car, 4 est dans la première liste. Maintenant, on a trouvé : g 2 ≡ 4 ≡ g −2n (mod 59), donc, une solution est x = 2+2n = 2+2·8 = 18. (En fait, on peut vérifier que 218 ≡ (26 )3 ≡ 53 ≡ 7 (mod 59)). 4.3 4.3.1 Pohlig Hellman L’algorithme Avec cet algorithme on peut diviser un PLD en sous-problèmes (tous PLD aussi) et après utiliser les résultats de ces sous-problèmes pour constuire une solution. Soient A = (G, ·) un groupe, (g, h) ∈ G2 , e l’élément neutre et N = o(g). S’il existe une solution pour le PLD g x = h, alors, il existe x ∈ {0, 1, N − 1} tel que x est solution. Donc, on peut considérer x ∈ NZZ . n Y On écrit N = pi ui (factoriser l’ordre de g en facteurs premiers) i=1 N ui et pour tout i ∈ {1, 2, . . . , n}, on pose gi = g pi ui , hi = hpi et xi une solution modulo l’équation gi xi = hi . Après, on utilise le Théorème des Restes Chinois pour trouver x ∈ NZZ tel que : N pui pour ∀ i ∈ {1, 2, .., n}, x ≡ xi (mod pi ui ) et ce x est une solution du PLD g x = h. Pour résoudre les sous-problèmes gi xi = hi , on utilise la procedure suivante : Pour simplifier la notation, on considère pi = p et ui = u. On écrit xi = a0 + a1 p + a2 p2 + a3 p3 + ... + au−1 pu−1 (xi dans la base p). On voit que n n hi p = (gi xi ) p = gi (a0 +a1 p+...+au−1 p u−1 n )p n = gi a0 p +n(a1 +a2 p+...+ac−1 p c−2 ) n Z et celui-ci est un PLD dans pZ qu’on peut résoudre rapidement pour trouver a0 . Après, on peut faire presque le même raisonnement pour trouver a1 : n n hi p2 = (gi xi ) p2 = gi (a0 +a1 p+...+au−1 pu−1 ) pn2 5 = gi n n = (gi a0 p )e = gi a0 p = (gi p )a0 (a0 +a1 p) pn2 mais comme on connait maintenant le valeur a0 , on peut trouver a1 en résolvant le PLD (aussi Z dans pZ ) n hi p2 gi −a0 pn2 = gi a1 p pn2 n = (gi p2 )a1 . Et, pour trouver a2 , n n hi p3 = (gi xi ) p3 = gi (a0 +a1 p+a2 p2 +...+au−1 pu−1 ) pn3 = gi (a0 +a1 p+a2 p2 ) pn3 . comme on connait les valeurs de a0 et a1 , on fait n hi p3 gi −a0 pn3 −a1 p pn3 = gi a2 p2 pn3 n et on résout ce PLD. (Notons que si on fait b = hi p3 gi ca2 = b). On continue jusqu’à trouver ac−1 en résolvant n n n n n = (gi p3 )a2 −a0 pn3 −a1 p pn3 n hi pc gi −a0 pc −a1 p pc −a2 pc −...−ac−2 pc = gi ac−1 p c−1 n pc n , et c = gi p3 on a le PLD n = (gi pc )ac−1 et on peut, finalement, construire xi = a0 + a1 p + a2 p2 + ... + ac−1 pc−1 . 4.3.2 Complexité En considérant la factorisation de N = O(G) en nombres premiers : N = n Y pi ui , on résout, i=1 pour chaque i appartenant à {1, 2, .., n}, ui PLD dans pZi Z . Alors, si on considère qu’on met √ O( pi ) pour résoudre chacun de ces problèmes, la complexité du Pohlig Hellman est n X √ ui O( pi ) = O( i=1 4.3.3 n X √ ui pi ). i=1 Exemple Z Soient ( 19Z , ·) un groupe, et g = 2 et h = 9 deux éléments de ce groupe. On va résoudre le PLD g x = h. Avant, notons que l’ordre du groupe N = 18 peut être écrit comme N = 32 2 (facteurs premiers) et que dans cette section on va faire les calculs modulo 19. N N Alors, on calcule g1 = g 32 = g 2 = 4, h1 = h2 = 81 = 5, g2 = g 2 = g 9 = 29 = 18 et 9 9 h2 = h = 9 = 1. Maintenant, on résout ces deux sous-problèmes : N N 1. g1x1 = h1 : On écrit x1 = a0 + a1 3 et on trouve a0 , la solution du PLD (g13 )a0 = h13 ⇔ 11a0 = 7 ⇒ a0 = 2. Et on trouve a1 en résolvant le PLD suivant : N N −a0 3N2 g132 = h132 g1 ⇔ (42 )a1 = 52 (4)−2·2 = 52 54 = 7 ⇔ 8a1 = 7 qui donne a1 = 2. Alors, x1 = a0 + a1 3 = 2 + 6 = 8. 2. g2x2 = h2 : en résolvant ce PLD, on va trouver x2 = 2 6 Ainsi, on utilise le Théorème des Restes Chinois pour calculer x tel que x = 8( (mod 32 )) et x = 2( (mod 2)), il vient x = 26. On peut vérifier que g 26 = 226 = (25 )4 2 = (13)4 2 = (4)2 = 8 = h donc, celle solution est correcte. 4.4 4.4.1 Pollard Rho L’algorithme Soient (G, ·) un groupe d’ordre premier 4 p et (g, h) ∈ G2 . On essaye de trouver x ∈ Z tel que g = h. S S On définit une partition G = S0 S1 S2 et la fonction (hy, a, b + 1 (mod p)) si y ∈ S0 , (y 2 , 2a (mod p), 2b (mod p)) si y ∈ S1 , f (y, a, b) = (gy, a + 1 (mod p), b) si y ∈ S2 . x de G × Z × Z dans G × Z × Z. Notons que si y = g a hb , alors, en prenant (z, k, l) = f (y, a, b), z satisfait aussi z = g k hl . Alors, on peut itérer f jusqu’à trouver deux résultats identiques : (y, a, b) = (z, k, l) et après, g a hb = y = z = g k hl ⇒ g a−k = hl−b comme g x = h, on a g a−k = g x(l−b) ⇒ x(l − b) ≡ (a − k) (mod p). Si l − b est inversible modulo p, on trouve finalement la solution x ≡ (a − k)(l − b)−1 (mod p). Si l − b n’est pas inversible modulo p, alors, l’algorithme ne trouve pas de solution. Heureusement, dans la plupart des cas, cette différence est inversible, car, ∃k ∈ Z : k(l − b) ≡ 1 (mod p) ⇔ pgcd((l − b), p) = 1 et comme p est premier, pgcd((l − b), p) 6= 1 ⇔ p|(l − b) ⇔ l ≡ b (mod p). Comme, de la définition de f , on voit que (l, b) ∈ 0, 1, 2, .., p − 1, alors, on conclut que pour que l’algorithme ne trouve pas une solution, il faut que l = b, et dans la plupart des cas, l va être différent de b. Pour itérer la fonction, on commence avec (y1 , a1 , b1 ) = (1, 0, 0) et après, en prenant, pour tout i > 1, (yi , ai , bi ) = f (yi−1 , ai−1 , bi−1 ), on calcule la i-ème et la 2i-ème iterée de f , on compare yi avec y2i , si ces valeurs sont égaules, on calcule la solution, sinon, on itére de nouveau (ça veut dire, on calcule le (i + 1)-ème et le (2i + 2)-ème triplet) 5 . Notons qu’une fois qu’on a (yi , ai , bi ) et (y2i , a2i , b2i ), pour itérer de nouveau, il suffit de faire (yi+1 , ai+1 , bi+1 ) = f (yi , ai , bi ) et (y2i+2 , a2i+2 , b2i+2 ) = f (f (y2i , a2i , b2i )) 4. En fait, si on veut résoudre le PLD dans un groupe dont l’ordre n’est pas premier, on peut utiliser l’algorithme du Pohlig Hellman, diviser en sous-problèmes d’ordre premier. 5. Il s’agit de la méthode de détection de cycle de Floyd. 7 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 /∗ ∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗ ∗ D é f i n i t i o n de l a f o n c t i o n f : ∗ x a p p a r t i e n t à G ∗ ( a , b ) a p p a r t i e n t à Zˆ2 ∗ g e t h s o n t l e s v a l e u r s du PLD ∗ n = o (G) ∗ ordre g = o(g) ∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗ ∗/ void f ( mpz t x , mpz t a , mpz t b , mpz t g , mpz t h , mpz t n , mpz t ordre g ){ /∗ x = 0 (mod 3 ) ∗/ i f ( m p z d i v i s i b l e u i p (x , 3) ) { mpz mul ( x , x , x ) ; mpz mul ui ( a , a , 2 ) ; mpz mul ui ( b , b , 2 ) ; mpz mod ( a , a , o r d r e g ) ; mpz mod ( b , b , o r d r e g ) ; /∗ x = 1 (mod 3 ) ∗/ } else i f ( mpz congruent ui p (x , 1 , 3) ) { mpz mul ( x , x , h ) ; mpz add ui ( b , b , 1 ) ; mpz mod ( b , b , o r d r e g ) ; } e l s e { /∗ x = 2 (mod 3 ) ∗/ mpz mul ( x , x , g ) ; mpz add ui ( a , a , 1 ) ; mpz mod ( a , a , o r d r e g ) ; } mpz mod ( x , x , n ) ; } /∗ ∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗ ∗ C e t t e f o n c t i o n e s s a y e ré s o u d r e l e PLD g ˆx = h ∗ dans l e groupe Z/nZ . ∗ S i e l l e r é u s s i , l e v a l e u r 1 e s t r e t o u r né e t l a ∗ s o l u t i o n e s t g a r dé en x . ∗ S i non , l e v a l e u r 0 e s t r e t o u r né . ∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗ ∗/ int p o l l a r d r h o ( mpz t g , mpz t h , mpz t o r d r e g , mpz t n , mpz t x ) { mpz t x1 , x2 ; mpz t a1 , a2 ; mpz t b1 , b2 ; mpz mpz mpz mpz init init init init set set set set ui ui ui ui ( x1 , ( a1 , ( b1 , ( x2 , 1) ; 0) ; 0) ; 1) ; 8 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 mpz init set ui ( a2 , 0 ) ; mpz init set ui ( b2 , 0 ) ; do { f ( x1 , a1 , b1 , g , h , n , o r d r e g ) ; f ( x2 , a2 , b2 , g , h , n , o r d r e g ) ; f ( x2 , a2 , b2 , g , h , n , o r d r e g ) ; } while (mpz cmp ( x1 , x2 ) != 0 ) ; mpz sub ( x1 , b1 , b2 ) ; mpz mod ( x1 , x1 , o r d r e g ) ; /∗ s i b1 − b2 n ’ a pas d ’ i n v e r s e mod o r d r e g ∗/ i f ( mpz cmp ui ( x1 , 0 ) == 0 ) return 0 ; m p z i n v e r t ( x1 , x1 , o r d r e g ) ; mpz sub ( a2 , a2 , a1 ) ; mpz mul ( x1 , x1 , a2 ) ; mpz mod ( x1 , x1 , o r d r e g ) ; mpz set ( x , x1 ) ; return 1 ; } 4.4.2 Complexité Pour calculer la complexité de cet algorithme, il faut connaı̂tre le résultat suivant : Théorème 4.1 (Paradoxes des Anniversaires). Soient A = {a1 , a2 , .., aN } et I = {1, 2, 3, .., N } tels que 1. (Distribution uniforme) ∀(i, a) ∈ I × A, P (a = ai ) = 1 N 2. (Indépendence) ∀((i, j), (a, b)) ∈ I 2 × A2 , a 6= b, P (a = ai | b = aj ) = P (a = ai ) alors, si on prends m éléments de A, la probabilité pm d’avoir au moins deux éléments égaux satisfait la relation suivante : s 1 m ≈ 2N ln 1 − pm Démonstration. Soit p la probabilité de n’avoir aucun éléments égaux en m tentatives. Alors, pour les proprietés 1 et 2, on a p= N −1 N N −2 N ... Mais, comme ex = 1 + x + Ainsi, on a N −m+1 N x2 2! + x3 3! p≈ m−1 Y 1 2 m−1 i = 1− 1− ... 1 − = 1− . N N N N i=1 i + ..., on peut faire x = − Ni et approximer e− N par 1 − m−1 Y i e− N = e Pm−1 i=1 i=1 9 i −N m2 ≈ e− 2N . i N. m2 m2 Alors, pm = 1 − p ≈ 1 − e− 2N ,donc, e− 2N ≈ 1 − pm , ainsi, pour la définit du logarithme naturel, m2 1 on a 2N ≈ − ln (1 − pm ) = ln 1−pm , d’où, s m≈ 2N ln 1 1 − pm √ Ce théorème dit que dans un ensemble avec N éléments, il faut prendre approximativement N éléments au hasard pour trouver une colision,√ça veut dire, deux éléments égaux (notez que si on fait pm = 0.99 on va avoir encore m près de N ) Alors, si on considère que la première composante de l’image de la fonction f utilisée dans l’algorithme Pollard p Rho a une distribution uniforme en G avec des probabilités indépendentes, on devrait faire o(G) pour trouver une colision. Donc, on peut dire que la complexité de √ l’algorithme de Pollard Rho est appartient à O( p), où p = o(G). Remarquons que dans cet algorithme, on ne prend pas de temps pour trier ou chercher éléments comme dans le Baby-Step. 4.4.3 Exemple Z , ·) un groupe, g = 2 et h = 228. Alors, on peut vérifier que o(g) = 191. Soient ( 383Z On définit la partition suivante de G : Z : y ≡ 1 (mod 3)} 383Z Z S1 = {y ∈ : y ≡ 0 (mod 3)} 383Z Z S2 = {y ∈ : y ≡ 2 (mod 3)} 383Z La table suivante montre les valeurs de f à chaque itéreration : S0 = {y ∈ i 1 2 3 4 5 6 7 8 9 10 11 12 13 14 (yi , ai , bi ) (228, 0, 1) (279, 0, 2) (92, 0, 4) (184, 1, 4) (205, 1, 5) (14, 1, 6) (28, 2, 6) (256, 2, 7) (152, 2, 8) (304, 3, 8) (372, 3, 9) (121, 6, 18) (12, 6, 19) (144, 12, 38) (y2i , a2i , b2i ) (279, 0, 2) (184, 1, 4) (14, 1, 6) (256, 2, 7) (304, 3, 8) (121, 6, 18) (144, 12, 38) (235, 48, 152) (72, 48, 154) (14, 96, 118) (256, 97, 119) (304, 98, 120) (121, 5, 51) (144, 10, 104) On trouve, quand i = 14, yi = 144 = y2i . Alors, la solution est x ≡ (ai − a2i )(b2i − bi )−1 ≡ (12 − 10)(104 − 38)−1 ≡ 2 · 66−1 ≡ 2 · 55 ≡ 110 10 (mod 191) 5 Algorithmes de cryptographie Dans cette section, on verra 2 algorithmes de cryptographie basés sur le problème du logarithme discret. 5.1 Diffie-Hellman Supposons qu’Alice et Bob veulent partager une clé privée, mais ils vont échanger des informations en utilisant un réseau non sécurisé. Alors, 1. Alice choisit un groupe (G, ·) et g ∈ G. Le groupe et la valeur g sont publics. 2. Alice choisit a ∈ Z et Bob choisit b ∈ Z. 3. Alice fait A0 = g a et Bob fait B0 = g b . 4. Alice envoie A0 à Bob et Bob envoie B0 à Alice. 5. Alice calcule A1 = B0 a et Bob calcule B1 = A0 a . Et les valeurs A1 et B1 sont les clés privées. En fait, on voit que A1 = g ab = B1 alors, à la fin, Alice et Bob partagent la même valeur. Dans cette procédure, les valeurs g, A0 , B0 et le groupe (G, ·) sont connues par tous (car on a supposé que la chaı̂ne de communication n’était pas sûre). Alors, quelqu’un peut essayer de résoudre le PLD g x = A0 (ou g x = B0 ) et après utiliser a (ou b) pour trouver la clé A1 = A0 b (ou B0 a ). 5.2 El-Gamal Supposons que Bob veut envoyer un message m à Alice par un réseau non sécurisé. Avec cet algorithme (basé en clé publique), elle peut envoyer m de la manière suivante : 1. Alice choisit g ∈ G (où (G, ·) est un groupe). La valeur g est publique. 2. Alice choisit une clé privée a ∈ G 3. Alice calcule la clé publique A, où A = g a 4. Bob choisit une valeur aléatoire k, calcule B0 = g k et B1 = mAk et envoie (B0 , B1 ) à Alice. 5. Alice calcule A0 = B0 a (qui est égal à g ak ) et A0 −1 . Ainsi, elle fait B1 · A0 −1 = (mAk )(A0 −1 ) = (mg ak )(g ak )−1 = m et réussit à trouver le message m. Voici une implémentation en language C, en utilisant la bibliothèque GMP, des algorithmes de chiffrement et déchiffrement : 11 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 1 2 3 4 5 6 7 8 9 10 11 12 /∗ ∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗ ∗ C e t t e f o n c t i o n c h i f f r e l e message m ∗ avec l a méthode de c l e f p u b l i q u e ElGamal . ∗ On t r a v a i l l e s u r l e groupe m u l t i p l i c a t i v e ∗ Z/pZ∗ ( s a n s l e zé r o ) ∗ La c l e f p u b l i q u e e s t l e c o u p l e ∗ (g , a) ∗ où g e s t un é lé m e n t du groupe e t a e s t ∗ é g a l à g ˆx ( où x e s t l a c l e f p r i v é e ) . ∗ Alors , e l g a m a l e n c f a i t b é g a l ∗ g ˆk (mod p ) ∗ où k e s t un nombre a l é a t o i r e e t f a i t ∗ m = m∗ a ˆk (mod p ) . ∗ Alors , l e message c h i f f r é e s t ∗ ( b , m) = ( g ˆk , m∗ a ˆk ) ∗ ∗ On assume que b e s t dé j à i n i t i a l i s é . ∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗ ∗/ void e l g a m a l e n c ( mpz t m, mpz t g , mpz t a , mpz t p , mpz t b ) { mpz t k ; gmp randstate t state ; gmp randinit default ( state ) ; mpz set ( b , a ) ; mpz init ( k ) ; do{ mpz urandomm ( k , s t a t e , p ) ; } while ( mpz cmp ui ( k , 0 ) == 0 ) ; /∗ pendant k e s t é g a l à zé r o ∗/ e x p o n e n t i a t i o n r a p i d e ( b , k , p ) ; /∗ bˆk (mop p ) , où b = a ∗/ mpz mul (m, m, b ) ; mpz mod (m, m, p ) ; mpz set ( b , g ) ; e x p o n e n t i a t i o n r a p i d e ( b , k , p ) ; /∗ bˆk (mod p ) , où b = g ∗/ mpz clear ( k ) ; } /∗ ∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗ ∗ C e t t e f o n c t i o n r e ç o i t un message c h i f f r é ∗ ( c1 , c2 ) = ( g ˆk , m ∗ a ˆk ) , ∗ ( avec l a méthode ElGamal ) ∗ et trouve l e texte c l a i r correspondant ( et ∗ l e g a r d e s u r c1 ) . ∗ I l f a u t a u s s i donner l a c l e f p u b l i q u e ∗ x ( t e l que a = g ˆx ) . ∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗ ∗/ void e l g a m a l d e c ( mpz t c1 , mpz t c2 , mpz t x , mpz t p ) { mpz t tmp ; 12 13 14 15 16 17 18 19 mpz init ( tmp ) ; e x p o n e n t i a t i o n r a p i d e ( c1 , x , p ) ; i n v e r s e ( c1 , p , tmp ) ; mpz mul ( c2 , c2 , tmp ) ; mpz mod ( c2 , c2 , p ) ; mpz clear ( tmp ) ; } 5.3 Conclusion Un des systèmes de cryptographie asymétrique le plus utilisé est ElGamal, ce qui montre déjà son importance. Aussi, il semble que le PLD est un problème plus difficile (sur certains groupes) que celui de factorisation de nombres entiers, ce que lui donne quelque avantage sur le RSA. En plus, le ElGamal est plus generique, il est possible de le mettre en oeuvre sur plusieurs groupes différents et proffiter des proprietés de chaque groupe (par exemple, sur les courbes elliptiques la multiplication est plus compliquée, ce qui fait qu’on puisse utiliser les nombres plus petits que Z ). sur le groupe pZ Comment a vu, le Baby-Step Giant-Step est plus facile à mettre en oeuvre que le Pollard Rho, en plus, il donne toujours une solution (si elle existe). Par contre, il est plus lent. On voit qu’on ne connait pas encore un algorithme efficace en pratique pour résoudre le PLD, parce que, malgré la complexité asymptotique presenté ici être raisonnable, elle a été calculée en fonctions des opérations de multiplications et ces opérations prennent des temps en fonction de la taille de chaque nombre (nombre des bits). Par exemple, si on considère qu’un ordinateur prends 10−5 seconds pour mutiplier un nombre de 1024 bits, alors, si on a p ≈ 21024 , l’algorithme de Pollard Rho va prends √ 10−5 p secondes ≈ 2512 10−5 secondes = 2512 10−5 · 3.16887646 · 10−8 années > 4.2 · 10141 années 5.4 Références 1. A. Menezes, P. van., Oorschot, and S. Vanstone. Handbook of Applied Cryptography. CRC Press, 1996. 2. Douglas R. Stinson. Cryptography : Theory And Practice. Chapman and Hall/CRC, 2006. 3. J.H. Silverman, Jill Pipher, Jeffrey Hoffstein. An Introduction to Mathematical Cryptography. Springer New York. 13