我正在阅读 Christoffer Paares 书中关于椭圆曲线密码学的部分(“理解密码学”)。我决定在python中实现一个椭圆曲线点加法和点加倍的函数。对于我的测试,我使用了书中的示例,以便测试我的结果。
示例中使用的曲线是:y^2 = x^3 + 2x + 2 mod 17
使用的生成器是:p = (5,1)
这样循环就变成了:
1p = (5,1)
2p = (6,3)
3p = (10,6)
4p = (3,1)
5p = (9,16)
6p = (16,13)
7p = (0,6)
8p = (13,7)
9p = (7,6)
10p = (7,1)
11p = (13,10)
12p = (0,11)
13p = (16,4)
14p = (9,1)
15p = (3,16)
16p = (10,11)
17p = (6,14)
18p = (5,16)
19p = 中性元素(无限远点)
20p = (5,1)
...
我写了这段代码试图重现结果:
def add(a,p,P,Q):
#Check For Neutral Element
if P == (0,0) or Q == (0,0):
return (P[0]+Q[0],P[1]+Q[1])
#Check For Inverses (Return Neutral Element - Point At Infinity)
if P[0] == Q[0]:
if (-P[1])%p == Q[1] or (-Q[1])%p == P[1]:
return (0,0)
#Calculate Slope
if P != Q:
s = (Q[1]-P[1]) / (Q[0]-P[0])
else:
s = ((3*(P[0]*P[0])+a)%p) ** (2*P[1])
#Calculate Third Intersection
x = s*s - P[0] - Q[0]
y = (s*(P[0]-x)) - P[1]
y = y%p
x = x%p
return (x,y)
r = (5,1)
for i in range(1,20):
print i,':',r
r = add(2,17,r,(5,1))
但是输出是:
- : (5, 1)
- : (6, 3)
- : (10, 6)
- : (3, 1)
- : (9, 16)
- : (12, 9)
- : (1, 2)
- : (12, 9)
- : (1, 2)
- : (12, 9)
- : (1, 2)
- : (12, 9)
- : (1, 2)
- : (12, 9)
- : (1, 2)
- : (12, 9)
- : (1, 2)
- : (12, 9)
- : (1, 2)
如您所见,它遵循预期结果直到 6p,然后进入长度为 2 的循环。我已经盯着这个看了好几个小时了,我仍然不知道为什么它不起作用(毕竟:多难可以是...它是30行python)。