我正在尝试在Python中实现“double and add”算法来快速乘法椭圆曲线上的点(3,please)。在
根据前面的回答(关于加法和加倍)
维基百科页面
而我的教科书(信息安全,由马克邮票),我想出了以下代码:def point_add(N_x, N_y, Q_x, Q_y, p):
m = (Q_y - N_y) * pow((Q_x-N_x), p-2, p)
ret_x = (m ** 2 - N_x - Q_x) % p
ret_y = (m*(N_x - ret_x) - N_y) % p
return ret_x, ret_y
def point_double(N_x, N_y, a, p):
m = (3*(N_x ** 2)+a) * pow(2*N_y, p-2, p)
ret_x = (m ** 2 - N_x - Q_x) % p
ret_y = (m*(N_x - ret_x) - N_y) % p
return ret_x, ret_y
multiplier_A = 44
multiplier_B = 57
a = 10
b = -21
p = 41
N_x = 3
N_y = 6
Q_x = 0
Q_y = 0
multiplier_A = list(bin(multiplier_A)[2:])
multiplier_B = list(bin(multiplier_B)[2:])
for x_a in multiplier_A:
if x_a == '1':
Q_x, Q_y = point_add(N_x, N_y, Q_x, Q_y, p)
N_x, N_y = point_double(N_x, N_y, a, p)
print(Q_x, Q_y)
这肯定会返回错误的结果。在
我哪里出错了?从头开始的新实现也是非常受欢迎的。在
更新
我想把点(3,6)乘以multiplier_A和{}。现在我只想做multiplier_A(3,6)。在
a,b,和{}是椭圆曲线参数