Préliminaires arithmétiques⚓︎
Notations utilisées
Le protocole de Diffie-Hellman, comme la plupart des algorithmes de chiffrements modernes, repose sur les nombres premiers et l'arithmétique modulaire. Cela consiste à faire les calculs modulo un nombre, généralement premier.
On dit que deux entiers \(a\) et \(b\) sont égaux modulo \(n\), noté \(a=b \text{ mod } n\), si le reste de la division euclidienne de \(a\) par \(n\) est égal au reste de la division de \(b\) par \(n\). C'est-à-dire que a%n == b%n
.
On notera \(\mathbb{Z}/n\mathbb{Z}\) l'ensemble des nombres entiers \(\{0, 1, \cdots, n-1\}\), c'est-à-dire l'ensemble des restes possibles dans la division euclidienne par \(n\). Soit \(a\) et \(b\), des nombres de \(\mathbb{Z}/n\mathbb{Z}\). Si \(a\times b = 1 \text{ mod } n\), on dit que \(a\) et \(b\) sont inverses l'un de l'autre.
On note \(\mathbb{Z}/n\mathbb{Z}^*\) l'ensemble des éléments inversibles dans \(\mathbb{Z}/n\mathbb{Z}\). Par exemple, \(0\) n'est jamais inversible et n'est donc jamais dans \(\mathbb{Z}/n\mathbb{Z}^*\).
Table de multiplication modulo p
La fonction table_mult_modulo
prend en paramètre un entier p
et affiche la table de multiplication modulo p
pour les entiers allant de 1
à p-1
.
Exercice 1
En utilisant table_mult_modulo
, déterminer :
- l'inverse de \(3\) dans \(\mathbb{Z}/5\mathbb{Z}\) ;
- l'inverse de \(3\) dans \(\mathbb{Z}/7\mathbb{Z}\) ;
- l'inverse de \(3\) dans \(\mathbb{Z}/13\mathbb{Z}\).
On rappelle qu'un inverse d'un nombre \(a\) est un nombre \(b\) tel que \(a\times b=1\).
Explications
On peut remarquer que le nombre 3 a un inverse dans ces trois cas. Il n'est pas si évident de deviner sa valeur. On peut vérifier que :
- \(3\times2=6 = 1\times 5 + 1\)
- \(3\times5=15 = 2\times7 + 1\)
- \(3\times9=27 = 2\times13 + 1\)
Exercice 2
Toujours en utilisant table_mult_modulo
, répondre aux questions suivantes :
- Quels sont les éléments non inversibles de \(\mathbb{Z}/4\mathbb{Z}\), \(\mathbb{Z}/6\mathbb{Z}\) et \(\mathbb{Z}/9\mathbb{Z}\) ?
- Quels sont les nombres non-inversibles de \(\mathbb{Z}/12\mathbb{Z}\) ?
- Quels sont les éléments de \(\mathbb{Z}/12\mathbb{Z}\) qui ne sont pas premiers avec \(12\) ?
Un nombre est non-inversible s'il n'a pas d'inverse. C'est le cas de 0, par exemple.
Deux nombres sont premiers entre eux s'ils n'ont pas de diviseurs communs autre que 1.
Explications
L'ensemble \(\mathbb{Z}/n\mathbb{Z}^*\) est l'ensemble des nombres qui sont premiers avec \(n\). En particulier, si \(n\) est premier, alors \(\mathbb{Z}/n\mathbb{Z}^*=\{1, 2, \cdots, n-1\}\).
Exercice 3
En testant plusieurs nombres premiers \(p\), que remarque-t-on pour chaque ligne, si on la compare avec les valeurs de \(\mathbb{Z}/p\mathbb{Z}^*\) ?
Explications
Lorsque \(p\) est premier, pour tout \(a\in \mathbb{Z}/p\mathbb{Z}^*\), la liste de toute les valeurs \(a\times b \text{ mod } p\), avec \(b\in \mathbb{Z}/p\mathbb{Z}^*\) est une permutation de \(a\in \mathbb{Z}/p\mathbb{Z}^*\). Ainsi, si \(b\) est choisi au hasard, \(a\times b \text{ mod }p\) est distribué de façon équiprobable dans \(\mathbb{Z}/p\mathbb{Z}^*\).
Exercice 4
Écrire le code de la fonction puissances
qui prend en paramètres deux entiers g
et p
, et qui renvoie la liste des puissances de g
modulo p
en allant de \(\texttt{g}^1\) à \(\texttt{g}^{\texttt{p}-1}\) inclus.
>>> puissances(3, 7)
[3, 2, 6, 4, 5, 1]
>>> puissances(2, 13)
[2, 4, 8, 3, 6, 12, 11, 9, 5, 10, 7, 1]
# Tests
(insensible à la casse)(Ctrl+I)
# Tests
(insensible à la casse)(Ctrl+I)
La table des puissances modulo p
On considère la fonction ci-dessous qui permet d'afficher la liste des puissances des éléments de \(\mathbb{Z}/p\mathbb{Z}\).
# Tests
(insensible à la casse)(Ctrl+I)
Exercice 5
En affichant les tables pour \(p\) valant 3, 5, 7 et 11, que remarque-t-on pour \(g^{p-1}\) ?
Explications
On remarque que la dernière valeur est toujours égale à 1. On peut également remarquer que parfois, il y a des 1 qui arrivent plus tôt.
Ordre d'un groupe
On appelle l'ordre de \(g\) dans \(\mathbb{Z}/p\mathbb{Z}^*\) la plus petite valeur non nulle de \(a\) telle que \(g^a\ \%\ p=1\).
On appelle l'ordre du groupe \(\mathbb{Z}/p\mathbb{Z}^*\) le nombre d'éléments qu'il contient.
Exercice 6
Pour cet exercice, on travaille dans \(\mathbb{Z}/13\mathbb{Z}^*\).
- Déterminer l'ordre de chacun des éléments de \(\mathbb{Z}/13\mathbb{Z}^*\).
- Quel est l'ordre de \(\mathbb{Z}/13\mathbb{Z}^*\) ?
- Quelle propriété ont les ordres de ces éléments par rapport à l'ordre de \(\mathbb{Z}/13\mathbb{Z}^*\) ?
Exercice 7
Mêmes questions que celles de l'exercice précédent, mais avec \(\mathbb{Z}/8\mathbb{Z}^*\).
Exercice 8
Écrire le code de la fonction ordre
qui prend en paramètres deux entiers g
et p
, et qui renvoie l'ordre de g
dans \(\mathbb{Z}/p\mathbb{Z}^*\). Si g
n'est pas inversible, dans \(\mathbb{Z}/p\mathbb{Z}^*\), alors la fonction renvoie -1
.
>>> ordre(2, 8)
-1
>>> ordre(3, 7)
6
>>> ordre(5, 7)
6
>>> ordre(4, 7)
3
# Tests
(insensible à la casse)(Ctrl+I)
# Tests
(insensible à la casse)(Ctrl+I)
Générateur d'un groupe
On dit que \(g\) est un générateur de \(\mathbb{Z}/p\mathbb{Z}^*\) si l'ordre de \(g\) est égal à l'ordre de \(\mathbb{Z}/p\mathbb{Z}^*\). Si \(g\) est un générateur, alors la liste des puissances de \(g\) est une permutation de \(\mathbb{Z}/p\mathbb{Z}^*\).
Connaissant \(p\), \(g\) et \(m = g^a \text{ mod } p\), retrouver la valeur de \(a\) s'appelle le problème du logarithme discret.
Exercice 9
Écrire le code de la fonction logarithme_discret
qui prend en paramètres trois entiers g
, m
et p
et qui calcule l'entier a
tel que \(\texttt{m} = \texttt{g}^{\texttt{a}} \text{ mod } \texttt{p}\).
On suppose que g
est un génrérateur de \(\mathbb{Z}/p\mathbb{Z}^*\) et que m
appartient à \(\mathbb{Z}/p\mathbb{Z}^*\).
>>> logarithme_discret(2, 7, 11)
7
>>> logarithme_discret(2, 5, 11)
4
>>> logarithme_discret(2, 1, 11)
0
>>> logarithme_discret(2, 3, 11)
8
# Tests
(insensible à la casse)(Ctrl+I)
# Tests
(insensible à la casse)(Ctrl+I)
Exercice 10
On prend \(p=8704351\) et \(g=3\) un générateur de \(\mathbb{Z}/p\mathbb{Z}^*\). Déterminer le logarithme discret de \(m=2541552\).
logarithme_discret(3, 2541552, 8704351)
Exercice 11
On prend \(p=733336898214308139427731599029\) et \(g=2\) un générateur de \(\mathbb{Z}/p\mathbb{Z}^*\).
Déterminer le logarithme discret de \(m=188694425037893921658700181569\).
logarithme_discret(2, 188694425037893921658700181569, 733336898214308139427731599029)
Il vaut mieux faire ce calcul en utilisant Thonny.
Explications
Le nombre \(p\) n'a que 100 bits. Le problème devient déjà trop dur pour être résolu rapidement. Les clefs utilisées pour Diffie-Hellman ont 1024 ou 2048 bits.
# Tests
(insensible à la casse)(Ctrl+I)