Ich habe zwei öffentliche/private Schlüsselpaare, A und B. Ich möchte sie zusammenfügen, um ein neues Schlüsselpaar AB zu erhalten.
Ich möchte auch die öffentlichen Schlüssel von A und B hinzufügen können, um den öffentlichen Schlüssel von AB zu erhalten.
Wie mache ich das?
Hier ist ein Python-Code, den Sie zurückentwickeln können
def add(p, q):
if p[0] % P == 0 and p[1] % P == 0:
return q
if q[0] % P == 0 and q[1] % P == 0:
return p
if p[0] == q[0] and p[1] == q[1]:
if p[1] == 0:
return [0, 0]
l = (3 * p[0]**2) * modInv((2 * p[1]), P)
elif p[0] == q[0]:
return [0, 0]
else:
l = (p[1] - q[1]) * modInv((p[0] - q[0]), P)
x = l**2 - (p[0] + q[0])
y = l * (p[0] - x) - p[1]
return [x % P, y % P]
def modInv(n, p):
return pow(n, p - 2, p)
#some constants
P = 0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f
x = 0x79be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798
y = 0x483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8
#example usage of the add function
g1 = [x, y]
print "g1 = " + hex(g1[0]) + " : " + hex(g1[1])
g2 = add([x, y], [x, y])
print "g2 = " + hex(g2[0]) + " : " + hex(g2[1])
g3 = add([x, y], g2)
print "g3 = " + hex(g3[0]) + " : " + hex(g3[1])
g4 = add(g2, g2)
print "g4 = " + hex(g4[0]) + " : " + hex(g4[1])
Die meisten ecc-Bibliotheken haben diese Funktion, aber wenn Sie sie selbst programmieren möchten, gehen Sie wie folgt vor:
Berechnen Sie zuerst die Steigung der Linie, die die Punkte A und B enthält. Sei A = (X_a, Y_a) und B = (X_b, Y_b). Die Gleichung für die Steigung lautet:
s = (Y_a - Y_b) / (X_a - X_b)
Den resultierenden Punkt nennen wir C = (X_c, Y_c) = A+B. Wenn Sie etwas rechnen, erhalten Sie:
X_c = s^2 - X_a - X_b
Y_c = Y_a + s (X_c - X_a) = Y_b + s(X_c - X_b)
Wenn X_a == X_b, dann hängt es von Y_a und Y_b ab. Wenn Y_a == Y_b, dann sind A und B gleich, also berechnest du eigentlich nur eine Punktverdopplung (2*A). Wenn Y_a == -Y_b (die einzige andere Möglichkeit) dann A+B = der Punkt im Unendlichen oder die Identität. Normalerweise ist das kein sehr interessanter Punkt für die Kryptographie. Die Berechnung von 2*A ist etwas kniffliger, aber machbar. Das machen Sie sowieso schon, wenn Sie den öffentlichen Schlüssel aus dem privaten Schlüssel mit G berechnen, also gehe ich davon aus, dass Sie Zugriff auf etwas haben, mit dem Sie einen Punkt verdoppeln können.
Beachten Sie, dass alle Operationen alle Feldoperationen sind, also müssen Sie von P für secp256k1 modifizieren (FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC2F in Hex).
David Schwarz
Nick Odell
You can literally add the two public keys
Ja, danach suche ich.David Schwarz
EC_POINT_add
.AffeBenutzer