Die BIP-39-Spezifikation beschreibt hauptsächlich den Algorithmus und den Prozess zur Generierung deterministischer Wallets basierend auf mnemonischen (einer Gruppe von einprägsamen Wörtern).
Die Spezifikation besteht aus zwei Hauptteilen:
- Wie man das mnemonische Wort generiert.
- Wie man das generierte mnemonische Wort in einen binären Seed umwandelt.
Im Folgenden wird beschrieben, wie man deterministische Wallets generiert, indem zunächst jeder dieser beiden Teile beschrieben wird.
Generierung eines mnemonischen Wortes
Der algorithmische Prozess zur Generierung eines mnemonischen Wortes ist wie folgt:
Der Prozess ist wie folgt:
- Erstellen Sie eine zufällige Sequenz (Entropie) von 128 bis 256 Bit (Schrittgröße 32 Bit).
- Führen Sie SHA256 auf die zufällig erzeugte Sequenz aus, um einen Hashwert zu erzeugen, und nehmen Sie die ersten N Bits des Hashwerts (Entropielänge / 32, z. B. 128 Bit, dann N = 4) als Prüfziffer der Zufallssequenz.
- Fügen Sie die Prüfziffer an das Ende der im ersten Schritt erzeugten Zufallssequenz hinzu, sodass die Zufallssequenz mit Prüfziffer in dem Beispiel in der Abbildung 128 + 4 = 132 Bit beträgt.
- Trennen Sie die Zufallssequenz aus dem vorherigen Schritt in 11-Bit-Segmente (Aufteilung), sodass bei einer Sequenz mit einer Entropielänge von 128 Bit 12 Segmente erzeugt werden (132 / 11 = 12).
- Zu diesem Zeitpunkt wird jeder Wert, der ein 11-Bit-Segment enthält, einem vordefinierten Wörterbuch von 2048 Wörtern zugeordnet.
- Die endgültige Gruppe von Wörtern, die in der Reihenfolge des Schnitts erzeugt werden, ist das mnemonische Wort.
Seed-Generierung aus mnemonischen Wörtern
Nach der mnemonischen Wort -Generierung können wir den Seed mit der Schlüsselgenerierungsfunktion PBKDF2-Algorithmus generieren.
PBKDF2 benötigt zwei Parameter: ein mnemonisches Wort und ein Salt. Der Zweck des Salts ist es, das Knacken erschweren. In BIP-39 können wir eine Passphrase als zusätzlichen Sicherheitsfaktor einführen, um die Seeds zu schützen.
„PBKDF2 ist Teil der Public-Key-Kryptographiestandards (PKCS) von RSA Laboratories,
speziell PKCS #5 v2.0, auch veröffentlicht als RFC 2898 der Internet Engineering Task Force.“
Nach der obigen mnemonischen Generierung zeigt das folgende Diagramm den Algorithmus zur Seed-Generierung.
- Der erste Parameter von PBKDF2 ist das oben generierte mnemonische Wort.
- Der zweite Parameter von PBKDF2 ist das Salt, das normalerweise aus einem String und einer optionalen Verkettung von vom Benutzer bereitgestellten Cipher-Strings besteht.
- PBKDF2 verwendet den HMAC-SHA512-Algorithmus, der 2048 Hashes verwendet, um einen 512-Bit-Wert als Seed zu erzeugen.
Generierung einer HD-Wallet aus dem Seed
Der oben erzeugte Seed wird als Root Seed der HD-Wallet verwendet, und der Root Seed jeder HD-Wallet kann die gesamte HD-Wallet wiederherstellen.
Durch Eingabe des Root Seeds in den HMAC-SHA512-Algorithmus wird ein 512-Bit-Hash erzeugt, von dem die linken 256 Bit als Master Private Key und die rechten 256 Bit als Master Chain Code verwendet werden. Danach kann der Master Public Key (264 Bit) aus dem Master Private Key m Generation werden.
Aus der obigen Abbildung ist zu erkennen, dass der HD-Schlüssel mit den folgenden Parametern erzeugt wird.
- Parent Private Key oder Parent Public Key; (beide sind unkomprimierte 256 Bit ECDSA-Schlüssel).
- Parent Chain Code von 256 Bit.
- Eine 32-Bit-Ganzzahl-Indexnummer.
Darüber hinaus ist der obige Prozess rekursiv, und der Child Private Key im Diagramm kann als Parent Private Key auf der nächsten Ebene verwendet werden.
Durch Eingabe von (Parent Public Key, Parent Chain Code, Indexnummer) in den HMAC-SHA512 Algorithmus können wir seine Subschlüssel generieren, und wir können die Indexnummer anpassen, um mehrere Subschlüssel auf derselben Ebene zu erzeugen.
Über den erweiterten Schlüssel
Da diese Schlüsselableitungsfunktion unidirektional ist, können alle Subschlüssel nicht verwendet werden, um ihre übergeordneten Schlüssel oder Schwesterschlüssel auf derselben Ebene abzuleiten. Nur der übergeordnete Schlüssel und der übergeordnete Chain Code (die von den Schlüsseln und Chain Codes der übergeordneten Ebene erzeugt werden) können verwendet werden, um alle Subschlüssel und Subchain Codes abzuleiten und anschließend die entsprechenden Subpublic Keys und Adressen zur Signierung von Transaktionen zu generieren.
Die Kombination aus Schlüssel und Chain Code wird als erweiterter Schlüssel bezeichnet, und der erweiterte Schlüssel kann verwendet werden, um alle Verzweigungen von dort aus zu erzeugen.
Der im erweiterten Schlüssel bereitgestellte Schlüssel kann entweder ein privater Schlüssel oder ein öffentlicher Schlüssel sein, kombiniert mit dem Chain Code, der als Erweiterter Privater Schlüssel und Erweiterter Öffentlicher Schlüssel bezeichnet wird, und wird entsprechend als (k, c) bzw. (K, c) notiert, wobei der öffentliche Schlüssel K = Punkt(k).
Wir können den erweiterten öffentlichen Schlüssel aus dem erweiterten privaten Schlüssel ableiten, nicht umgekehrt. Daher kann in bestimmten Transaktionsszenarien (z. B. im E-Commerce) ein neuer öffentlicher Schlüssel und eine Adresse für jede Transaktion zur Zahlungserteilung generiert werden, während der erweiterte private Schlüssel in einer Papier-Wallet oder einer Hardware-Wallet zum sicheren Offline-Signieren von Transaktionen gespeichert werden kann. Wie wir sehen können, ist die Sicherheit des erweiterten öffentlichen Schlüssels relativ hoch, und das folgende Diagramm zeigt den Übertragungsmechanismus des erweiterten übergeordneten öffentlichen Schlüssels zur Ableitung des untergeordneten privaten Schlüssels und zur Generierung des untergeordneten öffentlichen Schlüssels: