我正在阅读有关Christoffer Paares一书(“Understanding Cryptography”)中有关椭圆曲线密码的章节。我决定我将实现一个椭圆曲线点加法和python点加倍的函数。对于我的测试,我使用了本书中的示例,以便测试结果。ECC - 无法生成整个循环组
在例子中使用的曲线为:y^2 = X^3 + 2X + 2模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)
10便士=(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中)。这是有意的,因为算法决定它或者它可能是错误所在? –
不应该需要浮点操作。一般来说,你永远不会在加密中使用浮点数。 – Cshark