【发布时间】:2014-03-01 18:43:52
【问题描述】:
我正在阅读 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)。
【问题讨论】:
-
在您的实现中从来没有任何浮点或舍入,除法被截断(在 Python 2 中)。这是有意为之的,正如算法所规定的那样,还是可能是错误所在?
-
不应需要浮点运算。通常你从不在加密中使用浮点数。
标签: python math cryptography curves