DH算法python 原理说明和演示

import gmpy2

p = 17
g = 3

x_a = 15
x_b = 13

# y_a = a_g ^ x_a mod a_p
y_a = 6
# y_a = a_g ^ b_x mod a_p
y_b = 12

# a
# y_s = y_b ^ x_a mod a_p
# y_s = 12 ^ 15 mod 17

# b
# y_s = ya ^ x_b mod a_p
# y_s = 6 ^ 12 mod 17

if __name__ == '__main__':
    # step 0
    print(f'step 0 通讯双方 A、B')

    # step 1
    print(f'step 1 A 发起通讯')
    a_p = 17
    a_g = 3
    print(f'    首先公开质数(越大越好)P :{p}')
    print(f'    随机选取原根G (验证是否g真的是模p的原根,a必须和p互素例如 g^x ≡ a (mod p) =>g:{g}')
    print(f'    公开(p,g) => ({p},{g})')

    # step 2
    print(f'step 2 B 收到公开(p,g) 随机一个数字')
    x_a = 15
    x_b = 13
    print(f'    B 随机数 x_b 私密保存 :{x_b}')
    print(f'    A 随机数 x_a 私密保存 :{x_a}')
    print(f'    A、B 随机数 (x_a,x_b) 私密保存 :({x_a},{x_b})')

    # step 3
    y_a = pow(g, x_a, p)
    y_b = pow(g, x_b, p)
    print(f'step 3 A、B交换欧拉函数 g ^ x mod p')
    print(f'    B 交换值 g ^ x_b mod p  =>  {g} ^ {x_b} mod {p} => {y_b}')
    print(f'    A 交换值 g ^ x_a mod p  =>   {g} ^ {x_b} mod {p} => {y_a}')
    print(f'    A、B 交换值 (y_a,y_b) 公开交换 :({y_a},{y_b})')
    print(f'    A 得到 y_b  :{y_b}')
    print(f'    B 得到 y_a  :{y_a}')
    print(f'    整协商过程完成')

    # step 4-a
    s_a = pow(y_b, x_a, p)
    print(f'step 4-a  A 得到秘钥')
    print(f'    A 公开参数有 (p,g y_a ,y_b) => ({p},{g} ,{y_a} ,{y_b})')
    print(f'    A 保密参数有 (x_a ) => ({x_a} )')
    print(f'    A 秘钥基于公开参数 y_b ^ x_a mod p  =>  {y_b} ^ {x_a} mod {p} => {s_a}')

    # step 4-b
    s_b = pow(y_a, x_b, p)
    print(f'step 4-a  B 得到秘钥')
    print(f'    B 公开参数有 (p,g y_a ,y_a) => ({p},{g} ,{y_a} ,{y_a})')
    print(f'    B 保密参数有 (x_b ) => ({x_b} )')
    print(f'    B 秘钥基于公开参数 y_a ^ x_b mod p  =>  {y_a} ^ {x_b} mod {p} => {s_a}')

    print(f'\nps: 都得到了相同的秘钥(s_a,s_b) => ({s_a},{s_b})')
    print(f'    A,B 只要不泄露随机数x ,都无法被破解,欧拉定理,模运算与指数运算之间的关系 ')

posted @ 2024-06-12 18:05  vx_guanchaoguo0  阅读(27)  评论(0编辑  收藏  举报