nsi:tds:cryptographie:ecc
Différences
Ci-dessous, les différences entre deux révisions de la page.
| Les deux révisions précédentesRévision précédenteProchaine révision | Révision précédente | ||
| nsi:tds:cryptographie:ecc [2023/04/11 14:52] – goupillwiki | nsi:tds:cryptographie:ecc [2023/05/08 16:53] (Version actuelle) – [Nombre plutôt que point] goupillwiki | ||
|---|---|---|---|
| Ligne 107: | Ligne 107: | ||
| Comme avec les nombres entiers, il est plus intéressant de travailler avec modulo : | Comme avec les nombres entiers, il est plus intéressant de travailler avec modulo : | ||
| * Les calculs seront exclusivement sur des nombres entiers ce qui facilitera les choses, | * Les calculs seront exclusivement sur des nombres entiers ce qui facilitera les choses, | ||
| - | * comme avec les nombres entiers, les modulos | + | * comme avec les nombres entiers, les modulos |
| On modifie un peut la définition : | On modifie un peut la définition : | ||
| - | * On choisit un premier $p$, en situation réelle on le prend assez grand. | + | * On choisit un premier $p$, en situation réelle on le prend assez grand.\\ on note $a \overset{p}{\equiv} b$ pour $a = b \mod p$. |
| * Les points considérés ont des coordonnées $(x ; y)$ entières. | * Les points considérés ont des coordonnées $(x ; y)$ entières. | ||
| - | * On considère que deux points $P_1(x_1; | + | * On considère que deux points $P_1(x_1; |
| - | * L' | + | * L' |
| - | * La contrainte devient $4\cdot a^3 + 27 \cdot b^2 \not\equiv 0 [p]$ | + | * La contrainte devient $4\cdot a^3 + 27 \cdot b^2 \overset{p}{\not\equiv} |
| Dans le cadre de ce TD, on prendra $p = 13$ et toujours $a=-1$ et $b=1$. | Dans le cadre de ce TD, on prendra $p = 13$ et toujours $a=-1$ et $b=1$. | ||
| Ligne 176: | Ligne 176: | ||
| J'ai fait le test avec $a=-1$, $b = 1$ et $p = 502181$. J' | J'ai fait le test avec $a=-1$, $b = 1$ et $p = 502181$. J' | ||
| + | |||
| + | <WRAP tip> Dans le module suivant {{ : | ||
| + | |||
| + | Avec ces fonctions, pour un $x$ donné, on peut calculer $y^2 = x^3 - a\cdot x + b \mod p$ puis extraire la racine pour obtenir $y$, si toutefois elle existe. Il est alors aisé de trouver les points de la courbe. | ||
| + | |||
| + | Par exemple, pour $a=-1$, $b = 1$ et $p = 502181$, on trouve que si $x = 97$, $y^2 = 410\,396$ dont une racine modulaire est $285\,923$. Le point $(97\,; | ||
| + | </ | ||
| ==== Fichier de base ==== | ==== Fichier de base ==== | ||
| Ligne 290: | Ligne 297: | ||
| assert P + Q == Q + P | assert P + Q == Q + P | ||
| | | ||
| + | </ | ||
| + | |||
| + | Si vous voulez tenter le point aléatoire, en utilisant {{ : | ||
| + | |||
| + | <code python> | ||
| + | # module ecc.py | ||
| + | import sqrtmod | ||
| + | from random import randrange | ||
| + | |||
| + | class Point: | ||
| + | ... | ||
| + | |||
| + | @absrtactmethod | ||
| + | def alea_point(): | ||
| + | """ | ||
| + | renvoie un point aléatoire sur la courbe | ||
| + | """ | ||
| + | x = randrange(Point.P) # il faut P impair | ||
| + | y2 = x**3 + Point.A * x + Point.B | ||
| + | while not sqrtmod.is_quadratic(y2, | ||
| + | x = randrange(Point.P) | ||
| + | y2 = x**3 + self.A * x + self.B | ||
| + | y = sqrtmod.sqrt(y2, | ||
| + | return Point(x, y) | ||
| </ | </ | ||
| Ligne 296: | Ligne 327: | ||
| Reprenons le [[nsi: | Reprenons le [[nsi: | ||
| - | ==== Calcul des clés ==== | + | ==== Rappel ElGamal |
| - | + | ||
| - | Dans le chiffre de ElGamal, Bob choisissait $p$, $d$ et $s$ avec $p$ premier, $1 < d < p$ et $s > 1$ puis il calculait $h = d^s \mod p$. | + | |
| - | La clé public était | + | Bob choisit |
| - | **Avec les courbes elliptiques :** Bob choisit sa courbe | + | |
| + | * $K_{PR} | ||
| - | La clé public est $K_{PU} = (a, b, p, D, H)$. | + | Alice chiffre un message $m$ (un entier). |
| + | * Elle choisit un $z > 1$ aléatoire, et calcule | ||
| + | * $r = m\cdot h^z \mod p$ | ||
| + | * $t = d^z \mod p$. | ||
| + | et elle envoie $(r, t)$ | ||
| - | ==== Chiffrement ==== | + | Pour déchiffrer, |
| + | * $t^s$, | ||
| + | * il cherche $u$ l' | ||
| + | * $m = r\cdot u$ | ||
| + | Il a retrouvé $m$ | ||
| - | Avec ElGamal, Alice choisissait $z$ entier quelconque et pour transmettre l' | + | ==== Version ECC ==== |
| - | Elle envoyait enfin $(r, t)$. | + | Bob choisit sa courbe |
| - | **Avec les courbes elliptiques :** le message d' | + | |
| + | * $K_{PR} | ||
| + | Alice chiffre un message $M$ (un point de la courbe) | ||
| + | * Elle choisit $z > 1$ au hasard et calcule | ||
| + | * $R = M + z\cdot H$, | ||
| + | * $T = z\cdot D$. | ||
| Elle envoie $(R, T)$ | Elle envoie $(R, T)$ | ||
| - | ==== Déchiffrement ==== | + | Pour déchiffrer, |
| + | * $M = R - s\cdot T$ | ||
| + | c'est fini, Bob a $M$. | ||
| - | Avec ElGamal, Bob calculait | + | <WRAP tip> |
| + | Le point $D$ est le point de base. Quand les cryptographes choisissent une courbe elliptique, ils choisissent ce $D$ avec soin. En effet, quand on calcule | ||
| + | </ | ||
| - | **Avec les courbes elliptiques :** Bob calcule le point $s\cdot T$, il cherche son opposé $-s\cdot T$ -- //ce qui est très rapide// -- puis il calcule $R - s\cdot T$ ce qui lui donne $M$. | + | ==== Pourquoi ça marche ? ==== |
| - | **Comprendre pourquoi ça marche :** $T = z\cdot D$ donc | + | $T = z\cdot D$ donc |
| $$s\cdot T = s\cdot z \cdot D = z \cdot (s \cdot D) = z \cdot H$$ | $$s\cdot T = s\cdot z \cdot D = z \cdot (s \cdot D) = z \cdot H$$ | ||
| $$R - s \cdot T = M + z \cdot H - z \cdot H = M$$ | $$R - s \cdot T = M + z \cdot H - z \cdot H = M$$ | ||
| Ligne 332: | Ligne 379: | ||
| Écrire de plus les fonctions suivantes : | Écrire de plus les fonctions suivantes : | ||
| - | * '' | + | * '' |
| * '' | * '' | ||
| * '' | * '' | ||
| Ligne 338: | Ligne 385: | ||
| La connaissance du nombre premier $p$ et de la courbe choisie sont important mais ces éléments sont déjà contenus dans notre classe '' | La connaissance du nombre premier $p$ et de la courbe choisie sont important mais ces éléments sont déjà contenus dans notre classe '' | ||
| - | Faire le test en choisissant '' | + | Faire le test en choisissant '' |
| + | |||
| + | ==== Nombre plutôt que point ==== | ||
| + | |||
| + | Quand on écrit la clé ou le message dans un fichier comme un certificat, on peut trouver gênant d' | ||
| + | |||
| + | Il existe une astuce : comme on l'a expliqué, connaissant $x$, on peut calculer $y^2$ et en déduire $y$. Pour une valeur de $x$ donné, avec $p$ impair, il y a toujours deux $y$ possibles : $y_1$ et $y_2$ et on a toujours $y_1 + y_2 = p$ de sorte que $y_1$ et $y_2$ n'ont pas la même parité (l'un est pair et l' | ||
| + | |||
| + | Ainsi si on donne la valeur de $x$ et que l'on précise pair ou impair, on peut déduire de façon unique la valeur de $y$ correspondante. | ||
| + | |||
| + | Ainsi, on peut résumer la paire $(x;y)$ en un seul nombre : | ||
| + | * $k = 2\cdot x$ pour le cas $x$ avec le $y$ pair, | ||
| + | * $k = 2\cdot x + 1$ pour le cas $x$ avec le $y$ impair | ||
| + | |||
| + | Dans l' | ||
| + | * $x = k \div 2$ | ||
| + | * on cherche les solutions $y$ telles que $y^2 = x^3 + a\cdot x + b$ | ||
| + | * si $k$ pair on retient le $y$ pair, si $k$ impair, on retient le $y$ impair. | ||
nsi/tds/cryptographie/ecc.1681217534.txt.gz · Dernière modification : de goupillwiki
