Warum wird ein Kettencode für die Entropie in HD-Geldbörsen benötigt?

In den Dokumenten und Artikeln, die ich gelesen habe, heißt es, dass der „Kettencode“ in HD-Wallets existiert, um Entropie für die Ableitung von öffentlichen/privaten Kinderschlüsseln bereitzustellen. Wenn ich den Vorgang richtig verstehe, ist es folgender:

MyHash = HMAC-SHA512(Parent_PublicKey + Parent_ChainCode + Index)
Special_Integer = Leftmost256Bits(MyHash)
Child_ChainCode = Rightmost256Bits(MyHash)
Child_PublicKey = Parent_PublicKey + Special_Integer
Child_PrivateKey = Child_PrivateKey + Special_Integer

Meine Frage ist, warum genau der Kettencode notwendig ist. Selbst mit nur HMAC-SHA512 (Parent_PublicKey + Index) sollte die Ausgabe für verschiedene Indizes sehr unterschiedlich "aussehen", also ist das Problem, dass es immer noch mathematisch nah ist?

Ein paar verwandte Fragen:

  1. Ich gehe davon aus, dass das Ziel darin besteht, die Verwendung eines Schlüssels zum Ableiten seiner Kinder oder Geschwister zu verhindern. Ist das falsch und/oder gibt es andere Sicherheitsgarantien, die HD Wallets in ihrer Baumstruktur bieten möchten?

  2. Ist der Kettencode so "öffentlich" wie der öffentliche Schlüssel, oder ist es wünschenswert, ihn so weit wie möglich privat zu halten?

Antworten (1)

Als Referenz befindet sich die ursprüngliche Spezifikation hier .

Ein paar kleine Anpassungen an Ihren grundlegenden Gleichungen, wie die Ableitung von untergeordneten HD-Wallet-Schlüsseln funktioniert. (Und beachten Sie auch, dass diese Gleichungen nur für nicht gehärtete Indizes gelten)

MyHash = HMAC-SHA512(Parent_PublicKey + Parent_ChainCode + Index)
Special_Integer = Leftmost256Bits(MyHash)
Child_ChainCode = Rightmost256Bits(MyHash)
Child_PublicKey = Parent_PublicKey + Special_Integer * G
Child_PrivateKey = Parent_PrivateKey + Special_Integer

Ich habe das * G, hinzugefügt und Child_PrivateKeyin Parent_PrivateKeyder letzten Gleichung zu geändert. Das * Gliegt daran, dass Sie die Elliptic-Curve-Multiplikation verwenden müssen, bevor Sie zum Parent_PublicKey hinzufügen können, der ein Elliptic-Curve-Punkt ist.

Schauen wir uns nun an, wie diese Gleichungen aussehen würden, wenn der Kettencode nicht verwendet würde.

MyHash = HMAC-SHA512(Parent_PublicKey + Index)
Special_Integer = Leftmost256Bits(MyHash)
Child_PublicKey = Parent_PublicKey + Special_Integer * G
Child_PrivateKey = Parent_PrivateKey + Special_Integer

Nun, wenn Sie den kennen Parent_PublicKey(der öffentlich bekannt ist und beispielsweise in der Blockchain gefunden werden kann), können Sie viele Werte für Indexalle untergeordneten Schlüssel ausprobieren und sie ableiten

Nehmen wir nun an, jemand hat (irgendwie) einen Ihrer privaten Schlüssel für irgendwo im Baum gefunden. Ohne das Vorhandensein eines Kettencodes können sie alle privaten Schlüssel den Baum hinunter von dem Knoten ableiten, an dem sie den privaten Schlüssel haben. Was noch schlimmer ist, wenn sie Zugriff auf die öffentlichen Schlüssel weiter oben im Baum erhalten, können sie auch die privaten Schlüssel mit ein wenig Rückwärtsentwicklung der Gleichungen ableiten (im Grunde, Parent_PrivateKey = Child_PrivateKey - Special_Integer). Dies ist unerwünscht, da es besser wäre, wenn der Verlust eines einzelnen privaten Schlüssels den Rest des HD-Schlüsselbaums nicht wesentlich beeinträchtigt.

All dies ist mit dem vorhandenen Kettencode nicht möglich. Es gibt also sehr gute Datenschutz- und Sicherheitsgründe für die Verwendung des Kettencodes.

Ist der Kettencode so "öffentlich" wie der öffentliche Schlüssel, oder ist es wünschenswert, ihn so weit wie möglich privat zu halten?

Es ist auf jeden Fall wünschenswert, es privat zu halten, da Sie durch das Durchsickern den oben genannten Problemen ausgesetzt sind.