Lost Curve (Cryptographie - 200 points)
Énoncé
J’ai perdu l’équation de ma courbe elliptique : pouvez-vous m’aider à la retrouver ?
nc challenges1.france-cybersecurity-challenge.fr 6002
Résolution
A l’ouverture du fichier joint au challenge (lost_curve.py), on observe le déroulement du challenge :
- Le programme tire des nombres entiers aléatoires
p,a,b,xPpuis nous fournit 2 pointsPetQsur la courbe d’équationy**2 = x**3 + a*x + b % p. - Nous devons déteminer
a,b,pet les retourner au serveur.
Le point Q n’est pas tiré au hasard, en effet il est généré par la relation 2*P = Q.
N’étant pas particulièrement spécialiste des courbes elliptiques, j’ai récupéré sur Wikipédia les formules d’opérations sur les points :
- Pour calculer
R = 2*P, on poses = (3*xP**2 + a)/(2*yP), et ainsi :xR = s**2 - 2*xP % pyR = -yP + s*(xP - xR) % p
- Pour calculer
R = P + Q, on poses = (yP + yQ) / (xP - xQ)et ainsi :xR = s**2 - xP - xQ % pyR = -yP + s*(xP - xR) % p
- Pour calculer
R = -P:xR = xPyR = -yP
Fort de ce savoir, je commence à construire les équations qui découlent de la relation Q = 2*P afin de déterminer des relations qui pourraient m’aider à trouver un ou plusieurs paramètres :
yQ + yP = s*(xP - xQ) % p- Cette formule nous fournit
ssi on connaitp. En effet,s = (yQ + yP) * modinv(xP - xQ, p) % p
- Cette formule nous fournit
xQ + 2xP = s**2 % pa*xP + b = yP**2 - xP**3 % p- Grâce à cette équation, si je connais
peta, je connaisbsimplement :b = yP**2 - xP**3 - a*xP % p(en effet,0 < b < p)
- Grâce à cette équation, si je connais
En remarquant 2*P = Q <=> Q - P = P <=> -P + Q = P, j’ai pu ajouter l’équation suivante qui a étonnamment débloqué ma situation (je ne pensais pas gagner de l’information en effectuant cette transformation) :
(yQ + yP)**2 / (xQ - xP)**2 - xP - xQ = xP % p
Qui est équivalente à :(2*xP + xQ) * (xQ - xP)**2 + (yQ + yP)**2 = 0 % p
C’est à dire qu’il existe k un entier tel que (2*xP + xQ) * (xQ - xP)**2 + (yQ + yP)**2 = k*p
Ainsi, en calculant A = (2*xP + xQ) * (xQ - xP)**2 + (yQ + yP)**2 (toutes les variables présentes sont données dans le challenge), puis en factorisant A en facteurs premiers, p apparaît (il est reconnaissable par sa taille >= 80 bits).
Par la relation précédemment évoquée s = (yQ + yP) * modinv(xP - xQ, p) % p, j’obtiens ainsi s. Il en découle a = s*2*yP - 3*xP**2 % p par définition de s
Enfin, b = yP**2 - xP**3 - a*xP % p.
Je dispose maintenant de tous les paramètres, je peux les envoyer au challenge et récupérer le flag.