Récit de la découverte des bitcoins dans la fresque « La Liberté guidant le peuple 2019 »

14
1331

Antoine Ferron, expert crypto, et CEO de BitLogiK [1] a accepté de nous livrer le récit complet de la découverte des bitcoins dans la fresque « La Liberté guidant le peuple 2019 » de  Pascal Boyart :

« Tout d’abord, Marina et moi tenons à remercier Pascal Boyart pour la réalisation de ce défi, Alistair Milne pour le support financier, ainsi que toutes les personnes qui ont contribué à ce projet. Au-delà de l’œuvre artistique, c’est un formidable projet collectif qui a contribué à populariser le bitcoin.

Je n’étais pas tout seul dans cette recherche. Marina, la femme qui partage ma vie m’a encouragé, motivé, supporté,… durant cette semaine, et cela a été une aide précieuse pour la découverte de ce puzzle.

On est allé dès le lundi 7 au soir voir cette fresque, qui est déjà une réussite au niveau artistique. En tant qu’expert et passionné de bitcoin, je ne pouvais manquer cette œuvre car nous avons la chance d’habiter à quelques kilomètres.

Marina a pensé à des schémas dans les traits colorés du fond, mais j’étais sceptique quant au codage. Une des premières choses, la plus visible des choses cachées en noir sur noir, c’était le texte : SEED 12 WORDS. Il s’agissait donc de trouver 12 mots et probablement de les entrer dans un wallet BIP39-44 [2] pour avoir les clés et récupérer les bitcoins. On part donc d’une entropie de 128 bits à trouver. Il faut trouver douze mots et cela équivaut à 128 bits exactement (si le checksum est utilisé).

J’ai vu ensuite avec le reflet d’un lampadaire un texte écrit à droite de la tête de Marianne. On a ensuite trouvé tous les textes autour de la tête de Marianne. Avec la torche des smartphones, on voyait ressortir les textes. On pensait que c’était peut-être une encre fluorescente.

Avec divers traitements d’image on a pu lire les textes. On a compris que le 2ème était en base64 et le troisième en alphabet français (26 lettres).

Rapidement, j’ai décodé les mots à gauche, qui sont juste encodés en base64 : conduire, triomphe. Les essais de base32 sur les mots du haut ne donnaient rien.

A partir de là, on a eu la certitude que les mots provenaient tous de la liste BIP39 française [3], et non pas de l’anglaise comme habituellement. De plus les mots semblaient avoir un lien direct avec les éléments peints dans la fresque. On a cherché des candidats comme histoire, jaune, guide, social,… mais ça faisait bien trop de possibilités tout cela. Ça indique tout de même que les mots sont dans cette liste de 2048 mots, les mots font entre 5 et 8 lettres de long. Il faut bien noter que même en connaissant les 12 mots mais sans leur ordre, cela fait encore 500 millions de combinaisons possibles. Alors si en plus il manque des mots, cela fait des milliers de milliards.

En contactant l’adresse email de l’artiste inscrite en bas à droite, il a fourni un nombre, une clé et voyant que les data étaient vraiment aléatoire, cela ressemblait à un cypher moderne. La clé donnée, 03012009, est la date de lancement de Bitcoin et du Genesis bloc. On a réfléchi à quoi pouvait correspondre des données du bloc dans ce puzzle. J’ai aussi tenté divers services web de chiffrement AES. J’ai eu la chance de tomber sur aesencryption.net qui a donné deux nouveaux mots : horizon, jaune. J’ai contacté le développeur de ce site pour comprendre comment le reproduire localement de mon côté. Ce service est fait en PHP, et les sources données ne correspondent pas exactement à ce qui est mis dans le serveur. Après sa réponse avec les détails, j’ai pu reproduire le déchiffrement AES avec openssl. Le vecteur d’initialisation en ASCII « 12345678b0z2345n » n’a rien de standard, et il fallait avoir la chance de trouver ce site web pour pouvoir décoder cette partie. Le script linux qui décode ce message est en ligne ici.

Le haut ressemblait à des substitutions de lettres. C’était donc probablement un code César [4] ou Vigenère [5], les deux codes « historiques » et grands classiques. César étant d’ailleurs un Vigenère avec une seule lettre en clé. La recherche pour César n’a rien donné car on ne testait que les trois premières lettres, « ATQ », et il se trouve que c’était en fait « ATO ».

Comme je suis en train de développer un programme pour gérer des cold wallets, qui calcule des clés à partir de mnémonique, j’ai à ce stade développé pour ce puzzle une ligne de commande qui calcule des dizaines d’adresses possibles pour un mnémonique donné. Car même si BIP39+44 sont clairs sur ce qu’il faut faire pour calculer une adresse, selon le portefeuille utilisé il peut y avoir des différences. Ce programme calcule huit adresses possibles pour bitaddress (sha2), bitcoin core (m/0’/0’/0 et hardened), blockchain info (m/44’/0’/0’/0), Multibit (m/0’/0/0), BIP39+44 compliant (m/44’/0’/0’/0/0),… On ne savait pas quel type de wallet avait été utilisé par l’artiste, mais il ne fallait pas passer à côté d’une solution.

Je suis retourné à la fresque le 9 janvier au soir avec une torche led bleue, pensant que d’autres inscriptions était cachées de la même manière. Je n’ai rien trouvé de tel. Mais des sortes de blocs, code-barres, traits alignés ont attiré mon attention dans le fond de l’œuvre. J’ai pris pleins de photos pour analyser au chaud et sur PC.

