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 ,都无法被破解,欧拉定理,模运算与指数运算之间的关系 ')
标签:__,演示,DH,python,pow,秘钥,step,print,mod
From: https://www.cnblogs.com/guanchaoguo/p/18244472