Diffie-Hellman
关于这两位闻名世界的靓仔,相信各位并不陌生,资料和他俩的贡献都不少
DH-度娘版
算法描述
假设用户A和B希望交换一个密钥,用户A选择一个作为私有密钥的随机数XA(XA<q),并计算公开密钥YA=a^XA mod q。A对XA的值保密存放而使YA能被B公开获得。类似地,用户B选择一个私有的随机数XB<q,并计算公开密钥YB=a^XB mod q。B对XB的值保密存放而使YB能被A公开获得。
看完感觉懵懵的
例子
——来自度娘的例子
密钥交换基于素数q = 97和97的一个原根a = 5
A和B分别选择私有密钥XA = 36和XB = 58
每人计算其公开密钥 YA = 5^36 = 50 mod 97 YB = 5^58 = 44 mod 97 在他们相互获取了公开密钥之后,各自通过计算得到双方共享的秘密密钥如下:
K = (YB)^XA mod 97 = 44^36 = 75 mod 97 K = (YA)^XB mod 97 = 50^58 = 75 mod 97
但是从50,44出发,攻击者要计算出75很不容易
啊……其实就是攻击者想要拿到密钥就要解决像a的多少次方在模p的情况下等于b的离散对数问题
声明
本文所使用的自定义函数均在之前发的我的prime.py(某篇不起眼的文章)中
算法实现
import prime
import random
p=prime.safe_length(100)
print('p='+str(p))
g=prime.safe_root(p)
print('g='+str(g))
x=random.randint(1, p)
print('A的私钥x:'+str(x))
gx=pow(g,x,p)
print('发送给B:'+str(gx))
y=random.randint(1, p)
print('B的私钥y:'+str(y))
gy=pow(g,y,p)
print('发送给A:'+str(gy))
ka=pow(gy,x,p)
print('A的会话密钥:'+str(ka))
kb=pow(gx,y,p)
print('B的会话密钥:'+str(kb))