赞
踩
最近处于期末复习阶段,对于现代密码学这门学科来说,计算椭圆曲线加密的时候肯定得进行点乘运算。而这点乘运算呢,其实说难也不难,就是系数较大的时候,计算量比较大,得细心点。
而为方便检验自己的笔算结果呢,这里使用一个简单的python程序验证生点乘运算结果的正确性。
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): #同G 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): #异G 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()
通过以上描述,我们得知 p = 11, a = 1 , b = 6 ,x = 2 ,y =7 ,m = 7 ,现在已确认点乘运算 2(2,7)=(5,2),那么下面我们来验证python小程序的正确性。
验证成功~~~
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。