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
et , on a et . Les
coordonnées des points et 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 avec et
(voir par exemple https://neuromancer.sk/std/other/Curve25519 qui affiche
la courbe sous la forme de Montgomery, ).
Un point d’une telle courbe a alors pour ordre un diviseur de , soit : 1 (uniquement pour le point à l’infini), 2, 4, 8, , , ou .
Lorsqu’on vérifie l’ordre du point , on se rend compte qu’il n’est pas d’ordre et donc son ordre est multiple de 2 (le point n’étant pas le point à l’infini). Ainsi, on ne pourra pas calculer l’inverse de modulo .
On peut tester alors le résultat de . Soit on obtient le point à l’infini si , soit on obtient (le point non trivial d’ordre 2) si soit on obtient un point d’ordre 4 si (il est très improbable d’avoir , mais on pourrait tester le cas également, de plus comme , on a .). Comme on obtient (facilement reconnaissable avec ), on en déduit .
Désignons par un point générateur d’ordre , un point d’ordre peut s’écrire sous la forme , avec et . Ainsi, .
Afin d’obtenir , il suffit d’avoir un point d’ordre et de calculer . Par chance un point d’abscisse 0 convient pour . Afin de résoudre , on peut calculer (car et ). On prendra de plus .
Avec ces définitions, on peut vérifier que et on a donc une première solution :
Manque de chance ce n’est pas le point qu’on recherche puisqu’il ne contient pas le flag recherché. La solution est: