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.
Das reine Textformat dieser Gleichung macht nur Sinn, wenn Sie die Theorie dahinter verstehen. y ^ 2 = x ^ 3 + 7 mod P
bedeutet "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. python
von einer Eingabeaufforderung aus):
>>> x = 55066263022277343669578718895168534326250603453777594175500187360389116729240
>>> y = 32670510020758816978083085130507043184471273380659243275938904335757337482424
>>> p = 115792089237316195423570985008687907853269984665640564039457584007908834671663
>>> (x**3 + 7 - y**2) % p
0
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
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
David A. Harding
mti2935