Elliptic Curve Cryptography (ECC)

Pourquoi les courbes elliptiques

Une courbe elliptique, c’est quoi

L’équation d’une courbe elliptique est comme suit:

y² = x³ + ax + b

La représentation graphique d’une telle courbe est présentée ci-dessous.
Elle sera plus ou moins alongée selon les paramètres (a, b) utilisés.

Les types de données utilisés doivent avoir certaines caractéristiques:

On peut par exemple utiliser les courbes elliptiques avec des entiers et non des matrices.

En cryptographie, on limite x, y, a et b a un champ fini: on ne va donc pas utiliser l’ensemble des entiers (-∞ ; +∞) mais un sous-ensemble (0 ; p):

y² = x³ + ax + b  mod p

Caractéristiques

Une courbe elliptique a des caractéristiques intéressantes:

En utilisant les points de notre courbe, on peut définir certaines opérations: l’addition de point (point addition en anglais) et la multiplication de point (point multiplication).

Addition de point (⊕)

Exemple

Soit la courbe elliptique E: y² = x³ + 5x + 7 et les points P: (2,5) et Q: (3,7)

Formule

Plutôt que de calculer la ligne / les points d’intersection / la réflection du point, on peut utiliser une formule:

Soit la courbe elliptique E: y² = x³ + 5x + 7 et les points P: (2,5) et Q: (3,7):


λ = (7-5) / (3-2) = 2

x<sub>3</sub> = 2² - 2 - 3 = -1
y<sub>3</sub> = 2 * (2 - (-1)) - 5 = 1

P + Q = (-1, 1)

Multiplication de point

Intérêt pour la cryptographie


Elliptic Curve Diffie Hellman (ECDH)

Diffie Hellman permet de négocier une clé partagée.
Diffie Hellman utilise en général des clés RSA en se basant sur le fait que pour les clés RSA Message = Clé_privée(Clé_publique(Message)). ECDH se base sur une courbe elliptique comme suit:

  1. Alice et Bob se mettent d’accord sur une courbe elliptique E mod p, où p est un nombre premier.

  2. Ils se mettent d’accord, publiquement, sur un point G sur la courbe.

  3. Alice génère un nombre aléatoire a, calcule aG, et envoie le résultat à Bob.
    Un tiers connaissant G n’est pas capable de déduire a puisqu’il s’agit d’une multiplication de point sur une courbe elliptique.

  4. Bob génère un nombre aléatoire b, calcule bG, et envoie le résultat à Bob.
    Un tiers ne peut pas déduire b, pas plus qu’il ne peut déduire a.

  5. Alice calcule a * bG et Bob calcule b * aG.
    Ils ont désormais un secret partagé, qui sera utilisé pour crypter/décrypter les futures communications.

Elliptic Curve Digital Signature Algorithm (ECDSA)

On suppose ici que les paramètres de ECDSA sont connus par tous: la courbe utilisée (E mod p), le point générateur (G) et l’ordre de ce dernier (n). Bitcoin utilise la courbe secp256k1 (Standards for Efficient Cryptography, p sur 256bits) — qui a environ 2256 (1077) clés possibles:

Paramètre Valeur
Équation (E) y2 = x3 + 7
Max (p) 2256 - 232 - 977
Générateur (G) (79BE667EF9DCBBAC55A06295CE870B07029BFCDB2DCE28D959F2815B16F81798, 483ADA7726A3C4655DA4FBFC0E1108A8FD17B448A68554199C47D08FFB10D4B8)
Ordre (n) FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141

Signer

Bob dispose de la paire de clé priv (m) et Pub (mG) et veut signer un message pour prouver que lui seul peut avoir émis ce message — qu’il possède bien la clé privée.

  1. Il calcule le digest du message. Par exemple en utilisant l’algorithme SHA-1:

    digest = sha1(message)
    
  2. Il choisit aléatoirement un nombre k, inférieur à l’ordre de G, et multiplie G avec ce nombre.

    R = (x, y) = k G
    

    Notons qu’il s’agit du même processus que la génération de clé privée/publique. Raison pour laquelle les valeurs (k, R) sont appelées dans certains documents des clés éphèmères ou temporaires.

  3. Il récupère la coordonnée x du point trouvé, modulo n — pour s’assurer que la valeur est toujours inférieure à l’ordre de G.

    r = x mod n
    

    Si r vaut 0, un nouveau nombre aléatoire (k) doit être choisit.

  4. Il calcule s comme suit:

    s = ((digest + r ⋅ priv) / k) mod n
    

    Si s vaut 0, un nouveau nombre aléatoire (k) doit être choisit.

  5. Sinon, alors il signe avec la paire (r, s).
    (r, -s mod n) est également une signature valide.

    signature = (r, s)
    

Vérifier la signature

Alice a reçu le message de Bob, sa signature (r, s), et elle connaît sa clé publique Pub. Elle veut vérifier que l’émetteur du message possède bien la clé privée priv.

  1. Elle vérifie que les valeurs r et s sont plausibles, elles sont inférieures à l’ordre de G.

    0 < r < n
    0 < s < n
    
  2. Elle génère le digest du message

    digest = sha1(message)
    
  3. Elle calcule R:

    w  = 1/s mod n
    u1 = (digest ⋅ w) mod n
    u2 = (r ⋅ w) mod n
    
    R  = (x, y) = u1 G + u2 Pub
    
  4. Elle vérifie que le r de la signature vaut bien la coordonnée x qu’elle a trouvé:

    r == x mod n
    

Démonstration:

R = (u1 G) + (u2 Pub)
  = (digest s-1 G) + (r s-1 Pub)
  = (digest s-1 G) + (r s-1 priv G)
  = (digest + r priv) s-1 G
  = (digest + r priv) ((digest + r priv)/k)-1 G
  = (digest + r priv) (digest + r priv)-1 (1/k)-1 G
  = k G

Seule une personne possédant la clé privée associée à la clé publique aurait pu générer le couple (r, s).

Récupérer la clé publique à partir de la signature

Il est possible de récupérer la clé publique à partir de la signature:

  1. Calculer un point R = (x, y)x vaut r (ou r + n, r + 2n, etc) et y une valeur telle que (x, y) est sur la courbe.

    R = (r, y)
    
  2. Générer le digest du message

    digest = sha1(message)
    
  3. Calculer la clé publique:

    u1 = (-digest / r) mod n
    u2 = (s / r) mod n
    
    Pub = u1 G + u2 R
    

Générateur de nombres aléatoires


Sources

Pour aller plus loin:
Weak Curves in ECC
Review of Cryptanalysis of ECC
Dual_EC_DRBG