So konvertieren Sie einen privaten WIF-Schlüssel in einen erweiterten privaten BIP32-Schlüssel

Ich versuche, den erweiterten privaten BIP32-Masterschlüssel aus seinem erweiterten öffentlichen BIP32-Schlüssel (den ich bereits kenne) und einem privaten WIF-Schlüssel (den ich durch Entschlüsseln eines BIP38-Seeds mit einer Passphrase erhalten habe) wiederherzustellen.

Ich habe die in diesem Artikel von Vitalik Buterin beschriebenen Schritte befolgt , aber um die crack_bip32_privkeyFunktion in verwenden zu pybitcointoolskönnen, benötige ich einen privaten Schlüssel im BIP32-Format (nicht WIF). Ich kann sehen, wie man einen privaten BIP32-Hauptschlüssel von einem BIP32-Seed (mit bip32_master_key) erhält, aber nicht, wie man dasselbe von einem privaten Schlüssel im WIF-Format macht.

Wie kann ich den privaten WIF-Schlüssel in einen privaten BIP 32-Schlüssel konvertieren (mit Python, .NET oder Javascript)?

Sie haben diese Frage bereits gestellt und sie wurde als Duplikat von bitcoin.stackexchange.com/questions/56916/… geschlossen .
Ich habe die Frage mit dem bearbeitet, worüber er eigentlich fragen wollte: bitcoin.stackexchange.com/questions/56916/…

Antworten (1)

Du kannst nicht. Das erweiterte private Schlüsselformat BIP 32 enthält Informationen, die im privaten WIF-Schlüssel nicht vorhanden sind. Das erweiterte private Schlüsselformat enthält den Kettencode des privaten Schlüssels, den Index und den übergeordneten Fingerabdruck. Diese Informationen stammen aus der Ableitung des privaten Schlüssels selbst und können nirgendwo anders gefunden werden.


Um den übergeordneten öffentlichen Schlüssel zu erhalten, ist die einzige Information, die Sie aus dem erweiterten öffentlichen Schlüssel benötigen, der Index des untergeordneten Schlüssels. Dies kann trivial gefunden werden, indem einfach alle möglichen untergeordneten Indizes (2 ^ 31 - 1 Indizes) brutal erzwungen werden, bis Sie einen privaten Hauptschlüssel erhalten, der einen öffentlichen Schlüssel hat, der mit dem übergeordneten öffentlichen Schlüssel übereinstimmt, oder bis Sie den korrekten untergeordneten öffentlichen Schlüssel abgeleitet haben Schlüssel aus dem übergeordneten öffentlichen Schlüssel.

Hier ist der Code, mit dem Sie den übergeordneten privaten Schlüssel finden. Dies führt die erste Technik des zyklischen Durchlaufens möglicher privater Elternschlüssel durch, bis einer gefunden wird, der einen öffentlichen Schlüssel hat, der mit dem öffentlichen Elternschlüssel übereinstimmt. Beachten Sie, dass dies möglicherweise völlig ineffizient ist und lange dauern kann, um einen Schlüssel zu finden. Beachten Sie auch, dass dies nur funktioniert, wenn der untergeordnete Schlüssel direkt vom übergeordneten Schlüssel abgeleitet wird, nicht etwas weiter unten im Ableitungsbaum.

from pybitcointools.deterministic import raw_crack_bip32_privkey, bip32_deserialize, bip32_serialize, bip32_privtopub
from pybitcointools.main import decode_privkey, encode_privkey

parent_pub = 'xpub661MyMwAqRbcEnKbXcCqD2GT1di5zQxVqoHPAgHNe8dv5JP8gWmDproS6kFHJnLZd23tWevhdn4urGJ6b264DfTGKr8zjmYDjyDTi9U7iyT'
wif_key = encode_privkey(decode_privkey('KyqcQVzcp7cHEMEDHQaz5eaE5azsRHaE4ukkeqwM2vdiQwBYtxeb'), 'bin_compressed')
for i in xrange(2**31 -1):
    priv = (b'\x04\x88\xAD\xE4', 1, 0, i, b'', wif_key)
    pkey =  raw_crack_bip32_privkey(bip32_deserialize(parent_pub), priv)
    final_key = bip32_serialize(pkey)
    if bip32_privtopub(final_key) == parent_pub:
        print final_key
        break
