Mathématiques Discrètes et Algorithmique - LMPT

Transcription

Mathématiques Discrètes et Algorithmique - LMPT
Université François Rabelais de Tours
Laboratoire de Mathématiques et Physique Théorique
Mathématiques Discrètes et Algorithmique
UE 5-4 Option
Semestre 5
4. Logarithme discret
Dans cette partie on étudie le logarithme discret. On présentera des algorithmes pour le calculer et on
montrera comment cette notion peut être utilisée en cryptographie.
4.1. Arithmétique modulaire.
Définition 4.1. Soit n > 1. On écrite a ≡ b mod n si et seulement si n | a − b (n divise a − b). En d’autres
termes, si et seulement si il existe k ∈ Z tel que a = b + nk.
Attention à ne pas confondre a ≡ b mod n et a mod n !
Exemple 4.2. On a par exemple 10 ≡ 1 mod 9 ou encore −3 ≡ 5 mod 8.
Lemme 4.3. Soit n ∈ N tel que n > 2. On a
(a) Si a ≡ b mod n et c ≡ d mod n, alors a ± c ≡ b ± d mod n.
(b) Si a ≡ b mod n et c ≡ d mod n alors ac ≡ bd mod n.
(c) Si a ≡ b mod n et b ≡ c mod n alors a ≡ c mod n.
(d) Si a ≡ b mod n, alors ak ≡ bk mod n pour tout k ∈ N.
Définition 4.4. Soit x ∈ Z. On désigne par x̄ la classe de x modulo n, c’est à dire
x̄ := {x + kn | k ∈ Z}.
Proposition 4.5. On a ā = b̄ dans Z/nZ si et seulement si a ≡ b mod n
Démonstration. Supposons que a = b, c’est-à-dire {a + kn | k ∈ Z} = {b + qn | q ∈ Z}. Ainsi, a ∈ {b + qn |
q ∈ Z} et il existe q ∈ Z tel que a = b + qn et donc a ≡ b mod n. Réciproquement, si a ≡ b mod n alors
il existe k0 tel que a = b + k0 n. On a donc, pour tout k ∈ Z :
a + kn = b + (k0 + k)n ∈ {b + k ′ n | k ′ ∈ Z}
ce qui implique
De même
ce qui implique
d’où le résultat.
{a + kn | k ∈ Z} ⊂ {b + k ′ n | k ′ ∈ Z}
b + kn = a + (k − k0 )n ∈ {{a + kn | k ∈ Z}}
{b + k ′ n | k ∈ Z} ⊂ {a + k ′ n | k ′ ∈ Z}
On définit les opérations suivantes sur les classes modulo n :
et x · y = xy.
x+y =x+y
Exercice : Montrer que ces opérations sont bien définies.
Solution : Le problème vient du fait que si on choisit deux représentants différents des classes on doit
avoir le même résultat. En d’autres termes, si x = x′ et y = y ′ alors on doit avoir x + y = x′ + y ′ . On a
x = x′ et y = y ′
=⇒ x ≡ x′ mod n et y ≡ y ′ mod n
=⇒ x + y ≡ x′ + y ′ mod n
=⇒ x + y = x′ + y ′ .
x = x′ et y = y ′
=⇒ x ≡ x′ mod n et y ≡ y ′ mod n
=⇒ xy ≡ x′ y ′ mod n
=⇒ xy = x′ y ′ .
De même, on a
1
2
On désigne par Z/nZ l’ensemble des classes modulo n. On a alors
Z/nZ = {0̄, 1̄, . . . , n − 1}.
En effet, soit x ∈ Z. Il existe (q, r) ∈ Z tel que x = bq + r avec 0 ≤ r ≤ b − 1. On a donc
x = r ∈ {0̄, 1̄, . . . , n − 1.
On remarque aussi que si 0 ≤ a 6= b ≤ n − 1, alors a 6≡ b. En effet on a
−(n − 1) ≤ a − b ≤ n − 1
et donc pour avoir a ≡ b mod n on doit avoir a − b = 0.
Théorème 4.6. (Z/nZ, +, ·) est un anneau.
Définition 4.7. Soit Z/nZ∗ l’ensemble des éléments inversibles de Z/nZ. C’est à dire, l’ensemble des
ā ∈ Z/nZ tel qu’il existe b̄ ∈ Z/nZ tel que ā · b̄ = 1̄.
Exemple 4.8. Soit n = 8. L’addition dans Z/ mod 8Z est donnée par la table suivante La table de
Table 1. Addition in Z/8Z
+
0
1
2
3
4
5
6
7
0
1
2
3
4
5
6
7
0
1
2
3
4
5
6
7
1
2
3
4
5
6
7
0
2
3
4
5
6
7
0
1
3
4
5
6
7
0
1
2
4
5
6
7
0
1
2
3
5
6
7
0
1
2
3
4
6
7
0
1
2
3
4
5
7
0
1
2
3
4
5
6
multiplication est donnée par
Table 2. Multiplication in Z/8Z
×
0
1
2
3
4
5
6
7
0
1
2
3
4
5
6
7
0
0
0
0
0
0
0
0
0
1
2
3
4
5
6
7
0
2
4
6
0
2
4
6
0
3
6
1
4
7
2
5
0
4
0
4
0
4
0
4
0
5
2
7
4
1
6
3
0
6
4
2
0
6
4
2
0
7
6
5
4
3
2
1
On voit donc que les inversibles sont 1, 3, 5, 7. On a la table suivante
Table 3. Multiplication in (Z/8Z)∗
×
1
3
5
7
1
3
5
7
1
3
5
7
3
1
7
5
5
7
1
3
7
5
3
1
Théorème 4.9. Soit x ∈ Z. On a x ∈ (Z/nZ)∗ si et seulement si pgcd(x, n) = 1. On a donc
Z/nZ∗ = {x̄ | 0 ≤ x ≤ n − 1, pgcd(x, n) = 1}.
3
Démonstration. Soit x ∈ Z. Si pgcd(x, n) = 1 alors il existe u, v ∈ Z tel que xu + nv = 1. On a donc
xu ≡ 1 mod n, autrement dit xu = 1 et x est inversible.
Réciproquement, supposons que x est inversible. Il existe y tel que 1 = xy = xy. Ainsi, on a xy − 1 = kn
pour un k ∈ Z. Il s’ensuit que xy − kn = 1 et par la réciproque du Théorème de Bézout on obtient
pgcd(x, n) = 1.
La fonction d’Euler est définie par :
ϕ
: N∗
n
−→ N∗
7−→ Card{m ∈ N∗ | m ≤ n et m premier avec n}).
Ainsi (Z/nZ) est un group multiplicatif qui contient ϕ(n) éléments. Lorsque p est premier, on a ϕ(p) = p−1.
4.2. Racines primitives.
Définition 4.10. Soit G un groupe et soit g ∈ G. L’ordre de g est le le plus petit entier strictement positif
k tel que g k = 1 où désigne l’identité du groupe. On note o(g) = k.
Exemple 4.11. Dans le cas n = 8, on a (Z/8Z)∗ contient 8 éléments 1, 3, 5, 7 on a les ordres suivants :
o(1) = 1, o(3) = 2, o(5) = 2, o(7) = 2.
Proposition 4.12. Soit G un groupe et soit g ∈ G. On a g m = 1̄ si et seulement si o(b) | m.
Démonstration. On va le faire en toute géneralité. Soit G un groupe et soit g ∈ G. On pose ℓ = o(g).
Montrons que g m = 1 si et seulement si ℓ | m. Il est clair que si ℓ divise m alors m = kℓ et g m = g kℓ =
(g ℓ )k = 1k = 1. Réciproquement, supposons que g m = 1. Il existe (q, r) ∈ N2 tel que m = qℓ + r et
0 ≤ r ≤ ℓ − 1. On a donc
g m = g qℓ+r = (g ℓ )q g r = g r = 1
et par minimalité de ℓ on a forcément r = 0 d’où le résultat.
Définition 4.13. Soit b̄ ∈ (Z/nZ)∗ . Si o(b̄) = ϕ(n) alors b̄ est appelé une racine primitive modulo n.
Exemple 4.14. 3̄ est une racine primitive modulo 7. En effet, on a
i
3̄i
0
1̄
1
3̄
2
2̄
3
6̄
4
4̄
5
5̄
6
1̄
Il n’existe pas de racine primitive modulo 8, Tous les éléments de (Z/8Z)∗ = {1̄, 3̄, 5̄, 7̄} sont d’ordre 2.
Notons que si (Z/nZ)∗ possède une racine primitive, c’est un groupe cyclique, par définition. Comme
remarqué précédemment, tous les entiers n n’ont pas nécessairement de racines primitives. Cependant,
nous allons montrer que si on peut trouver une racine primitive dans Z/nZ∗ alors il est facile de trouver
toutes les autres. Les résultats suivants sont des résultats classiques de théorie des groupes.
Proposition 4.15. Soit G un groupe fini. Soit g ∈ G un élément d’ordre n et soit k ∈ N. Alors g k est
d’ordre n/pgcd(n, k)
n
k
Démonstration. Soit d = pgcd(n, k) et soit ℓ l’ordre de g k . Premièrement, on a (g k ) d = (g n ) d = 1 et donc
ℓ divise n/d. Ensuite on a (g k )ℓ = g kℓ = 1 et donc n | kℓ. Ceci implique n/d | ℓ(k/d). Mais n/d and k/d
sont premiers entre-eux, donc n/d divise ℓ. Finalement, on obtient ℓ = n/d.
Corollaire 4.16. Soit ā ∈ Z/nZ∗ et k ∈ N. On a o(āk ) = o(ā)/pgcd(k, o(ā)).
Nous allons avoir besoin du théorème suivant (que nous supposerons vrai sans le prouver).
Théorème 4.17. Soit P un polynôme non nul de degré d à coefficients dans Fp = Z/pZ. Alors P a au
plus d racines dans Fp .
Notons que ce théorème n’est pas vrai si n n’est pas premier. En effet, conisdérons le polynôme 2X − 2 à
coefficients dans Z/4Z. Il est de degré 1 mais il a 2 racines dans Z/4Z !
Proposition 4.18. Soit ā ∈ (Z/pZ)∗ tel que o(ā) = d. L’ensemble des éléments d’ordre d dans (Z/pZ)∗
est {āi | pgcd(i, d) = 1}. En particulier, il y en a ϕ(d).
Démonstration. Puisque ā est d’ordre d, tous les éléments ā, ā2 , . . . , ād sont distincts modulo p. On a
∗ Tous les éléments d’ordre d sont racines du polynôme X d − 1. Il y en a donc au plus d ;
∗ Tous les éléments ā, ā2 , . . . , ād sont des racines de X d − 1.
Les éléments d’ordre d apparaissent donc dans la liste ā, ā2 , . . . , ād . D’après le Corollaire 4.16 on a
o(āi ) = d/pgcd(d, i)
et donc āi est d’ordre d si et seulement si pgcd(i, d) = 1. Il y en a ϕ(d).
4
Finalement, on prouve le résultat principal de cette sous-section.
Théorème 4.19. Soit p un nombre premier. Le groupe Z/pZ∗ est cyclique. Il existe donc des racines
primitives modulo p. Plus précisément, il y en a ϕ(ϕ(p)) = ϕ(p − 1).
Démonstration. Si on peut en trouver une, on sait qu’il y en aura ϕ(p − 1) par la proposition précédente
appliquée au cas d = p − 1. Comptons les éléments de (Z/pZ)∗ en les regroupant en fonctiond de leurs
ordres :
∗
|(Z/pZ) | =
=
p−1
X
d=1
|éléments d’ordre d|
X
d,d|p−1
≤
|éléments d’ordre d|
X
ϕ(d)
d, d|p−1
Mais on sait que (ou on supposera que l’on sait)
X
ϕ(d) = p − 1 = |(Z/pZ)∗ |
d, d|p−1
Et donc, pour tout d tel que d | p − 1 il existe un élément d’ordre d.
Notons que si ā est une racine primitive modulo p, tout élément de Z/pZ∗ est une puissance de ā.
Exemple 4.20. On cherche les racines primitives modulo 11. On a
i
2̄i
0
1̄
1 2
2̄ 4̄
3 4
8̄ 5̄
5 6 7
¯
10 9̄ 7̄
8 9
3̄ 6̄
10
1̄
et donc 2̄ est une racine primitive. Les autres racines primitives sont de la forme 2̄i où i est premier avec
10, c’est à dire i = 1, 3, 7, 9. Les racines primitives modulo 11 sont donc 8̄, 7̄ et 6̄ puisque
23 ≡ 8
mod 11, 27 ≡ 7 mod 11 and 29 ≡ 6
mod 11
Pour trouver une racine primitive, la méthode brutale consiste à prendre un élément b̄ ∈ Z/pZ et tester
toutes les puissances b̄k pour k = 1 . . . (p − 1). Si aucune ne vaut 1, on a une racine primitive, sinon on
choisit un autre élément de Z/pZ∗ . On peut d’ores et déjà simplifier cette méthode. Vu que l’ordre de b̄
divise p − 1, il suffit de tester les puissance b̄k où k | (p − 1). Cela enlève un certain nombre de calculs de
puissances et les remplace par de simples divisions euclidiennes.
4.3. Logarithme discret.
Définition 4.21. Soit p un nombre premier et soit b̄ une racine primitive modulo p. Soit ȳ ∈ Z/pZ∗ . Le
logarithme discret de ȳ dans la base b̄ (noté logb̄,p (ȳ)) est l’unique entier 0 ≤ x ≤ p − 1 tel que b̄x = ȳ
(c’est à dire bx ≡ y mod p).
Penser au logarithme népérien ln : R+ −→ R pour vous rappeler la définition du logarithme discret. En
effet ln(y) est l’unique réel x tel que ex = eln(y) = y.
Le problème du logarithme discret. Soit p un nombre premier et b̄ une racine primitive modulo p.
Soit ā ∈ Z/pZ∗ . Trouver k tel que bk ≡ a mod p (i.e. trouver logb̄,p (ā)).
Le problème du logarithme discret est supposé être difficile à calculer lorsque les valeurs de n sont très
grandes (de l’ordre de 150–200 chiffres par exemple !). Nous allons présenter deux algorithmes pour calculer
le logarithme discret, un par force brute et l’autre un peu plus malin.
Exemple 4.22. On va chercher les racines primitives modulo 23 de manière "intelligente". On sait que
|Z/23Z∗ | = 22 = 2 · 11. Ainsi, les éléments de Z/23Z∗ sont d’ordre 1 (seulement l’identité), 2, 11 ou 22.
Pour montrer qu’un élément x est d’ordre 22, il suffit donc de montrer que x, x2 et x11 sont différent de 1.
On va utiliser l’exponentation modulaire rapide vu au chapitre 2. Tout d’abord, on a 11 = 23 + 2 + 1. Pour
chaque élément x que l’on va tester on va calculer successivement x, x2 , x4 , x8 puis multiplier x8 · x2 · x.
5
On a
x
1
2
3
4
5
x
1
2
3
∗
5
x2
1
4
9
∗
2
x4
1
16
12
∗
4
x8
1
3
6
∗
16
x8 · x2 · x
1
3·4·2 =1
6·9·3 =1
1
16 · 2 · 5 = −1
i
On voit donc que 5 est une racine primitive. Les autres racines primitives sont de la formes 5 avec
pgcd(i, 22) = 1, c’est à dire i ∈ {3, 5, 7, 9, 13, 15, 17, 19, 21}. Les racines primitives modulo 23 sont donc
5, 10, 20, 17, 11, 21, 19, 15, 7, 14.
L’algorithme le plus basique pour calculer le logartihme discret est le suivant.
Données : b, p, a ∈ N
k := 0
r := 1
tant que r 6= a faire
k := k + 1
r := b · r
fin
Résultat : k
(p premier, b racines primitives, 1 ≤ a ≤ p − 1)
Algorithme 10: Calcul du Logarithme discret
Cet algorithme nécessite au plus n calcul de puissances. Faisons tourner l’algorithme pour calculer log5,23 (13).
On calcule simplement les puissances successives de 5 modulo 23, et on s’arrête lorsqu’on a trouver 13 !
i
5i
0
1
1
5
2
2
3
10
4
4
5
20
6
8
7
17
8
16
9
11
10
9
11
22
12
18
13
21
14
13
et donc log5,23 (13) = 14. On peut être un peu plus malin avec l’algorithme suivant.
Données : b̄, p, a ∈ N (p premier, b̄ racines primitives, 1 ≤ a ≤ p − 1)
√
m := ⌈ p ⌉
L := b̄, b̄2 , . . . , b̄m
y := ā
pour i = 0 à m − 1 faire
si ȳ ∈ L alors
log := i × m + P osition(ȳ, L)
sinon
ȳ := ȳ · b̄−m
fin
fin
Résultat : log
Algorithme 11: Calcul du Logarithme discret
¯ D’abord on calcule que m = 4 et L := (5, 2, 10, 4). Il
Appliquons cet algorithme pour calculer log5,11 (13).
−4
est aussi commode de calculer 5̄ = 6.
test du si
y
i=0
13 ∈
/L
y = 13 · 6 = 9
i=1
9∈
/L
y = 9·6 =8
i=2
8∈
/L
y = 8·6 =2
i=3
2∈L
et l’algorithme renvoie i × m + Position(ȳ, L) = 3 × 4 + 2 = 14. Sur cette exemple, il n’est pas flagrant que
cet algorithme est plus rapide,
mais cela le devient lorsque la valeur des paramètres augmentent.
√
Cet algorithme nécessite n calculs de puissances.
6
4.4. Application : L’échange de clés Diffie-Hellman. Le problème du logarithme discret peut-être
reformulé de la manière suivante :
x
y
xy
Problème de Diffie-Hellman : Soit b une racine primitive modulo p. Connaissant b et b trouver b .
Clairement, si on sait calculer le logarithme discret on peut résoudre ce problème. (Il suffit de calculer
x
y
xy
logb,p (b ) = x et logb,p (b ) = y puis calculer b ). Comme il est très difficile de calculer le logarithme discret,
on peut utiliser ce problème pour un échange de clé, c’est à dire pour que deux personnes (classiquement,
Alice et Bob) qui communiquent publiquement s’accordent secrètement sur une clé (ici un entier). On
supposera que Eve qui écoute ce que Alice et Bob se racontent, essaie de trouver la clé. On procède de la
manière suivante :
∗ Ils s’accordent publiquement sur un nombre premier p et une racine primitive b̄ modulo p.
∗ Alice choisit secretement un entier x et envoie à Bob b̄x .
∗ Bob choisit secretement un entier y et envoie à Alice b̄y .
A ce stade, Alice connait x, b̄x , b̄y et Bob connait y, b̄x , b̄y . Eve, quant à elle connait b̄x , b̄y .
∗ Alice calcule b̄y à la puissance x. Elle obtient (b̄y )x = b̄yx = b̄xy
∗ Bob calcule b̄x à la puissance y. Il obtient (b̄x )y = b̄xy
Maintenant Bob et Alice connaissent tous les deux b̄xy . Eve, elle, ne connait que b̄x et b̄y et pour connaître
b̄xy il faut qu’elle résolve le problème de Diffie-Hellman !
4.5. Le cryptosystème ElGamal. On décrit maintenant un cryptosystème basée sur le problème du
logarithme discret. On suppose que Bob veut envoyer un message à Alice. Alice fait les choses suivantes
A1. choisit un grand nombre premier p.
A2. Trouve une racine primitive b modulo p.
A3. choisit un nombre 1 ≤ m ≤ p − 2.
m
A4. Publie (c’est à dire rend publique) le triplet (p, b, b ).
m
[Alice publie le représentant de la classe de b et b
qui est compris entre 0 et p − 1.]
(Eve ne peut trouver m sans résoudre le problème du logarithme discret...)
Bob veut envoyer secretement le message M ∈ Z/pZ à Alice. Il fait les choses suivantes
m
B1. Obtient p, b, b .
B2. choisit un nombre 1 ≤ k ≤ p − 2.
k
B3. Calcule γ = b et δ = M · b
km
.
B4. Envoie (γ, δ) à Alice.
[Bob envoie le représentant de la classe de γ et δ qui est compris entre 0 et p − 1.]
Décryptage. Alice procède de la manière suivante
km
D1. calcule γ m = b
.
D2. calcule l’inverse b−km de b
D3. mutliplie b
−km
km
.
avec δ et trouve
−km
δ·b
km
= (M · b
) · b−km = M
km
calcule γ m (elle est la seule à connaître m) et obtient γ m = b .
km
−km
−km
et trouve b
. Elle mutliplie b
avec δ et trouve :
Elle calcule l’inverse de b
−km
δ·b
km
= (M · b
)·b
−km
=M
Exemple 4.23. Soit p = 37 et b = 13. Alors b est une racine primitive modulo 37.
Alice publie (37, 13, 11). Bob veut envoyer M = 22 ∈ Z/37Z à Alice. Il choisit k = 4 et calcule
k
m
4
4
γ = b = 13 = 34 mod 37 et δ = M · (b )k = 22 · 11 = 17.
Finalement il envoie (34, 17) à Alice.
6
Alice, qui avait préalablement choisit m = 6 (on vérifie que 13 ≡ 11 mod 37) calcule
6
−1
34 = 26, 26
= 10 et 17 · 10 = 22.

Documents pareils