Функция, которую я сейчас рассматриваю:
Код: Выделить всё
def scalar_multiply(k, G, p):
"""Multiply point G by scalar k using point addition."""
result = None # Start with the point at infinity
addend = G
while k != 0:
if k % 2 == 1:
if result is None:
result = addend
else:
result = point_add(result, addend, p)
# Point doubling
addend = point_add(addend, addend, p)
k //= 2 # Right shift k by 1
return result
Код: Выделить всё
from sympy import symbols, Piecewise
import math
def modinv(a, p):
"""Compute modular inverse of a mod p using extended Euclidean algorithm."""
return pow(a, p - 2, p)
def point_add(P1, P2, p):
"""Add two points P1 and P2 on the elliptic curve over the field of size p."""
x1, y1 = P1
x2, y2 = P2
# Define m based on the conditions for point addition and doubling
m = Piecewise(
((y2 - y1) * modinv(x2 - x1, p) % p, x1 != x2), # Point addition case
((3 * x1 ** 2) * modinv(2 * y1, p) % p, x1 == x2), # Point doubling case
(0, True) # Default case if none of the conditions match
)
# Define (x3, y3) as a tuple
x3 = (m ** 2 - x1 - x2) % p
y3 = (m * (x1 - x3) - y1) % p
# Calculate result as an integer combining x3 and y3
result2 = x3 * (10 ** 64) + y3
return (x3,y3)
def scalar_multiply(k, G, p):
"""Multiply point G by scalar k using point addition."""
result = None # Start with the point at infinity
addend = G
while k != 0:
if k % 2 == 1:
if result is None:
result = addend
else:
result = point_add(result, addend, p)
# Point doubling
addend = point_add(addend, addend, p)
k //= 2 # Right shift k by 1
return result
# secp256k1 curve parameters
p = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFC2F # Field prime
G = (0x79BE667EF9DCBBAC55A06295CE870B07029BFCDB2DCE28D959F2815B16F81798, # Generator point (G_x, G_y)
0x483ADA7726A3C4655DA4FBFC0E1108A8FD17B448A68554199C47D08FFB10D4B8)
k = 5
# Compute the public key
public_key = scalar_multiply(k, G, p)
print(public_key)
Этот код сейчас не использует Sympy, но он является частью более крупного кода, который также будет использовать Sympy для математического расчета кода для клиента. Вот почему этот код не использует Sympy, это только основы. Мне не нужны циклы в моем скалярном умножении, я хочу, чтобы оно было кусочной функцией.
Подробнее здесь: https://stackoverflow.com/questions/791 ... ation-in-a