Wird jede Ethereum-Adresse von (theoretisch) 2 ** 96 privaten Schlüsseln geteilt?

Zusammenfassung

Dies ist eine erweiterte Frage zu Wie werden Ethereum-Adressen generiert? .

In Ethereum ist ein privater Schlüssel 256 Bit lang, aber eine Adresse ist nur 160 Bit lang. Durch das "Pigeonhole-Prinzip" wird garantiert, dass einige eindeutige private Schlüssel auf dieselbe Adresse abgebildet werden. Theoretisch werden 2 ** 96eindeutige private Schlüssel im Durchschnitt einer Adresse zugeordnet.

Frage

Wenn 2 private Schlüssel derselben Adresse zugeordnet sind, erhalten sie dann beide Zugriff auf dieselbe Adresse? Können sie beide verwendet werden, um Ether von dieser Adresse zu einer anderen zu übertragen?

Einzelheiten

Laut der Antwort von @tayvano ist ein privater Schlüssel 256 Bit lang, und jede 256-Bit-Zeichenfolge ist ein gültiger privater Schlüssel:

Jede einzelne Zeichenfolge von 64 Hex ist hypothetisch ein privater Ethereum-Schlüssel, der auf ein Konto zugreift.

Daher gibt es 2 ** 256gültige private Schlüssel (der Schlüsselraum ist 2 ** 256).

Ein öffentlicher Schlüssel ist 512 Bit lang. Da jedoch jeder von seinem eigenen privaten Schlüssel abgeleitet wird, gibt es nur 2 ** 256gültige öffentliche Schlüssel, und somit ist der Schlüsselraum 2 ** 256.

Der öffentliche Schlüssel wird dann als Eingabe des Keccak-256(Pre-Standard-SHA3)-Hash-Algorithmus zugeführt. Die Ausgabe von Keccak-256ist eine 256-Bit-Zeichenfolge, daher könnte sie als eine Eins-zu-Eins-Zuordnung im Schlüsselraum behandelt werden. (Der Hash-Bereich ist 2 ** 256)

Eine Ethereum-Adresse wird jedoch aus den niederwertigsten 160-Bit des Keccak-256Hashs erhalten. Dadurch wird der Schlüsselraum auf 2 ** 160.

Infolgedessen ist der Prozess der Generierung einer Adresse aus einem privaten Schlüssel eine Funktion eines 256-Bit-Werts zu einem 160-Bit-Wert, was Duplikate garantiert.

Sie könnten interessiert sein

Danke für den Link! Tatsächlich habe ich verstanden, wie groß die Zahl ist, bevor ich den Beitrag gelesen habe, aber ich bin immer noch neugierig, ob alle 2 ** 96Schlüssel auf derselben Adresse funktionieren oder ob es einen Mechanismus gibt, um den "echten" Schlüssel von den anderen zu unterscheiden.

Antworten (2)

Ihre Berechnungen sind richtig, außer dass es nicht genau 2 ^ 256 private Schlüssel gibt - es gibt "FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFE BAAEDCE6 AF48A03B BFD25E8C D0364141" (diese Zahl wird Nim ETH-Quellcode genannt und ist die Reihenfolge des Generators der elliptische Kurve secp256k1, aus der Ethereum-Schlüsselpaare generiert werden).

Als Antwort auf Ihre Frage: Ja, private Schlüssel, die derselben Adresse zugeordnet sind, können das Geld an dieser Adresse nach dem Prinzip „Wer zuerst kommt, mahlt zuerst“ ausgeben. Sie erstellen denselben öffentlichen Schlüssel, gegen den der ECDSA-Verifizierungsalgorithmus ausgeführt wird, und daher werden Signaturen, die von einem der privaten Schlüssel generiert wurden, gegen dieselbe Adresse verifiziert!

In go-ethereum/accounts/key.go haben wir einen privaten Schlüssel, der aus S256 generiert wurde, was die Kurve von secp256k1 ist, was bedeutet, dass sie kleiner als Nder Standardwert sein werden.

func newKeyFromECDSA(privateKeyECDSA *ecdsa.PrivateKey) *Key {
    id := uuid.NewRandom()
    key := &Key{
        Id:         id,
        Address:    crypto.PubkeyToAddress(privateKeyECDSA.PublicKey),
        PrivateKey: privateKeyECDSA,
    }
    return key
}

func newKey(rand io.Reader) (*Key, error) {
    privateKeyECDSA, err := ecdsa.GenerateKey(secp256k1.S256(), rand)
    if err != nil {
        return nil, err
    }
    return newKeyFromECDSA(privateKeyECDSA), nil
}

go-ethereum/crypto/secp256k1/secp256 generiert die Schlüsselpaare ebenfalls gemäß secp2656k1, wenn auch auf etwas andere Weise :)

Coole anschauliche Erklärung dafür, was Nwirklich ist und warum 2 Schlüssel Geld von demselben Konto ausgeben können

