Python:在Hessian曲线实现中,点的顺序是不规则的

Python:在Hessian曲线实现中,点的顺序是不规则的,python,elliptic-curve,Python,Elliptic Curve,我已经用Python实现了Hessian曲线 def检查点(P、P、c、d): #X^3+Y^3+cZ^3=dXYZ/GF(p) 如果(P[0]**3+P[1]**3+c*P[2]**3)%P==(d*P[0]*P[1]*P[2])%P: 返回真值 返回错误 def位(n): 而n: 收益率n&1 n>>=1 def点_添加(P、Q、P): 如果P为无或Q为无:#检查零点 返回P或Q #12M+3add,与1986年Chudnovsky/Chudnovsky规定的“12次乘法”一致: X3=Q[

我已经用Python实现了Hessian曲线

def检查点(P、P、c、d):
#X^3+Y^3+cZ^3=dXYZ/GF(p)
如果(P[0]**3+P[1]**3+c*P[2]**3)%P==(d*P[0]*P[1]*P[2])%P:
返回真值
返回错误
def位(n):
而n:
收益率n&1
n>>=1
def点_添加(P、Q、P):
如果P为无或Q为无:#检查零点
返回P或Q
#12M+3add,与1986年Chudnovsky/Chudnovsky规定的“12次乘法”一致:
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
回报率(X3%p、Y3%p、Z3%p)
def point_double(P,P,c):#6M+3S+3add,与1986年丘德诺夫斯基/丘德诺夫斯基所述的“9次乘法”一致:
如果P为无:
一无所获
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)
回报率(X3%p、Y3%p、Z3%p)
def双重添加(G、k、p、c):
加数=G
结果=无
对于位(k)中的b:
如果b:
结果=点加(结果,加数,p)
加数=点双(加数,p,c)
返回结果
def查找器(P、POI、P、c):
对于范围内的i(21104601):#1104601点数的上限范围
res=双重ANDADD(P,i,P,c)
如果res==POI:
打印(“[”,i,“]”,P,“=”,res)
p=1051
c=1
d=6
G=(4,2,6)#基点
Pinfinity=(11050,0)#(1,-1,0)O本身的逆,(U,V,W)的逆是(V,U,W)
打印(“d^3==27c?预期为假:”,(d**3)%p==(27*c)%p)
打印(“点在曲线上吗?”,检查点(G、p、c、d))
findOrder(G,pinfinitity,p,c)
当我运行这段代码时,结果是

[ 77400 ] (4, 2, 6) =  (1, 1050, 0)
[ 103500 ] (4, 2, 6) =  (1, 1050, 0)
[ 153540 ] (4, 2, 6) =  (1, 1050, 0)
[ 164340 ] (4, 2, 6) =  (1, 1050, 0)
[ 169290 ] (4, 2, 6) =  (1, 1050, 0)
[ 233640 ] (4, 2, 6) =  (1, 1050, 0)
通常,如果点
p
具有顺序
k
,则
[k]p=O
,其中
O
是无穷远处的点。如果你继续给自己加P,你会得到
[2k]P=O
,更普遍的是
[x mod k]P

因此,如果77400是
p
的顺序,那么
[154800]p=0
,但它不是

  • 这里缺少什么,导致结果与预期值不一致

注意:
c=1
无效。只有当
c>1

我已经解决了问题时,它才有助于
双点
,而真正的解决方案并不容易。点
(4,2,6)
的顺序为
77400

这个问题依赖于
double和add
算法的实现。以“代码> g < /代码>考虑起始点。在点
G
的开始和第二次就诊期间,变量
加数
结果
不相同,因为
加数
已更新

def-doubleAndAdd(G,k,p,c):
加数=G
结果=无
对于位(k)中的b:
如果b:
结果=点加(结果,加数,p)
加数=点双(加数,p,c)
返回结果
相反,我更新了
findOrder

def查找器(P、POI、P、c):
#对于范围内的i(21104601):#1104601点数的上限范围
对于范围内的i(1104601):
Gprime=doubleandad(G,i,p,c)
如果Gprime==POI:
打印(i,“,Gprime)
返回i
因此,它返回无穷远处点的第一次命中,作为点的顺序

真正的解决方案需要事先确定基点的阶数,或者更好地找到基准点,因为任何元素的阶数都比曲线的阶数低一倍。一旦找到它,我们就可以使用
double和add
中的公式
[x mod k]P

注意:存在计算点数的方法,但是,需要将投影坐标更改为仿射坐标。Marc JoyeJean和Jacques Quisquater在