On a rapidement identifié six zones, ce qui indiquait que les six mots restants étaient encodés avec ces barres de couleur alignées. En comptant 12, 16 barres, on a compris rapidement que le codage était composé de deux barres pour chaque lettre.

En parallèle, après avoir tenté pleins de choses, on a pu déchiffrer les deux mots avec le code César au dessus de la tête de Marianne, avec les clés « g » et « h » on obtient : union et citoyen.

Pour le code couleur, il y avait quatre zones claires et nettes et deux zones moins nettes, avec probablement une palette de couleur modifiée, « pastélisée ». On a procédé comme avec des mots croisés, une possibilité de mot pour un bloc, correspond à quelques lettres pour les autres mots. A coups de regex dans la liste des 2048 mots français, je suis tombé sur quatre mots qui était 100% compatibles entre eux, une lettre égale un code couleur unique : banquier, usure, mensonge et espoir.

Il ne restait donc plus que deux mots. Et on était quasi sûr qu’il ne faisait que six lettres chacun. Ça fait 499 mots restants, donc 250 000 combinaisons. Cela si on connait l’ordre des mots, sinon il y a encore bien plus de combinaisons possibles.

J’ai alors fait des scripts de scan brute force, au départ qui calculaient 6 mnémoniques par seconde avec chacun 8 adresses dérivées. J’ai modifié le programme et sa librairie pour se reposer sur coincurve pour le calcul des clés publiques (multiplication du point générateur par courbe elliptique), qui est un wrapper pour la librairie C libsecp256k1. Ainsi les programmes de scan ont pu chercher douze fois plus rapidement, pour atteindre 75 mnémoniques par secondes pour un cœur CPU. Cela fait plus de 500 adresses calculées par seconde. Je mettais en parallèle sur 2 ou 3 cœurs et on avait des routines de scan qui cherchaient plus de 1000 adresses par seconde. On pouvait donc facilement tester 200 000 combinaisons de mnémonique, correspondant à 1,5 million d’adresses chaque heure.

J’ai mis de côté la vérification du checksum. Il ne fait que 4 bits pour 12 mots, 1 sur 16 combinaisons est valable. Et comme l’auteur a choisi les mots, rien n’indiquait qu’il a utilisé le checksum de BIP39 dans le calcul du seed.

La principale difficulté pour ces programmes était d’aller très vite pour les concevoir, que ces calculs prennent le moins de temps possibles pour pouvoir ratisser large dans les scans, et en étant relativement sûr de leur exactitude dans leur calculs, car il ne fallait pas faire d’erreur pour ne pas rater la solution. Une sorte de concentré d’attentes pour un programme informatique : conçu rapidement, rapide et efficace, sans bug ni erreur.

Au fur et à mesure, on a fait une liste raccourcie de 50 mots de six lettres ou plus, soit en rapport avec le sujet de la fresque, soit qui collaient avec des positions de lettre dont était plus sûrs que d’autres, et aussi une liste de combinaisons possibles de l’ordre des mots. L’ordre n’était pas totalement aléatoire, avec les groupes trouvés, deux par deux, par bloc par zone, on a sélectionné dix ordres possibles. Cela fait au total 500 000 combinaisons possibles. Une question d’heures si nos hypothèses étaient les bonnes.

C’est le script « Seekplace » qui a trouvé le mnémonique exact au bout d’une heure de calcul environ, le dimanche 13 vers 13h30. Ensuite j’ai rapidement créé un hot wallet dans Electrum pour « sweep » les fonds.

Le résultat est le mnémonique de douze mots, valide en checksum : « banquier usure mensonge peuple combat espoir union citoyen conduire triomphe horizon jaune », avec un chemin de dérivation BIP32 totalement standard avec BIP44 = m/44’/0’/0’/0/0.

Nous nous sommes beaucoup amusés durant cette recherche, et nous avons pu découvrir de nouveaux domaines. Ces défis demandent toujours un mélange de théorie, d’imagination et de pratique pour retrouver les solutions. Marina a même découvert une nouvelle passion, la ligne de commande LOL. »

 

> Le repository public des programmes conçus et utilisés pour cette course au trésor : github.com/antonio-fr/pboywalltools

> D’autres détails sur la page de réponse de l’artiste lui-même : pboy-art.com

 


[1] Société spécialisée dans la sécurité numérique, paiements, accès, blockchain.

[2] Les HD wallet (hierarchical deterministic wallet / porte-clé déterministe hiérarchique) permettent de générer de nombreuses clés privées à partir d’un seul point de départ. Cette « seed » (graine), une valeur aléatoire de 128 bits, peut se présenter sous la forme de 12 mots.

[3] La liste complète est disponible ici : github.com/bitcoin/bips/blob/master/bip-0039/french.txt

[4] Le code de César est une méthode de chiffrement par décalage utilisée par Jules César dans ses correspondances secrètes. Le texte chiffré s’obtient en remplaçant chaque lettre du texte clair original par une lettre à distance fixe, toujours du même côté, dans l’ordre de l’alphabet.

[5] Le chiffre de Vigenère : chiffrement par clé qui présente généralement sous la forme d’un mot ou d’une phrase et qui résiste à l’analyse de fréquences.