Stellen Sie sich vor, private Schlüssel sind Meilen, die in Ihrem Auto gefahren wurden, und öffentliche Schlüssel sind die Anzahl der Meilen auf dem Kilometerzähler Ihres Autos. Wenn der Kilometerzähler von 999.999 auf 000.000 übergeht, hat eine Person mit gefahrenen Kilometern = 1.000.001 denselben „öffentlichen Schlüssel“ und damit dieselbe Adresse wie eine Person mit gefahrenen Kilometern = 1.

Die EC-Gruppenarithmetik ist dieser überraschend ähnlich, aber statt 999.999 haben wir die scheinbar willkürliche Zahl, die oben angegeben ist! Aufgrund dieser Eigenschaft können Sie selbst mit Ihren unterschiedlichen „privaten Schlüsseln“ Signaturen erstellen, die gegen denselben öffentlichen Schlüssel verifiziert werden, und somit ETH von derselben Adresse ausgeben!!

Langweilige mathematische Erklärung

Private Schlüssel sind 256-Bit-Zahlen, und um den öffentlichen Schlüssel aus einem privaten Schlüssel zu berechnen, multiplizieren Sie ihn mit dem Generator, g, der Gruppe elliptischer Kurven. Der verwendete Generator wird in den Parametern der in ETH verwendeten secp256k1-Bibliotheken definiert. Er selbst ist auch ein elliptischer Kurvenpunkt, und da elliptische Kurven zyklisch sind, gibt es einen nsolchen, dass n.g = 1(dies wird Generatorordnung genannt).

Mit dieser Gleichung können wir sehen, dass wir, wenn wir einen privaten Schlüssel kmit k>nhätten, k.g = (k-n).g = k'.g, für a hätten k', das möglicherweise der private Schlüssel von jemand anderem ist! Wir haben also Schlüssel, die zufällig modulo generiert werden n, und nicht 2^256.

Ihre Uhrenanalogie hier war hilfreich.
@eth Ooh Entschuldigung, guter Ruf, ich werde bearbeiten, um Analogien aufzunehmen!
Ich danke Ihnen für Ihre Erklärung! Es ist übersichtlich und leicht verständlich! Eine erweiterte Frage, wenn es Ihnen nichts ausmacht: Wissen Sie, warum die Erfinder beschlossen haben, den öffentlichen Schlüssel auf 160 Bit zu "kürzen", um die Adresse zu werden? Sollte es nicht besser sein, wenn der ursprüngliche öffentliche 256-Bit-Schlüssel als Adresse verwendet wird? Vielen Dank!
@SiuChingPong-AsukaKenji- Ich denke, Ethereum hat es hauptsächlich getan, um Bitcoin zu wiederholen, aber am Ende davon sagt Vitalik, dass es daran liegt, dass andere Teile von Ethereum nur 128-Bit-Sicherheit haben, also wäre ein längerer Hash sinnlos, weil es bereits nicht das schwächste Glied darin ist das System :)
@bekah Danke, aber ich bin jetzt verwirrter. Bedeutet dies, dass nur 128 Bit der 160-Bit-Adresse tatsächlich wirksam sind? Wenn nicht, wo gilt das von Ihnen erwähnte 128-Bit? Vielen Dank!
@SiuChingPong-AsukaKenji- es ist nur eine Möglichkeit, die Sicherheit von Ethereum anzuzeigen - die Art und Weise, wie die Signaturen generiert werden, bedeutet, dass sie aufgrund der verwendeten Gruppe/elliptischen Kurve (secp256k1) nur 128-Bit-Sicherheit bieten, also denke ich, dass die Begründung so ist Hash könnte 256 Bit oder 160 Bit oder 129 Bit sein, aber die elliptische Kurve wird immer noch zuerst angegriffen/gebrochen. Mit dem Hash > 128 Bit dauert es länger, den Hash per Brute Force zu erzwingen als mit der elliptischen Kurve, aber wenn wir eine Hash-Funktion hätten, die z Hash-Funktion.
Ich denke, die Frage ist nicht, wie verschiedene private Schlüssel denselben öffentlichen Schlüssel erzeugen können (was wahr ist), sondern eher, wie verschiedene private Schlüssel dieselbe Adresse erzeugen können. Das Erhalten desselben öffentlichen Schlüssels aus verschiedenen privaten Schlüsseln ist eine Möglichkeit, dies zu erreichen, aber ich denke, die Frage ist eher, wie verschiedene öffentliche Schlüssel zu derselben Adresse führen können, da eine Adresse ein abgeschnittener öffentlicher Schlüssel ist.
+1 für die Bereitstellung sowohl "interessanter" als auch "langweiliger" Erklärungen für unterschiedliche Zielgruppen.
Ist das nicht so: Der gleiche unterschiedliche private Schlüssel erzeugt die gleiche Adresse, die angeblich eine schlechte Sache ist und das Ethereum-Netzwerk praktisch funktionsunfähig machen kann?

