如何解决Python:点的顺序在Hessian Curve实现中不规则
我已经用Python实现了Hessian Curve
def checkPoint(P,p,c,d):
#X^3 + Y^3 + cZ^3 = dXYZ over GF(p)
if ( P[0]**3 + P[1]**3 + c * P[2]**3) % p == ( d * P[0] * P[1] * P[2] ) % p :
return True
return False
def bits(n):
while n:
yield n & 1
n >>= 1
def point_add( P,Q,p) :
if P is None or Q is None: # check for the zero point
return P or Q
#12M + 3add,consistent with the "12 multiplications" stated in 1986 Chudnovsky/Chudnovsky:
X3 = Q[0] * Q[2] * P[1]**2 - P[0] * P[2] * Q[1]**2
Y3 = Q[1] * Q[2] * P[0]**2 - P[1] * P[2] * Q[0]**2
Z3 = Q[0] * Q[1] * P[2]**2 - P[0] * P[1] * Q[2]**2
return ( X3 % p,Y3 % p,Z3 % p)
def point_double(P,c): #6M + 3S + 3add,consistent with the "9 multiplications" stated in 1986 Chudnovsky/Chudnovsky:
if P is None:
return None
X3 = P[1] * ( P[2]**3 - P[0]**3 )
Y3 = P[0] * ( P[1]**3 - P[2]**3 )
Z3 = P[2] * ( P[0]**3 - P[1]**3 )
return ( X3 % p,Z3 % p)
def doubleAndAdd( G,k,c):
addend = G
result = None
for b in bits(k) :
if b:
result = point_add(result,addend,p)
addend = point_double(addend,c)
return result
def findOrder(P,POI,c):
for i in range(2,1104601): # 1104601 upper range on the number of points
res = doubleAndAdd(P,i,c)
if res == POI:
print( "[","]",P,"= ",res )
p = 1051
c = 1
d = 6
G = (4,2,6) #base point
Pinfinity = (1,1050,0) #(1,-1,0) inverse of O itself,inverse of (U,V,W) is (V,U,W)
print ( "d^3 == 27c? False expected : ",(d**3) % p == (27 *c) % p)
print("is point on the curve?",checkPoint(G,d))
findOrder(G,Pinfinity,c)
当我运行这段代码时,结果是
[ 77400 ] (4,6) = (1,0)
[ 103500 ] (4,0)
[ 153540 ] (4,0)
[ 164340 ] (4,0)
[ 169290 ] (4,0)
[ 233640 ] (4,0)
通常,如果点P
的阶次为k
,则[k]P=O
,其中O
是无穷大的点。而且,如果您继续向其自身添加P,则将获得[2k]P=O
,更一般的是[ x mod k]P
因此,如果77400是P
的顺序,那么[154800]P=0
却不是
- 这里缺少什么,以致结果与预期值不一致?
注释: c=1
无效。仅在point_double
c>1
有贡献解决方法
我已经解决了问题,真正的解决方案并不容易。点(4,2,6)
的顺序是77400
。
问题取决于doubleAndAdd
算法的实现。考虑以G
为起点。自addend
被更新以来,在result
的开始和第二次访问期间,变量G
和addend
是不同的。
def doubleAndAdd( G,k,p,c):
addend = G
result = None
for b in bits(k) :
if b:
result = point_add(result,addend,p)
addend = point_double(addend,c)
return result
相反,我已经更新了findOrder
def findOrder(P,POI,c):
#for i in range(2,1104601): # 1104601 upper range on the number of points
for i in range(1104601):
Gprime = doubleAndAdd(G,i,c)
if Gprime == POI:
print(i," ",Gprime)
return i
因此,它会在“无穷远点”的第一个匹配点中按点的顺序返回。
真正的解决方案需要事先确定基点的顺序,或者更好地找到order of the curve,因为任何元素的顺序都将曲线的顺序除以Lagrange Theorem。找到后,我们可以在[ x mod k]P
中使用公式doubleAndAdd
。
注意:现有Schoof's Algorithm in Python可以计算点数,但是,需要更改“射影”坐标和“仿射”坐标。 Marc JoyeJean和Jacques Quisquater提供了以下公式:
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。