Super, genau das habe ich gebraucht. Irgendeine Idee, wie man es schneller fertigstellen kann (z. B. Tage)? Im Moment wird es Jahre dauern :(. Ich habe mir Cython angeschaut, aber ich müsste alle Abhängigkeiten cythonisieren, wo Zeit aufgewendet wird. Wenn Sie wüssten, wie man dies direkt mit der Standard-Bitcoin-C++-Bibliothek anstelle von Python macht, wäre das großartig .
Es sollte nicht länger als ein paar Sekunden dauern, es sei denn, Ihr Schlüssel hat einen wirklich hohen Index. Wenn der Schlüssel jedoch eine Tiefe von mehr als 1 hat (dh der Schlüssel wird von einem Pubkey abgeleitet, der vom übergeordneten Pubkey abgeleitet wird usw.) oder gehärtet ist, wird der Prozess in einer Schleife ausgeführt, bis alle möglichen Indizes erschöpft sind und es wird beendet, ohne dass ein Schlüssel gefunden wurde. Ich vermute, dass dies hier der Fall ist. Um damit umzugehen, sollten Sie sicherstellen, dass der Schlüssel nicht gehärtet ist, und sicherstellen, dass Sie sich in der richtigen Tiefe befinden. Wenn nicht, müssen Sie öffentliche Schlüssel ableiten, bis Sie es sind.
Okay, vielen Dank für die Ratschläge. Ich verwende tatsächlich die beiden Seeds und Pubkeys (mit Tiefe 0 und „Bitcoin Master Public Key“ gemäß bip32.org, die von Coinbase bereitgestellt werden, wenn ich einen Multi-Sig-Tresor generiere. Für jeden Seed konnte ich den WIF-Privkey abrufen , aber die zugehörige Adresse ist nicht die gleiche wie die aus dem Pubkey abgeleitete Adresse (mit dem Ableitungspfad "Simple: m/i" und dem korrekten Index i, den ich kenne). Es scheint also, dass der Privkey, den ich habe, nicht der "Master private key", die ich benötigen würde, um den privaten Schlüssel abzuleiten, der genau dieselbe Adresse wie der pubKey hat.
Ohne den richtigen privaten Schlüssel kann ich keine Nachricht signieren, die beweist, dass ich der Eigentümer der mit dem öffentlichen Schlüssel verknüpften Adresse bin.
Worüber sprichst du und wie hängt es mit dieser Frage zusammen?
Sorry für die Verwirrung. Ich versuche nur, einige Hintergrundinformationen darüber bereitzustellen, wie die Schlüssel ursprünglich generiert wurden. Das Ziel meiner Frage ist es, einen Privkey zu erhalten, dessen Adresse mit der Adresse des abgeleiteten Pubkeys bei index identisch ist m/14.
Im Moment habe ich: (1) einen Master-Pubkey im erweiterten BIP32-Format (bereitgestellt von Coinbase), (2) einen abgeleiteten Pubkey im Index m/14, der der Adresse entspricht, für die ich den Besitz nachweisen muss, (3) einen privaten Schlüssel in WIF Format (bereitgestellt von Coinbase beim Generieren des Tresors, ich weiß nicht, ob es gehärtet ist, noch die Tiefe).
Ich bin mir nicht sicher, wie ich sie in Ihr Skript eingeben soll und welche Parameter in der Zeile priv = (b'\x04\x88\xAD\xE4', 1, 0, i, b'', wif_key)geändert werden müssen, um den privaten BIP32-Schlüssel zu erhalten, der dieselbe Adresse wie der abgeleitete Pubkey hat.
Das sieht nach einem XY-Problem aus: xyproblem.info . Wenn Sie die beiden Pubkeys und den privaten Schlüssel des Coinbase-Benutzers haben, sollten Sie immer noch die benötigten Informationen erhalten, nur nicht mit der Methode, die Sie verwenden möchten. Da dies jetzt nicht zum Thema gehört, schlage ich vor, dass Sie eine neue Frage stellen, in der Sie genau fragen, was Sie tun möchten, und nicht, was Ihrer Meinung nach funktionieren würde, um das zu erreichen, was Sie tun wollten.
Wie auch immer, ich vermute (nicht sicher, da ich gerade keinen Zugriff auf mein Coinbase-Konto habe, um es zu überprüfen), dass der Benutzerschlüssel, den sie Ihnen geben, ein privater Schlüssel ist, der dann verwendet wird, um den privaten Schlüssel abzuleiten, der dem Master entspricht öffentlicher Schlüssel, den sie dir gegeben haben. Diese Ableitung ist wahrscheinlich eine gehärtete Ableitung und verwendet wahrscheinlich den BIP 44-Ableitungspfad. Sie sollten also in der Lage sein, den privaten Schlüssel abzuleiten, der dem öffentlichen Schlüssel entspricht, indem Sie den BIP 44-Ableitungspfad verwenden, und von dort aus den privaten Schlüssel ableiten, den Sie benötigen.
Du hast genau recht. Ich habe versucht, mein Problem zu verallgemeinern, hätte es aber wahrscheinlich nicht tun sollen. Ich habe die passendere Frage hier gepostet: bitcoin.stackexchange.com/questions/57207/… . Vielen dank für Deine Hilfe.