ECDSA x,y-Koordinate Gültigkeitsüberprüfung scheint nicht zu funktionieren

Der ECDSA-Algorithmus secp256k1 für Bitcoin verwendet angeblich die Gleichung

y ^ 2 = x ^ 3 + 7 mod P

um die Gültigkeit eines angeblichen Punktes auf der elliptischen Kurve zu bestimmen. Verwendung von http://web2.0calc.com/

Beim Verifizieren des öffentlichen Schlüssels 1, der die folgenden Eigenschaften hat:

x = 55066263022277343669578718895168534326250603453777594175500187360389116729240

y = 32670510020758816978083085130507043184471273380659243275938904335757337482424

Ich habe x ^ 3 angewendet, dann 7 hinzugefügt und dann mod P auf dieser Webseite. Dann habe ich es quadriert und bekommen

180964706334543048141953325634608696715.426683454595872

Was nicht y ist. Wie mache ich das falsch? Meine Ergebnisse deuten darauf hin, dass dieser Punkt kein gültiger Punkt auf der Kurve ist, aber jeder weiß, dass er es ist. Offensichtlich bin ich derjenige, der falsch liegt.

EDIT: Ich möchte die Frage weiter präzisieren. Meine Frage ist, wie man eigentlich (als Beispiel) den Y-Wert bestimmt, während man nur den X-Wert hat. Bitcoin tut es, das "Bitcoin Address Utility" tut es auch. Wenn jemand einen komprimierten Schlüssel hat (der nur die x-Koordinate enthält), kann er auch die y-Koordinate erhalten. Die Verwendung des oben genannten Webseitenrechners funktioniert nicht und andere sagen, es sei "modular root". Hat jemand Python 2.7.7-Code, der dies tun würde, oder hat eine relativ einfache Möglichkeit, zu erklären, wie man das Ganze bewerkstelligt? Vielen Dank.

PyBitcoinTools verwendet diese Zeilen . Wie Pieter sagte, es ist ziemlich kompliziert.

Antworten (4)

Das reine Textformat dieser Gleichung macht nur Sinn, wenn Sie die Theorie dahinter verstehen. y ^ 2 = x ^ 3 + 7 mod Pbedeutet "alle Berechnungen in dieser Gleichung mit dem endlichen Zahlenfeld mit der Definition P durchführen". Es könnte besser geschrieben werden (y^2 = x^3 +7) mod p.

Um die Mathematik einfach zu halten, subtrahieren wir einfach eine Seite von der anderen, um zu sehen, ob das Null ergibt. Dadurch können wir Wurzeln vermeiden. Hier ist Code, der die interaktive Python-Shell verwendet, z. B. pythonvon einer Eingabeaufforderung aus):

>>> x = 55066263022277343669578718895168534326250603453777594175500187360389116729240
>>> y = 32670510020758816978083085130507043184471273380659243275938904335757337482424
>>> p = 115792089237316195423570985008687907853269984665640564039457584007908834671663
>>> (x**3 + 7 - y**2) % p
0
Mein Ziel ist es, y bestimmen zu können, wenn ich nur x habe. Ich stimme Ihrer Schlussfolgerung nicht zu, dass es ideal ist, Quadratwurzeln zu vermeiden.
Wurde das jemals gelöst?

Aus Ihrem X-Wert können Sie 2 mögliche Y-Werte erhalten.

y^2 == (Y * Y) == (-Y * -Y)    (mod p)

Abhängig vom Format des öffentlichen Schlüssels in der Bitcoin-Transaktionseingabe können Sie herausfinden, gegen welches Y Sie validieren möchten.

Wenn der öffentliche Schlüssel mit 04 beginnt, ist Y bereits im öffentlichen Schlüssel vorhanden und Sie müssen keine Berechnungen durchführen, um Y zu finden

Wenn der öffentliche Schlüssel mit 02 beginnt, ist der gewünschte Y-Wert eine gerade Zahl.

Wenn der öffentliche Schlüssel mit 03 beginnt, ist der gewünschte Y-Wert eine ungerade Zahl.

Anhand Ihres Beispiels für X,

X = 55066263022277343669578718895168534326250603453777594175500187360389116729240

Ich berechne die möglichen Y-Werte sind,

Y1 = 32670510020758816978083085130507043184471273380659243275938904335757337482424
Y2 = 83121579216557378445487899878180864668798711284981320763518679672151497189239

Wählen Sie Ihr Y abhängig vom Format des öffentlichen Schlüssels in der Bitcoin-Transaktionseingabe.

Python-Code,

p = 0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f
x = 55066263022277343669578718895168534326250603453777594175500187360389116729240
ysquared = ((x*x*x+7) % p)
print "ysquared= %s " % ysquared
y = pow(ysquared, (p+1)/4, p)
print "y1 = %s " % y
print "y2 = %s " % (y * -1 % p)

Ich ziehe es vor, meine Zahlen im Hex-Format zu betrachten, also ist hier die gleiche Beispielausgabe als Hex.

X = 0x79be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798
Y1 = 0x483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8
Y2 = 0xb7c52588d95c3b9aa25b0403f1eef75702e84bb7597aabe663b82f6f04ef2777

Python-Code,

p = 0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f
x = 0x79be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798
ysquared = ((x*x*x+7) % p)    
print "ysquared= %s " % hex(ysquared)    
y = pow(ysquared, (p+1)/4, p)
print "y1 = %s " % hex(y)
print "y2 = %s " % hex(y * -1 % p)

Eine Beispieltransaktion mit dem öffentlichen Schlüssel X,Y1 (0279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798)

https://2xoin.com/tx/8e2c570498680261040ceffdd15e67dda6c00a885d1e5484f220125f3a5e2c56

Zum Zeitpunkt des Schreibens gab es keine Transaktionen mit den öffentlichen Schlüsseln X,Y2

Um weiter auf Davids Antwort einzugehen, der schwierigste Teil ist eigentlich die Quadratwurzel. Es ist nur die Zahl, die nach dem Quadrieren von Modulo P das Ergebnis ist, das Sie zuvor hatten. Das ist eine modulare Quadratwurzel, und Sie können sie nicht einfach mit normaler Arithmetik berechnen (im Gegensatz zu modularen Additionen, Multiplikationen oder Potenzen).

Dieser Wikipedia-Artikelabschnitt enthält weitere Informationen: http://en.wikipedia.org/wiki/Quadratic_residue#Prime_or_prime_power_modulus

Wie bestimmt Bitcoin die y-Koordinate, wenn es wie bei komprimierten öffentlichen Schlüsseln nur das X hat?
Wir fragen (vorerst) OpenSSL, das die (p + 1)/4-te Potenz der Zahl modulo p berechnet, wie in diesem Wikipedia-Artikel oben aufgeführt.

Sie können auch aus b64 Q29udGFjdCBtZSBhdCBhZGl0ZWMzNUBnbWFpbC5jb20= dekodieren: x = 55066263022277343669578718895168534326250603453777594175500187360389116729240

y = 32670510020758816978083085130507043184471273380659243275938904335757337482424

Ich habe x ^ 3 angewendet, dann 7 hinzugefügt und dann mod P auf dieser Webseite. Dann habe ich es quadriert und bekommen

180964706334543048141953325634608696715.426683454595872