Ableitung des privaten Schlüssels des Elternteils vom nicht gehärteten Kind

Zitat von BIP32 :

Eine Schwäche, die möglicherweise nicht sofort offensichtlich ist, besteht darin, dass die Kenntnis eines übergeordneten erweiterten öffentlichen Schlüssels plus eines nicht gehärteten privaten Schlüssels, der davon abstammt, gleichbedeutend ist mit der Kenntnis des erweiterten übergeordneten privaten Schlüssels (und somit aller von ihm abstammenden privaten und öffentlichen Schlüssel).

Wie wird das gemacht?

Antworten (1)

Zuerst müssen wir verstehen, wie BIP 32 nicht gehärtete private und öffentliche Schlüssel ableitet.

Von BIP 32, Ableiten eines untergeordneten privaten Schlüssels von einem erweiterten übergeordneten privaten Schlüssel:

sei I = HMAC-SHA512(Key = c par , Data = ser P (point(k par ))) || ser32(i)).

Teilen Sie I in zwei 32-Byte-Sequenzen auf, I L und I R .

Der zurückgegebene untergeordnete Schlüssel K i ist Parse 256 (I L ) + k par (mod n).

Der private Schlüssel ist somit der übergeordnete private Schlüssel plus die ersten 256 Bits der HMAC-SHA512-Funktion, wobei der Schlüssel der Kettencode des übergeordneten privaten Schlüssels ist und die gehashten Daten die Verkettung der Serialisierung des öffentlichen Schlüssels sind, der dem erweiterten entspricht privater Schlüssel und der Index des untergeordneten Schlüssels. Wichtig hierbei ist, dass der HMAC-SHA512-Hash ein Hash des öffentlichen Schlüssels ist, nicht des privaten Schlüssels.

Von BIP 32, Ableiten eines untergeordneten öffentlichen Schlüssels von einem erweiterten übergeordneten öffentlichen Schlüssel:

sei I = HMAC-SHA512 (Schlüssel = c par , Daten = ser P (K par ) || ser32(i)).

Teilen Sie I in zwei 32-Byte-Sequenzen auf, I L und I R .

Der zurückgegebene untergeordnete Schlüssel K i ist Punkt(Parse 256 (I L )) + K par .

Der untergeordnete öffentliche Schlüssel ist der übergeordnete öffentliche Schlüssel, dem der öffentliche Schlüssel hinzugefügt wird, der aus den ersten 256 Bits der HMAC-SHA512-Funktion generiert wird, wobei der Schlüssel der Kettencode des übergeordneten Schlüssels und die Daten die Verkettung des übergeordneten öffentlichen Schlüssels mit dem Index von sind der öffentliche Kinderschlüssel.

Beachten Sie, dass Sie beim Ableiten des untergeordneten privaten Schlüssels und des untergeordneten öffentlichen Schlüssels tatsächlich dasselbe hashen? Sie führen die HMAC-SHA512-Funktion mit demselben Schlüssel (dem Kettencode der übergeordneten Schlüssel) und denselben Daten (der Verkettung des übergeordneten öffentlichen Schlüssels und dem Index des untergeordneten Schlüssels) aus. Die ersten 256 Bits dieses Hashs werden zu einer Art privatem Schlüssel, und dieser private Schlüssel wird dem privaten Master-Schlüssel hinzugefügt, um der tatsächliche untergeordnete private Schlüssel zu werden. Sein öffentlicher Schlüssel wird berechnet und mit dem öffentlichen Elternschlüssel hinzugefügt, um der öffentliche Kindschlüssel zu werden.

Um den privaten Hauptschlüssel zu erhalten, müssen wir also nur den untergeordneten privaten Schlüssel, den wir jetzt haben, nehmen und davon den von der HMAC-SHA512-Funktion erzeugten privaten Schlüssel subtrahieren. Dazu benötigen wir drei Dinge, den Chaincode, den übergeordneten öffentlichen Schlüssel und den untergeordneten Schlüsselindex.

Der Chaincode und der übergeordnete öffentliche Schlüssel stammen aus dem erweiterten übergeordneten öffentlichen Schlüssel ( xpub), da er sowohl den Chaincode als auch den öffentlichen Schlüssel darin codiert.

Der untergeordnete Schlüsselindex kann trivial gefunden werden, indem öffentliche untergeordnete Schlüssel vom öffentlichen übergeordneten Schlüssel abgeleitet werden, bis wir den öffentlichen Schlüssel erhalten, der dem privaten untergeordneten Schlüssel entspricht, den wir haben, und den Schlüsselindex speichern.

Mit diesen drei Dingen können wir die HMAC-SHA512-Funktion ausführen und den 512-Bit-Hash erhalten. Jetzt können wir den untergeordneten privaten Schlüssel nehmen und davon die ganze Zahl subtrahieren, die die ersten 256 Bits des Hashs sind, den wir gerade generiert haben. Unser Ergebnis ist der übergeordnete private Schlüssel. Kombinieren Sie dies mit dem Kettencode, den wir aus dem erweiterten übergeordneten öffentlichen Schlüssel abgerufen haben, und wir haben selbst den erweiterten übergeordneten privaten Schlüssel.


Diese Technik gilt nur für nicht gehärtete Ableitungen. Die gehärtete Ableitung schützt davor, da sie den untergeordneten privaten Schlüssel durch Hashing des übergeordneten privaten Schlüssels generiert. Dies bedeutet jedoch auch, dass Sie den untergeordneten öffentlichen Schlüssel nicht aus dem übergeordneten öffentlichen Schlüssel generieren können.

Können Sie klarstellen, wie dieses Thema ein Duplikat meiner Frage hier ist: bitcoin.stackexchange.com/questions/57023/… Das Thema ist ähnlich, aber Ihre Antwort, obwohl sie hier großartig ist, wäre für meine Frage nicht geeignet.
Sie fragen, wie Sie den erweiterten privaten Hauptschlüssel aus dem öffentlichen Hauptschlüssel und dem privaten untergeordneten Schlüssel erhalten. Die Schritte dazu werden hier erklärt. Die einzige andere Ergänzung zu Ihrer Frage betrifft das WIF- und xpub-Format. Dies sind nur Codierungen von Binärdaten, also decodieren Sie sie einfach, um die Rohwerte zu erhalten und die in dieser Antwort beschriebenen Operationen auszuführen.
Danke, wie man mit Python von einem BIP32-Seed zu einer xpub-Adresse wechselt, ist genau meine Frage (sorry, wenn das für Sie trivial aussieht), da pybitcointools bereits über eine Komfortfunktion verfügt, um die Schlüsselableitung durchzuführen, die Sie in Ihrer Antwort skizzieren (aber es erfordert Schlüssel im xpub-Format). Mein Verständnis, zumindest bei Stackoverflow, ist, dass eine Frage nur dann als Duplikat markiert werden sollte, wenn sie durch die Antwort einer anderen Frage vollständig erfüllt werden kann, was hier nicht der Fall zu sein scheint.
Das war vielleicht die Frage, die Sie stellen wollten, aber das war nicht die Frage, die tatsächlich gestellt wurde. Ihre Frage war "Den erweiterten privaten BIP32-Masterschlüssel wiederherstellen ..." und nicht "Wie bekomme ich das xprv von einem wif-Schlüssel". Ihre Frage sollte wirklich überhaupt nicht "erweiterten privaten Hauptschlüssel wiederherstellen" erwähnen, da dies nichts mit dem zu tun hat, worüber Sie eigentlich wissen möchten.