Solution de n3ige86 pour Elliptic Addrenaline

crypto courbe elliptique

1 avril 2024

Le défi se compose d’un script sage elliptic-addrenaline.sage et d’un fichier output.txt.

À la lecture du script sage, on comprend ce qu’il est attendu pour ce défi. À l’instar de l’épreuve Elliptic Addventure, on nous demande de calculer la moitié d’un point d’une courbe elliptique. En effet, étant donnés deux points P=A+BP=A+B et M=ABM=A-B, on a A=12(P+M)A = \frac{1}{2} (P+M) et B=PAB = P-A. Les coordonnées des points PP et MM sont donnés dans le fichier output.txt. Toutefois, contrairement à l’épreuve précédente, la courbe elliptique utilisée ici est d’ordre pair, à savoir hnh\cdot n avec h=8h=8 et n=0x1000000000000000000000000000000014def9dea2f79cd65812631a5cf5d3edn=\mathtt{0x1000000000000000000000000000000014def9dea2f79cd65812631a5cf5d3ed} (voir par exemple https://neuromancer.sk/std/other/Curve25519 qui affiche la courbe sous la forme de Montgomery, aW=1AM2/3a_W = 1-A_M^2/3).

Un point d’une telle courbe a alors pour ordre un diviseur de hnh\cdot n, soit : 1 (uniquement pour le point à l’infini), 2, 4, 8, nn, 2n2n, 4n4n ou 8n8n.

Lorsqu’on vérifie l’ordre du point P+MP+M, on se rend compte qu’il n’est pas d’ordre nn et donc son ordre xx est multiple de 2 (le point P+MP+M n’étant pas le point à l’infini). Ainsi, on ne pourra pas calculer l’inverse de 22 modulo xx.

On peut tester alors le résultat de 2n(P+M)2n\cdot (P+M). Soit on obtient le point à l’infini si x=2nx=2n, soit on obtient G2G_2 (le point non trivial d’ordre 2) si x=4nx=4n soit on obtient un point d’ordre 4 si x=8nx=8n (il est très improbable d’avoir x<nx < n, mais on pourrait tester le cas également, de plus comme 2A=P+M2A=P+M, on a x<8nx < 8n.). Comme on obtient G2G_2 (facilement reconnaissable avec y(G2)=0y(G_2)=0), on en déduit x=4nx=4n.

Désignons par GiG_i un point générateur d’ordre ii, un point QQ d’ordre 4n4n peut s’écrire sous la forme Q=uGn+vG4Q=u\cdot G_n+ v\cdot G_4, avec 0<u<n0 < u < n et 0<v<40 < v < 4. Ainsi, 12Q=u2Gn+vG8\frac{1}{2}\cdot Q=\frac{u}{2}\cdot G_n + v\cdot G_8.

Afin d’obtenir G8G_8, il suffit d’avoir un point RR d’ordre 8n8n et de calculer G8=nRG_8 = n\cdot R. Par chance un point d’abscisse 0 convient pour RR. Afin de résoudre y(R)2=by(R)^2 = b, on peut calculer y(R)=bp+38mod  py(R) = b^{\frac{p+3}{8}}\mod p (car p=5mod  8p=5\mod 8 et bp14=1mod  pb^{\frac{p-1}{4}}=1\mod p). On prendra de plus G4=2G8G_4=2G_8.

Avec ces définitions, on peut vérifier que P+M=uGn+G4P+M = u\cdot G_n+G_4 et on a donc une première solution AA’:

A=(21mod  n)(P+M+3G4)+G8 A’ = (2^{-1}\mod n)(P+M+3G_4)+G_8

Manque de chance ce n’est pas le point qu’on recherche puisqu’il ne contient pas le flag recherché. La solution est:

A=(21mod  n)(P+M+3G4)+G8+G2 A = (2^{-1}\mod n)(P+M+3G_4)+G_8+G_2