1. 程式人生 > 其它 >DH演算法python實現

DH演算法python實現

DH演算法是非對稱金鑰演算法,這個演算法只能用於金鑰的交換,不能用於金鑰的加解密;它能夠在雙方不傳遞私鑰的情況下,獲得一個共享金鑰,且第三方就算擷取資料包,也很難破解出共享金鑰,這涉及離散對數問題,請讀者自行百度。

程式碼如下:

# 初始化資料
p = 19
a = 2
XA = 5
XB = 7

# 該函式是用來求模的,函式功能是a的x次方對p求模,因為當x很大的時候
# 可能會造成記憶體溢位問題,所以每次選取一個步長step,求a的step次方對p求模,所有的step總和等於x
def calcu_model(a, x, p, step):
    y = 1
    while(x>0):
        # 當x < step時候,說明已經到了最後一次迴圈過程了,所有要在此處將step修改為剩餘值
        if x < step:
            temp = pow(a, x, p)
            y = y * temp
            y = y % p
            break
        y = y * pow(a, step, p)
        y = y % p
        x = x - step
    return y

def calcu_dh(p, a, XA, XB, step):
    """

    :param p: p是一個素數,一般而言P很大
    :param a: a是一個任意數
    :param XA: XA是A的私鑰
    :param XB: XB是B的私鑰
    :param step: 一個步長,任意int值,避免記憶體溢位
    :return: 返回一個元組,格式是(A的公開金鑰,B的公開金鑰,A和B的共享金鑰)
    """

    YA = calcu_model(a, XA, p, step)
    YB = calcu_model(a, XB, p, step)
    print("A使用者的公開金鑰為:{0}".format(YA))
    print("B使用者的公開金鑰為:{0}".format(YB))

    KA = calcu_model(YB, XA, p, step)
    KB = calcu_model(YA, XB, p, step)
    if KA == KB:
        print("共享金鑰為{0}".format(KA))
        return (YA, YB, KA)


calcu_dh(p, a, XA, XB, 2)