Note : cet article est pour le moment plus une trame qu'autre chose, il sera mis à jour.

Une clef privée Bitcoin, c'est quoi ? C'est simplement un nombre de 256 bits. Il y a 2^256-1 c'est-à-dire environ 10^77 clefs privées. Tout nombre de 256 bits, c'est-à-dire tout nombre entre 0 et 2^256 (sauf 0), constitue une clef privée.

Le secret d'une clef privée est uniquement sa valeur. Donc, choisir une clef privée simple, c'est prendre le risque que quelqu'un la trouve et transfère les bitcoins susceptibles d'y être indexés.

Une clef privée "simple", c'est quoi ? Par exemple :

0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0001

FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF

Disons, des clefs de faible entropie binaire.

Autre exemple : les brainwallets basiques[1]. Par exemple :

$ echo -n bitcoin|sha256sum|cut -d ' ' -f 1
6b88c087247aa2f07ee1c5956b8e1a9f4c7f892a70e324f1bb3d161e05ca107b

$ echo -n monkey|sha256sum|cut -d ' ' -f 1
000c285457fc971f862a79b786476c78812c8897063c6fa9c045f579a3b2d63f

Disons, des hashs de mots du dictionnaire, rapides à inverser avec des rainbow tables. Le deuxième exemple a pour adresse 145d1kjpDo55zVWTUVphYXm8ovNfMw55Jn, qui a visiblement été utilisée.

brainflayer est un logiciel écrit par Ryan Castellucci, dont la tâche est de :

  1. calculer les clefs privées générées à partir de mots du dictionnaire, via des algorithmes simples (sha256, etc)
  2. chercher lesquelles des clefs publiques correspondantes sont dans une liste de clefs publiques donnée en argument (l'algorithme de recherche utilise un filtre de Bloom probabiliste pour gagner en vitesse)

À titre d'exemple le court fichier example.hex donné contient des clefs publiques de brainwallets générées simplement par sha256 de certains mots du dictionnaire anglais.

Les premiers tests de ce logiciel, effectués dans un but pédagogique, ont donné des résultats édifiants : Stealing bitcoin with maths.

Pour implémenter plus efficacement le concept de brainwallet, 3 éléments sont à prendre en compte :

  1. la complexité du mot de passe (password entropy) (loin d'être simple)
  2. le salage du mot de passe pour individualiser les hashs (password salting) (pour contourner les rainbow tables)
  3. la vitesse d'exécution de l'algorithme de hachage (key stretching) (sans comparaison douteuse, plus ça prend de temps mieux c'est)

Et c'est cette approche que suivent par exemple les warp wallets.

Note

[1] Autre cas, un programmeur malintentionné d'un générateur d'adresses vanity (même hors-ligne) peut très bien s'arranger pour que les clefs privées des adresses engendrées soient facilement retrouvables, ne serait-ce qu'en scannant les clefs privées candidates à partir d'une clef quelconque qu'il connaît et que le programme utilise comme point de départ.