00 前情提要
最近处于期末复习阶段,对于现代密码学这门学科来说,计算椭圆曲线加密的时候肯定得进行点乘运算。而这点乘运算呢,其实说难也不难,就是系数较大的时候,计算量比较大,得细心点。
而为方便检验自己的笔算结果呢,这里使用一个简单的python程序验证生点乘运算结果的正确性。
01 实现背景
02 实现源码
def ny(e
,z
):
k
=1
e
=e
%z
while((k
*z
+1)%e
!=0):
k
=k
+1
d
=int((k
*z
+1)/e
)
return d
def myfmod(a
,b
,c
):
a
=a
%c
d
=(a
*ny
(b
,c
))%c
return d
def muchG(x
,y
,p
,a
):
if (3*pow(x
,2)+a
)%(2*y
)==0:
L
=((3*pow(x
,2)+a
)/(2*y
))%p
else:
L
=myfmod
(3*pow(x
,2)+a
,2*y
,p
)
print("斜率L=%d"% L
)
x3
= (pow(L
,2)-2*x
)%p
y3
= (L
*(x
-x3
)-y
)%p
return x3
,y3
def diffG(x1
,y1
,x2
,y2
,p
):
if (y2
-y1
)%(x2
-x1
)==0:
L
=((y2
-y1
)/(x2
-x1
))%p
else:
L
=myfmod
((y2
-y1
),(x2
-x1
),p
)
print("斜率L=%d"% L
)
x3
=(pow(L
,2)-x1
-x2
)%p
y3
=(L
*(x1
-x3
)-y1
)%p
return x3
,y3
def tongG():
a
=int(input("请输入椭圆曲线的a:"))
b
=int(input("请输入椭圆曲线的b:"))
p
=int(input("请输入模数p:"))
x
=int(input("请输入生成元G的x坐标:"))
y
=int(input("请输入生成元G的y坐标:"))
x3
,y3
=muchG
(x
,y
,p
,a
)
print("2G=(%d,%d)" % (x3
,y3
))
f
=input("按任意键继续")
def yiG():
p
=int(input("请输入模数p:"))
x1
=int(input("请输入P的x坐标:"))
y1
=int(input("请输入P的y坐标:"))
x2
=int(input("请输入Q的x坐标:"))
y2
=int(input("请输入Q的y坐标:"))
x3
,y3
=diffG
(x1
,y1
,x2
,y2
,p
)
print("P+Q=(%d,%d)" % (x3
,y3
))
f
=input("按任意键继续")
flag
=1
while(flag
!=0):
print("1.同G")
print("2.求异G")
print("0.退出")
flag
=int(input("请选择:"))
if flag
==1:
tongG
()
elif flag
==2:
yiG
()
03 实现效果
通过以上描述,我们得知 p = 11, a = 1 , b = 6 ,x = 2 ,y =7 ,m = 7 ,现在已确认点乘运算 2(2,7)=(5,2),那么下面我们来验证python小程序的正确性。 验证成功~~~