Cryptographie sur courbes elliptiques.
De la théorie à l'expérimentation.

Septembre 2026

Les courbes elliptiques constituent une famille importante de techniques mathématiques utilisées en cryptographie moderne. Cette expérimentation présente les principaux mécanismes de l'ECC à travers Python, en commençant par une courbe de petite taille afin de rendre les calculs accessibles, puis en appliquant ces concepts à la courbe FRP256v1.

Qu'est-ce qu'une courbe elliptique ?

Une courbe elliptique est un objet mathématique constitué d'un ensemble de points qui vérifient une équation particulière. En cryptographie, ces points sont utilisés pour réaliser des calculs difficiles à inverser, ce qui permet de construire des systèmes de chiffrement et de signature sécurisés.

Une courbe elliptique utilisée en cryptographie peut être définie par une équation de la forme :

$ y^2\equiv x^3 +ax+b\pmod p $

où p est un nombre premier, a, b, les paramètres choisis pour définir la courbe et (x, y) les coordonnées d'un point de la courbe.

Les points de la courbe peuvent être additionnés entre eux. On peut ainsi calculer :

$ G,\quad 2G, \quad 3G, \quad\ \dots,\quad kG $

où G est un point particulier appelé point générateur.

Le calcul de kG est relativement rapide lorsque k est connu. En revanche, retrouver k à partir de G et de kG constitue le problème du logarithme discret sur courbe elliptique, dont la difficulté dépend de la taille et des paramètres de la courbe. C'est cette propriété qui est à la base de la cryptographie sur courbes elliptiques (ECC).

Exemple pédagogique

On choisit volontairement une toute petite courbe afin que les calculs restent compréhensibles à la main. Par exemple :

$ y^2\equiv x^3 +2x+2\pmod {17} \quad\quad \left(Eq.\ 1 \right)$

On choisit le point :

$G = (5, 1)$

La première étape est de vérifier que le point G est bien sur la courbe. Pour cela, on remplace $x$ par 5 et $y$ par 1 dans l'équation (1) puis on vérifie que $y^2\equiv x^3 +2x+2\pmod{17}$ :

On calcule :

$y^2 = 1^2 = 1$

et

$ \quad x^3 +2x+2 = 5^3 +2\times5 +2 = 125 + 10 + 2 = \fbox{137} $

Puis on travaille modulo 17 :

$137 = 17 \times 8 + 1\quad et\quad 1 = 17 \times 0 + 1$

on a donc :

$1 \equiv 137\pmod{17}$

$\fbox{Le point G = (5, 1) appartient bien à la courbe.}$

Démonstration

On va montrer ce que signifient 2G, 3G, 4G, 5G, .... Autrement dit, nous allons voir comment additionner le point G avec lui-même. Avant de passer au code Python, commençons par effectuer le calcul de 2G à la main. Cela permet de comprendre les opérations que Python réalisera ensuite.

Pour doubler un point, on calcule la pente de la tangente.

1. Comment calculer la pente $\lambda$ ?

Pour comprendre le calcul de 2G, commençons par regarder la courbe réelle correspondante :

$y^2 = x^3 +2x+2$

On dérive cette équation par rapport à $x$ :

$2y\frac{dy}{dx}=3x^2 + 2$

On obtient donc :

$\frac{dy}{dx} = \frac{3x^2\ +\ 2}{2y}$

Or, $\frac{dy}{dx}$, représente la pente de la tangente à la courbe.

Dans le cas général d'une courbe $y^2 = x^3 +ax+b$, cette pente est notée $\lambda$ :

$\bbox[orange, 10px]{\lambda = \frac{3x^2\ +\ 2}{2y}}$

2. Calcul de $\lambda$ pour le point G

Nous avons choisi le point $\ G = (5, 1)$ :

Ici, $a = 2,\ x = 5,\ y = 1$.

Nous obtenons donc :

$\lambda = \frac{3x^2\ +\ a}{2y} = \frac{3(5^2)\ +\ 2}{2\ \times\ 1} = \frac{75\ +\ 2}{2} = \frac{77}{2}$

Mais notre courbe pédagogique est définie modulo 17, nous devons donc comprendre ce que signifie diviser par 2 modulo 17.

3. Calcul de $\lambda$ en modulo 17

En arithmétique modulaire, pour calculer $ \frac{77}{2}\ (mod\ 17)$, on recherche l'inverse modulaire de 2 modulo 17 :

$\frac{77}{2}\equiv 77 \times\ 2^{-1}\ \left[ 17 \right]$

$2\times9 = 18 \equiv1\ (mod\ 17) \quad et\quad\ 17\times\ 1 + 1=18$

donc :

$2^{-1} \equiv9 \quad (mod\ 17)$

Par conséquent :

$\frac{77}{2} \equiv 77 \times9\ (mod\ 17) = 693\ (mod\ 17) $

Puis :

$693 = 40\times 17 + 13$

donc :


$\lambda = 13$

4. Représentation de la courbe

Nous avons vu que les points d'une courbe elliptique peuvent être additionnés. À partir du point générateur : $G = (5, 1)$

On peut calculer successivement : 2G = G + G, puis 3G = 2G + G, et ainsi de suite.

Passons maintenant à Python

Après avoir effectué le premier calcul à la main, nous pouvons reproduire cette expérience avec Python. Pour cette démonstration, nous conservons volontairement de petits nombres :

$y^2\equiv x^3 +2x+2\pmod{17}$

Le point de départ choisi est : $G = (5, 1)$

Plutôt que d'utiliser immédiatement une bibliothèque spécialisée, nous allons commencer par programmer nous-mêmes les opérations nécessaires. Cela permet de voir concrètement comment fonctionnent les calculs sur une courbe elliptique.

Le premier objectif est de calculer le doublement du point : $2G = G + G$

Pour cela, Python devra calculer la pente $\lambda$, puis les nouvelles coordonnées du point $2G$.


# Courbe : y² = x³ + 2x + 2 (modulo 17)
p = 17
a = 2

# Point G
x, y = 5, 1

# Inverse de 2 modulo 17
inverse_2 = 9

# Calcul de la pente lambda
lam = ((3 * x**2 + a) * inverse_2) % p

# Coordonnées de 2G
x2 = (lam**2 - 2 * x) % p
y2 = (lam * (x - x2) - y) % p

print("λ =", lam)
print("2G =", (x2, y2))

λ = 13
2G = (6, 3)

à suivre

représentation des points de la courbe elliptique modulo 17,
                avec le point générateur G = (5, 1)
Représentation des points de la courbe elliptique modulo 17.
Le point générateur G = (5, 1) est mis en évidence.

from fastecdsa.curve import Curve
from fastecdsa.point import Point

# Paramètres de la courbe
p = 17
a = 2
b = 2

# Point générateur
Gx = 5
Gy = 1

La suite à venir..

Retour au menu quantum