clé privée : Comment fonctionne le mnémonique BIP 39 ?


Les mnémoniques sont la clé privée séparée en 12 mots qui réunis dans le même ordre produit la clé privée

C’est inexact. Un mnémonique représente une entropie qui est transmise à une fonction d’extension de clé PBKDF2 avec 2048 tours de hachage pour générer une graine de 512 bits. Cette graine agit alors comme un trousseau utilisé pour générer différentes clés. Consultez la dernière section de la réponse pour voir comment les clés privées sont générées à partir de semences.

Comment sont générés les mnémoniques ?

clé privée : Comment fonctionne le mnémonique BIP 39 ?

Comme dit ci-dessus, les mnémoniques sont une représentation de l’entropie avec une somme de contrôle. La première étape consiste à prendre une décision quant à la quantité d’entropie que vous considérez comme sûre pour vos opérations. Supposons, pour l’instant, que vous ayez choisi 128 bits d’entropie. Vous trouverez ci-dessous les étapes à suivre pour convertir cette entropie en mnémonique.

  • Utilisez un générateur d’entropie cryptographiquement sécurisé pour générer 128 bits d’entropie
  • Calculez le SHA256 de l’entropie.
  • Ajoutez le premier entropy_length/32 bits du SHA256 de l’entropie à la fin de l’entropie. Par exemple, dans notre cas, nous ajouterons les 4 premiers bits du SHA256 (entropie) à l’entropie puisque notre entropie est de 128 bits
  • Chaque mot du mnémonique représente 11 bits. Par conséquent, si vous vérifiez la liste de mots, vous trouverez 2048 mots uniques. Maintenant, divisez l’entropie + la somme de contrôle en parties de 11 bits chacune.
  • Faites correspondre ces fragments de 11 bits aux mots de la table de recherche dans la liste de mots. Puisque nous avons utilisé 128 bits d’entropie, notre somme de contrôle était de 4 bits. Ainsi, notre entropie ainsi que la somme de contrôle représentaient un total de 132 bits. Ainsi notre mnémonique sera de 12 mots
  • Si vous aviez utilisé 256 bits d’entropie, votre somme de contrôle aurait été (256/32 =) 8 bits. Cela représenterait (264/11) = 24 mots.

    Une chose à noter est que les mots 12/24 ne peuvent pas être utilisés comme mnémonique. Une partie du dernier mot contient généralement la somme de contrôle des mots choisis et doit donc être calculée. Il est également déconseillé de générer des mots directement à partir de la pensée et d’utiliser une fonction cryptographique sécurisée pour le faire.

    Pourquoi les mnémoniques du grand livre ont 24 mots ?

    C’est un choix de conception de sécurité. Plus le nombre de mots augmente l’entropie. 24 mots fourniront 256 bits d’entropie. Il est également important de noter qu’une phrase mnémotechnique ne peut pas être utilisée dans les deux sens entre un nombre différent de mots. Par exemple, vous ne pouvez pas convertir une représentation de 24 mots en 12 mots et vice versa.

    Comment ces mots sont-ils convertis en clé privée ?

    Le mnémonique est transmis à la fonction d’extension de clé PBKDF2 avec 2048 tours de hachage. La fonction PBKDF2 a également la capacité de prendre un « sel » qui peut être une phrase secrète facultative. Cette phrase secrète fournit une couche de sécurité supplémentaire et empêche les attaques par force brute avec des tables de recherche. La sortie de cette fonction est une graine de 512 bits.

    Cette graine est ensuite transmise à HMAC-SHA512 avec la clé « Bitcoin seed ». Le hachage résultant est utilisé pour créer la clé privée principale (m) et le code de chaîne principale (c). Les 256 bits de gauche de ce hachage résultant représentent m tandis que les 256 bits de droite représentent c. La clé privée maîtresse m est ensuite utilisée pour générer la clé publique maîtresse M (M = m*G).

    À partir de là, un certain nombre de chemins de dérivation existent pour différents portefeuilles. La plus courante est une méthode de dérivation renforcée telle que spécifiée dans le BIP 44. Essentiellement, les clés renforcées utilisent la clé privée parente dans la fonction de hachage pour générer la clé privée enfant, tandis que les non renforcées utilisent la clé publique parente dans la fonction de hachage. Cela améliore la sécurité dans la génération des clés enfants. Dans la dérivation ci-dessous, k et K représentent respectivement la clé privée et la clé publique associée.

    Il faudrait d’abord montrer que nous avons utilisé le chemin de dérivation BIP 44. Cela peut être fait avec un numéro d’index et générer une clé privée un niveau plus profond que la clé privée principale. La clé privée enfant un niveau plus profond est générée par : kchild = kpar + hash(kpar, cpar, i) où i est le numéro d’index. Pour la dérivation durcie de BIP 44, je serai 0x80000044 (nous utilisons la dernière moitié 231 du numéro d’index pour la dérivation durcie). Ce résultat nous donnera un nombre de 512 bits. Les 256 bits de gauche représenteront la clé privée enfant et les 256 bits de droite représenteront le code de chaîne enfant.

    Le niveau suivant représente la pièce. Pour Bitcoin, c’est 0 ou 0x80000000 en dérivation renforcée. Vous calculez ensuite la clé privée enfant et le code de chaîne enfant un niveau plus profond en utilisant la formule ci-dessus.

    Le niveau suivant représente le compte. Vous pouvez utiliser plusieurs comptes pour représenter différentes fonctions et mieux gérer vos fonds. Vous pouvez utiliser la logique ci-dessus pour générer la clé privée du compte et le code de chaîne. Encore une fois, il s’agit d’une dérivation renforcée, donc le premier compte aura le numéro d’index 0x80000000.

    A partir de là, nous n’utilisons plus la dérivation durcie. Le niveau suivant représente l’adresse de réception par rapport au changement. Cela vous permet d’avoir un groupe différent pour recevoir des clés privées et un groupe de clés différent pour modifier les clés privées. La fonction que nous utiliserons pour générer l’enfant privé du parent sera : kchild = kpar + hash(Kpar, cpar, i). Maintenant, je serai 0x00000000 pour la réception et 0x0000001 pour le changement. Notez également que nous avons maintenant une clé publique dans la fonction de hachage plutôt qu’une clé privée, ce qui montre qu’il ne s’agit pas d’une dérivation renforcée.

    Maintenant, au niveau suivant, nous utilisons ces groupes de clés de réception et de modification pour générer des clés privées individuelles. Utilisez les clés privées et le code de chaîne ci-dessus et transmettez-les à la fonction mentionnée ci-dessus kchild = kpar + hash(Kpar, cpar, i) pour générer des clés individuelles. Chaque incrément de i vous donnera une clé privée différente.

    Utilisez maintenant ces clés privées pour générer des adresses bitcoin.