Python——驗證橢圓曲線加密點乘運算

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): #同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()




03 實現效果

在這裏插入圖片描述
通過以上描述,我們得知 p = 11, a = 1 , b = 6 ,x = 2 ,y =7 ,m = 7 ,現在已確認點乘運算 2(2,7)=(5,2),那麼下面我們來驗證python小程序的正確性。

在這裏插入圖片描述
驗證成功~~~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章