Meine überarbeitete Antwort auf die Hauptfrage der Überschrift lautet, dass es zwangsläufig 2^96 Schlüssel gibt, die kollidierende Adressen erzeugen, da die Grenze für den Adressraum 2^160 und der Schlüsselraum fast 2^256 beträgt. Obwohl also jeder unterschiedliche öffentliche Schlüssel und der daraus resultierende Keccak-Hash-Digest eindeutig nur einem privaten Schlüssel zugeordnet ist, gilt angesichts der Verwendung von Keccak in den Phasen der Adressformatierung das Schubladenprinzip und schafft das Potenzial für eine Kollision der nachlaufenden 160 Bits für zwei verschiedene Hash-Digests, die die letzten 160 Bit teilen, mehr zu diesen Annahmen unten:

Für jeden gültigen unterschiedlichen privaten Schlüssel (zwischen 1 und n-1, wobei n = '0xfffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141'gemäß Kurve secp256k1 ein „unterschiedlicher“ öffentlicher Schlüssel generiert wird (nachdem der Generatorpunkt angewendet wurde, um die Kurve zu umschließen) und daher keine Kollisionsgefahr besteht, da sich keine zwei unterscheiden Private Schlüssel könnten demselben öffentlichen Schlüssel zugeordnet werden.

Das offizielle Ethereum-Repo auf Github hat eine Bibliothek namens eth-keys für Python, die private Schlüssel generiert und über eine Fehlerprüfung verfügt, um sicherzustellen, dass der geheime Exponent kleiner als ist n.

Bezüglich Adresskollisionen:

Wenn die erste obige Annahme wahr ist, dann wäre die Wahrscheinlichkeit, dass zwei verschiedene öffentliche Schlüssel einen Keccak_256-Digest mit identischen abschließenden 160 Bits erzeugen, vergleichbar (wenn auch weniger wahrscheinlich) mit dem Versuch, zwei beliebige zufällige Zeichenfolgen über eine Brute-Force-Suche zu finden, was dies tun würde erzeugen identische 160 Trailing-Bits in ihren jeweiligen Hash-Digests.

Solche partiellen Kecccak_256-Hash-Digest-Kollisionen sollten sicherlich existieren, trotz der unpraktischen Wahrscheinlichkeit, eine so lange zu finden, vergleichbar mit einem Ethereum-Vanity-Adressgenerator, der versucht, alle 40 Zeichen für eine bestimmte Anforderung zu generieren (dh 40 Einsen oder die folgende vollkommen gültige Adresse, die niemand ist wahrscheinlich jemals einen Schlüssel für ohne einen ausreichend starken Quantencomputer ' 0xFEEDFEEDFEEDFEEDFEEDFEEDFEEDFEEDFEEDFEED ')) generieren, der eine Schwierigkeit von 1461501637330902918203684832716283019655932542976 hätte, was 2 ^ 160 oder 16 ^ 40 entspricht (dh eine Brute-Force-Suche durchführen muss, um solche Kombinationen zu finden Vanity-Adresse).

Während es immer noch nicht machbar genug ist (meine Schätzung ist 2**160), zwei Keccak_256-Hex-Digests zu finden, die die gleichen nachgestellten 40 Hex-Zeichen für zwei zufällige Pre-Images haben, müsste dieser Fall zwei unterschiedliche öffentliche Ethereum-Schlüssel (wie z pre-images), die zu zwei unterschiedlichen Keccak_256-Digests hashen, die die gleichen 40 nachgestellten Hex-Zeichen teilen.

Daher ist das Schubladenprinzip anwendbar - aber nicht auf die Kurve selbst, da es npotenzielle private Schlüssel gibt, die eindeutig nöffentlichen Schlüsseln zugeordnet sind (Schlüsselraum ist 2 ^ 256-432420386565659656852420866390673177326, abzüglich einiger ungültiger wie alle 0), ohne einzelne Kollisionen , aber stattdessen gibt es unvermeidlich Kollisionen bei abgeleiteten Adressen (da der eindeutige Adressraum 2^160 ist, bin ich mir nicht sicher, wie viele solcher Teilkollisionen auf Keccak_256-Digests existieren können (also poste ich diesen Teil auf crypto.stackexchange für einen tieferen Tauchgang ).

Idee : Eine Möglichkeit, dies zu lösen, wäre, wenn der gesamte Keccak Digest als Ethereum-Adresse verwendet würde, obwohl der Kompromiss darin bestehen könnte, dass dies Folgen für die Gaskosten und andere Effizienzverluste hätte, wie z. B. die Notwendigkeit von mehr Datenspeicherung als die Blockchain für jede Adresse um 96 Bit und alle damit verbundenen Kontotransaktionen aufgebläht (und eine solche Erhöhung würde sich schnell zu einer Differenz von Kilobyte, Gigabyte, Terabyte summieren).