Solution de resowifix pour Délog

intro crypto courbe elliptique

29 juin 2026

Table des matières

Analyse du code

Le code qui nous est donné utilise un chiffrement via une courbe elliptique, a priori incassable avec des moyens standards. La faille doit donc se trouver dans l’utilisation du chiffrement. On remarque notamment que les caractères sont chiffrés un à un, et que le flag n’est pas chiffré d’un seul coup.

Exploitation

Comme chaque caractère est chiffré de manière indépendante, et que, a priori, les caractères utilisés sont connus (ASCII), on peut simplement chiffrer de notre côté tous les caractères ASCII, on aura alors une correspondance directe entre un caractère et son chiffrement. Par simple comparaison, on peut alors trouver un à un les caractères du flag.

Cela peut se faire avec le code suivant :

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

p  = 0xF1FD178C0B3AD58F10126DE8CE42435B3961ADBCABC8CA6DE8FCF353D86E9C03
a  = 0xF1FD178C0B3AD58F10126DE8CE42435B3961ADBCABC8CA6DE8FCF353D86E9C00
b  = 0xee353fca5428a9300d4aba754a44c00fdfec0c9ae4b1a1803075ed967b7bb73f
n  = 0xf1fd178c0b3ad58f10126de8ce42435b53dc67e140d2bf941ffdd459c6d655e1
Gx = 0xB6B3D4C356C139EB31183D4749D423958C27D2DCAF98B70164C97A2DD98F5CFF
Gy = 0x6142e0f7c8b204911f9271f0f3ecef8c2701c307e8e4c9e183115a1554062cfb
FRP256v1 = Curve("FRP256v1", p, a, b, n, Gx, Gy)
G = FRP256v1.G

car = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890{}_!"

li_code = []

for c in car:
    li_code.append(ord(c) * G)

x = [
    0xda3355ba0fa27146a228717649a6dcef2615a8de4f65dd49b2672766fe821e74,
    0x30d614541e97d4b4066fa8c6fc8f44ddc1a1fddded722a65d9037a80833d02aa,
    0x3ea72aee9626d5c9200a692d92d5f78165180f2946290aafd5e1b050a89ab583,
    0x30d614541e97d4b4066fa8c6fc8f44ddc1a1fddded722a65d9037a80833d02aa,
    0x7f8a27e35dc664e25c210fa4f34987e65aa4a17ba2a054be509edc292bc79a5e,
    0x368f4d4e3899059d8cd0af1964efcf7b024ce75a62deaa3ff608713de3b7f832,
    0xe199ce4278c00f04f3dec53f72e13cf4e1bc6b10200b84e7a183f1a4f713705f,
    0xd65012ba119a06b213663d0e03ffa0fc78617ff31fecbe66d1125f838edc374b,
    0xa1782e95510927b213e042a728c2cb25cb8f706b00fdd9d9b3ea1e2d49be70f1,
    0xe16e742513e824fa49c09560544037c1b255012c993cfae59b8ccb14a9907585,
    0x3ea72aee9626d5c9200a692d92d5f78165180f2946290aafd5e1b050a89ab583,
    0xd65012ba119a06b213663d0e03ffa0fc78617ff31fecbe66d1125f838edc374b,
    0xe199ce4278c00f04f3dec53f72e13cf4e1bc6b10200b84e7a183f1a4f713705f,
    0x6b57d3dce59f1b03c7158f93564119900f952b611d0c1ed676f05adb41289ccc,
    0x1a4eb41ec5147dc9fce761bf87637123c27814ecd9975080b9de2b92b9e54e82,
    0x114913a67b61c4ee5177deaeecf1138a7ddfbe9dc36a1028d85dc95ee9b94a68,
    0x9a6a44095380b935ad41761197f91e99ecb9a9777557de2d51e34dda32e47844,
    0xbba2fac88d029643d8557b9850255c516d1851bad36184718ae3e416a5362b3,
    0x32c52d265ab09d061ec9f035ef61a1af5a83ea92104ae9d2ddf9f99904155d53
]

y = [
    0x5456886882f67039bfd4d541e49814f4bd2fa039e28598dadb504b9295a2063f,
    0x4ba88007ac3d46944abbda9ab8dbb784ff848f100e1c5da9ee73c6a0b7ca41be,
    0xd8d5d788c2508f8fc399872a6a73b4d5f10a1bb8af8b3de97fb287c28c7f6575,
    0x4ba88007ac3d46944abbda9ab8dbb784ff848f100e1c5da9ee73c6a0b7ca41be,
    0xabb3af8edf1f7f2926a9d584b2b0736c69155ad323e929810ee3028b7dfe53a4,
    0x305a4a11d24e0dec6a9f8a3ae199054805654c92eef685025e4fd1dc0d62b256,
    0x29e1ca2ff8749e18bd715370bd657c4d29dbbdfb43986061cb221525c16def8e,
    0x1ffaa3957681f395c8d646d056036fe3f8709dfc5dbc60ea153b5633df231451,
    0xb48cce14739efbe46710ccade4ff76e6ab07171fc18c4e02d98f229c598c39d8,
    0xdf230ce411b7777a6128dc494c39a16444a84f17aa6d3092016dca6465ba2ca,
    0xd8d5d788c2508f8fc399872a6a73b4d5f10a1bb8af8b3de97fb287c28c7f6575,
    0x1ffaa3957681f395c8d646d056036fe3f8709dfc5dbc60ea153b5633df231451,
    0x29e1ca2ff8749e18bd715370bd657c4d29dbbdfb43986061cb221525c16def8e,
    0xb236ddf8440286f7c83592501624a1fb4a397d03225aa30ba2d05ba28807e465,
    0xdadb7940d9342d0738b719445960ab50999f303e82dd43c77d5de6b64278464,
    0x6f37abaac11439fd6394370eb746c26bee24024d06e142a3fb81bc28af63ce9a,
    0x9cd0e8099a4341f9521bb0fd610edefc4bbe185ac864e2d8d6b1b8b58eea7b3,
    0xdddac00e5bf9d3ec2d5d472756cc3ee38b229118eafb9aacc2466d7673fe4ed4,
    0xb247a17ba9e07c128af69c824553cb0ea3bf4bbe994955bce2923cc7ee098d17,
]

for i in range(len(y)):
    for j in range(len(li_code)):
        if x[i] == li_code[j].x and y[i] == li_code[j].y:
            print(car[j], end="")
            break
print()