Wie füge ich zwei secp256k1-Schlüssel zusammen?

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?

Können Sie genauer sagen, was Sie mit "zusammenfügen" meinen? Sie können die beiden öffentlichen Schlüssel und die beiden privaten Schlüssel buchstäblich hinzufügen, um ein neues Schlüsselpaar zu erhalten.
@DavidSchwartz You can literally add the two public keys Ja, danach suche ich.
Wenn Sie OpenSSL verwenden, EC_POINT_add.
@DavidSchwartz Kann ich ein Beispiel sehen?

Antworten (2)

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).