La spécification BIP-39 décrit principalement l'algorithme et le processus de génération de portefeuilles déterministes basés sur des mnémoniques (un ensemble de mots faciles à retenir).
Le cahier des charges se compose de deux parties principales :
Comment générer le mnémonique.
Comment transformer le mnémonique généré en graine binaire.
Ce qui suit explique comment générer des portefeuilles déterministes en décrivant d'abord chacune de ces deux parties.
Générer un mnémonique
Le processus algorithmique pour générer un mnémonique est le suivant :
Le processus est le suivant :
Créer une séquence aléatoire (entropie) de 128 à 256 bits (taille de pas 32 bits)
Effectuez SHA256 sur la séquence aléatoire générée à l'étape précédente pour générer une valeur de hachage et prenez les N premiers bits de la valeur de hachage (longueur d'entropie / 32, par exemple 128 bits, puis N = 4) comme somme de contrôle de la séquence aléatoire.
Ajoutez la somme de contrôle à la fin de la séquence aléatoire générée dans la première étape, de sorte que pour l'exemple de la figure, la séquence aléatoire avec la somme de contrôle soit de 128 + 4 = 132 bits.
Séparez la séquence aléatoire de l'étape précédente par des segments de 11 bits (split), de sorte que pour une séquence de longueur d'entropie de 128 bits, 12 segments soient générés (132/11 = 12).
À ce stade, mapper chaque valeur contenant un segment de 11 bits à un dictionnaire prédéfini de 2 048 mots.
Le dernier groupe de mots générés dans l’ordre de coupe est le mnémonique.
Génération de graines à partir de mnémoniques
Après la génération mnémonique, nous pouvons générer la graine en utilisant l'algorithme PBKDF2 de la fonction de génération de clé.
PBKDF2 nécessite deux paramètres : un mnémonique et un sel. Le but du sel est de rendre le craquage plus difficile, et dans le BIP-39, nous pouvons introduire une phrase secrète comme facteur de sécurité supplémentaire pour protéger les graines.
« PBKDF2 fait partie de la série de normes de cryptographie à clé publique (PKCS) de RSA Laboratories, plus précisément PKCS #5 v2.0, également publié sous le nom de RFC 2898 de l'Internet Engineering Task Force.
Suite à la génération mnémonique ci-dessus, le diagramme suivant montre l'algorithme de génération de graines.
Le premier paramètre de PBKDF2 est le mnémonique généré ci-dessus.
Le deuxième paramètre de PBKDF2 est le sel, qui consiste généralement en une chaîne et une concaténation facultative de chaînes de chiffrement fournies par l'utilisateur.
PBKDF2 utilise l'algorithme HMAC-SHA512, qui utilise 2048 hachages pour produire une valeur de 512 bits comme graine.
Génération d'un portefeuille HD à partir de graines
La graine générée ci-dessus sera utilisée comme Root Seed du portefeuille HD, et la Root Seed de n'importe quel portefeuille HD peut recréer l'intégralité du portefeuille HD.
La saisie de la racine racine dans l'algorithme HMAC-SHA512 produit un hachage de 512 bits, dont les 256 bits de gauche sont utilisés comme clé privée principale et les 256 bits de droite comme code de chaîne principale. Après cela, la clé publique principale (264 bits) peut être générée par la clé privée principale m.
Comme vous pouvez le voir sur la figure ci-dessus, la clé HD est générée avec les paramètres suivants.
Clé privée parent ou clé publique parent ; (les deux sont des clés ECDSA 256 bits non compressées).
Code de chaîne parent de 256 bits.
Un numéro d'index entier de 32 bits.
De plus, le processus ci-dessus est récursif et la Clé privée enfant dans le diagramme peut être utilisée comme Clé privée parent au niveau suivant.
En entrant (Clé publique parent, Code de chaîne parent, Numéro d'index) dans l'algorithme HMAC-SHA512, nous pouvons générer ses sous-clés et ajuster le numéro d'index pour générer plusieurs sous-clés au même niveau.
À propos de la clé étendue
Étant donné que cette fonction de dérivation de clé est unidirectionnelle, toutes les sous-clés ne peuvent pas être utilisées pour dériver leurs clés parent ou clés sœurs au même niveau, seules la clé parent et le code de chaîne parent (qui sont générés à partir de la clé de niveau parent et du code de chaîne du parent) peuvent être utilisés pour dériver toutes les sous-clés et codes de sous-chaîne, et ensuite générer les clés et adresses sous-publiques correspondantes pour signer les transactions.
La combinaison de la clé et du code de chaîne est appelée clé étendue, et la clé étendue peut être utilisée pour générer toutes les branches à partir de là.
La clé fournie dans la clé étendue peut être soit une clé privée, soit une clé publique, combinée avec le code de chaîne appelé respectivement Extended Private Key et Extended Public Key, et notée respectivement par (k, c) et (K, c), où la clé publique K = point(k).
Nous pouvons dériver la clé publique étendue de la clé privée étendue et non l'inverse. Ainsi, pour certains scénarios de transaction (par exemple, le commerce électronique), une nouvelle clé publique et une nouvelle adresse peuvent être générées pour chaque transaction afin de recevoir le paiement, tandis que la clé privée étendue peut être stockée dans un portefeuille papier ou un portefeuille matériel pour une signature sécurisée hors ligne des transactions. Comme nous pouvons le voir, la sécurité de la clé publique étendue est relativement élevée, et le diagramme suivant montre le mécanisme de transmission de la clé publique parent étendue pour dériver la clé privée enfant et générer la clé publique enfant :




