Ma solution à l’énigme de TimeValor

Aujourd’hui, le vendredi 5 octobre 2018, j’ai résolu l’énigme d’Arthur Myard ce qui m’a permis de gagner 100€ en bitcoins. Cette énigme a été postée dimanche dernier sur son blog TimeValor qui parle, entre autres, du temps et de cryptomonnaies. La résolution a donc été rapide et, à vrai dire, je ne pensais pas trouver une réponse aussi vite.

L’énigme était la suivante. L’adresse 1LucASvKRFyJej7Me4jZvwccgpvXVRSpNy contenait 0.01827986 BTC (soit environ 100€ à ce jour) et le but du jeu était de trouver une « clé » à partir de l’image ci-dessous pour obtenir la récompense.

Cette image se compose de deux choses : un QR code et un tableau. Le QR code ne représente rien de spécial : il s’agit simplement de l’adresse où se trouve la récompense. Le tableau, en revanche, est bien plus intéressant.

Le tableau est un tableau de 51 lignes et de 34 colonnes. La première ligne correspond à l’adresse, et les 50 autres sont composées da l’alphabet et de 8 chiffres allant de 2 à 9. Exception faite des 2 premières lignes, chacune des lignes contient un caractère coloré en vert, en gris ou en orange. Il y a en tout 30 caractères verts, 16 caractères gris et 2 caractères orange.

L’énoncé de l’énigme parlait d’une clé : c’est donc qu’il fallait trouver une clé privée dans cette image. Pour rappel, une clé privée est le mot de passe qui permet de dépenser des fonds à partir d’une adresse donnée. Chaque adresse est calculée à partir d’une clé privée par l’intermédiaire de fonctions à sens unique qui permettent de ne pas faire le calcul inverse : on ne peut pas calculer une clé privée à partir d’une adresse. Trouver la clé privée correspondant à l’adresse 1LucASvKRFyJej7Me4jZvwccgpvXVRSpNy me permettait donc d’obtenir la récompense.

Dans Bitcoin, les clés privées sont des nombres usuellement écrits en base 58, tout comme les adresses. La base 58 utilise l’ensemble des caractères alphanumériques (chiffres, lettres minuscules, lettres majuscules) sauf les caractères 0 (zéro), O (o majuscule), l (L minuscule) et I (i majuscule), qui peuvent être confondus entre eux et constituer une source d’erreurs. Notez qu’une somme de contrôle (checksum) est aussi ajoutée à la fin de chaque clé privée pour éviter les fautes de frappes. Un exemple de clé privée écrite dans ce format est 5HpHagT65TZzG1PH3CSu63k8DbpvD8s5ip4nEB3kEsreAnchuDf.

Sans rentrer dans les détails, il existe deux types de clés privées : les clés privées non compressées commençant toujours par un 5 et les clés privées compressées qui commencent par un K ou un L. Les premières font toujours 51 caractères, et les secondes en font 52.

Puisque j’avais devant moi un tableau de 50 lignes (si on exclut celle de l’adresse), j’en ai déduit que la clé privée à trouver devait être une clé privée non compressée (donc commençant par un 5) et que les autres caractères devaient chacun correspondre à une ligne. Il s’agissait donc de trouver les bons caractères pour que la clé privée obtenue corresponde à l’adresse.

Le problème était qu’il n’y avait pas de majuscule dans l’alphabet proposé, juste les lettres minuscules et des chiffres. J’ai ainsi rapidement soupçonné que le code couleur (vert, gris, orange) correspondait au fait que la lettre était une minuscule ou une majusucule. Mais comment justifier le fait qu’il y ait 3 couleurs ? Peut-être que l’une d’entre elles correspondait aux chiffres. Mais alors pourquoi tous les chiffres étaient en vert ?

En fait, jusqu’à que je trouve la solution, j’imaginais que la clé était transformée (chiffrée) d’une certaine manière et que la manière dont elle était transformée dépendait de l’adresse. Mais avant de penser à appliquer des connaissances obscures de cryptographie, j’ai d’abord dû tester mes premières hypothèses sur le cas le plus simple : la clé était écrite en clair devant mes yeux.

Je devais donc associer une couleur aux minuscules et une couleur aux majuscules. Le vert et le gris étant les couleurs les plus fréquentes, j’ai regardé ce qu’il était possible de faire. J’ai remarqué qu’il y avait un o vert et un i vert et, puisque la base 58 exclut le i majuscule et le o majuscule, j’en ai déduit que le vert était la couleur des minuscules et le gris celle des majuscules. Le l n’apparaissait nulle part, ce qui n’invalidait pas cette hypothèse. Pour le rouge, je ne savais pas trop à quoi il correspondait donc j’ai rapidement laissé tombé cette partie de la clé. Je me suis retrouvé avec la clé partielle :

5??Y9kUpSRmfE82i7MfsSa5zvSXJcmmNWQbyqoeqWzcSxSjk??r

Cela était intéressant car ça me permettait de tester mes hypothèses : à l’aide de mon ordinateur portable je pouvais tester toutes les possiblités pour les caractères manquants. J’ai donc écrit un programme et je l’ai lancé. Le programme vérifiait si le format de la clé privée était valide et, le cas échéant, affichait la clé privée et l’adresse. Au bout de quelques dizaines de secondes, l’écran affichait :

Matching private key 5JCY9kUpSRmfE82i7MfsSa5zvSXJcmmNWQbyqoeqWzcSxSjk55r
Address 1LucASvKRFyJej7Me4jZvwccgpvXVRSpNy

Mission accomplie.

J’ai donc trouvé la clé privée sans deviner que les caractères orange devaient être des chiffres : ici le e (cinquième lettre de l’alphabet) était transformé en 5.

La dernière étape a été de créer un portefeuille Electrum, de rentrer la clé privée et d’envoyer les 0.01827986 BTC vers une adresse personnalisée à moi : 1MerCitwYX7bwCT4JeGsM8vtR6ATHnruyB. La transaction est visible ici.


Crypto-enthousiaste et amateur de gros blocs.

3 Responses

  • Bravo encore une fois Ludovic :p Un vrai travail de détective!
    La prochaine énigme est pour bientôt et sera plus difficile j’espère :p

    Répondre
  • Super Intérssant! Bravo)

    Répondre

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée.