Beweisen, dass zwei öffentliche Schlüssel aus demselben Seed stammen, ohne den xpub und den Pfad preiszugeben?

Stellen wir uns folgendes Szenario vor:

  1. Key0 wird von SEED auf Pfad m/44'/0'/0'/0/0 abgeleitet
  2. Key1 wird von SEED auf Pfad m/44'/0'/0'/0/1 abgeleitet

Ich frage mich, ob es eine Möglichkeit gibt zu beweisen, dass Key0 und Key1 denselben Seed teilen, OHNE den SEED oder irgendein Xpub auf dem Weg teilen zu müssen.

Grundsätzlich möchte ich in der Lage sein zu beweisen, dass zwei Schlüssel irgendwie verwandt sind, ohne die Sicherheit zu riskieren (wenn Sie einen Xpub teilen und einer seiner untergeordneten privaten Schlüssel durchgesickert ist, wird der gesamte Geschwistersatz kompromittiert).

Es muss nicht genau das sein, aber mein Ziel ist es zu beweisen, dass zwei Schlüssel verwandt sind, ohne die Sicherheit zu opfern. Wenn es also Möglichkeiten gibt, dies zu tun, würde ich diese Lösungen auch schätzen.

Antworten (1)

Dies ist mit Zero-Knowledge-Beweisen möglich, aber nicht mit der Mathematik, die in BIP32 allein verwendet wird.

Dies liegt daran, dass Key0 und Key1 mathematisch nicht miteinander verwandt sind, außer dass sie von demselben übergeordneten Schlüssel abgeleitet wurden und denselben Kettencode verwenden (zusätzliche 32 Bytes Entropie, die in BIP32 beschrieben sind ) . Um zu beweisen, dass sie von demselben übergeordneten öffentlichen Schlüssel abgeleitet sind, müssen Sie daher diesen übergeordneten öffentlichen Schlüssel und den Kettencode offenlegen - und dies sind die beiden wichtigsten Werte, die in einem xpub enthalten sind (es gibt auch einige Metadaten ) .

Beachten Sie, dass Sie den öffentlichen MASTER-Schlüssel des Seeds nicht preisgeben müssen, sondern nur den übergeordneten Schlüssel , der sich in Ihrem Beispiel unter path befindet m/44'/0'/0'/0.

Für Details lesen Sie, wie untergeordnete öffentliche Schlüssel von ihren übergeordneten öffentlichen Schlüsseln in BIP32 abgeleitet werden .

(zusammengefasst):

let I = HASH512(<chain code> || <parent public key> || <index>).
let J = the first 256 bits of I
child public key = <J> * <G (generator point of curve)> + <parent public key>

Die einzige Beziehung zwischen Key0 und Key1 besteht also darin, dass sie beide auf diese Weise abgeleitet wurden, where <index> = 0und <index> = 1.

Vitalik Buterin schrieb 2013 einen großartigen Artikel für das Bitcoin Magazine über dieses Problem. Wenn Sie einen erweiterten übergeordneten öffentlichen Schlüssel (der den Kettencode enthält) und einen beliebigen (ungehärteten) untergeordneten privaten Schlüssel offenlegen, kann der übergeordnete private Schlüssel berechnet werden. Dies liegt daran, dass die Daten, die benötigt werden, um einen untergeordneten privaten Schlüssel von einem übergeordneten privaten Schlüssel abzuleiten, dem Angreifer (im übergeordneten xpub) zur Verfügung stehen. Der Angreifer kann diesen Wert also einfach vom untergeordneten privaten Schlüssel subtrahieren, um den übergeordneten privaten Schlüssel zu berechnen.

Als letzte Anmerkung vergessen Sie nicht, dass Sie, wenn Sie nachweisen müssen, dass Sie zwei Schlüssel kontrollieren, einfach dieselbe Nachricht mit jedem Schlüssel signieren können :-)

Sie können dafür immer einen generischen Zero-Knowledge-Beweis verwenden (Bulletproofs, zk-SNARKs, ...). Es wird nicht schnell gehen, aber es ist sicherlich möglich.
@PieterWuille danke, aktualisiert