首先通信双方先协商好两个公共数值,p和g,其中p是一个大素数,g是一个整数,p和g公开,即所有用户均可获取,并未所有用户共有
-
首先用户A随机生成一个大数a,
-
用户A计算K1=g^a(mod p ),并将此结果传送给用户B
-
用户B随机生成一个大数b
-
用户B计算K2=g^b(mod p),并将结果传送给用户A
-
用户计算K=(K2)^a(mod p)
-
用户B计算K = (k1)^b(mod p)
-
最终得到双方的会话密钥K
加入双方协商的p为23,g为5.
A随机选取的数为a = 6,
B随机选取的数为b = 15。
-
用户A发送给用户B的K1 = 5^6(mod 23) = 8
-
用户B发送给用户A的K2 = 5^15(mod 23) = 19
-
A计算得到的会话密钥K = 19^6(mod 23) = 2
-
B计算得到的会话密钥K = 8^15(mod 23) = 2
故最终通信双方的会话密钥为5
首先,Diffie-Hellman密钥交换算法的主要目的是为了通信双方能够生成一个共同的会话密钥过程图:原理:首先通信双方先协商好两个公共数值,p和g,其中p是一个大素数,g是一个整数,p和g公开,即所有用户均可获取,并未所有用户共有首先用户A随机生成一个大数a,用户A计算K1=g^a(mod p ),并将此结果传送给用户B用户B随机生成一个大数b用户B计算K2=g^b(mod p),并将结果传送给用户A用户计算K=(K2)^a(mod p)用户B计算K = (k1)^b(mod p)
1、
Diffie-Hellman
算法
简介
Diffie-Hellman
算法
(以下简称为:DH
算法
),是最早的
密
钥
交换
算法
之一,它使得通信的双方能在非安全的信道中安全的
交换
密
钥
,用于加
密
后续的通信消息。
起基本流程原理如下:
假定小明和小红期望在一个不安全的
网络
中协商一个共同的
密
钥
,那么进行如下步骤:
两人先说好大素数(质数)p和它的原始根g。
小明随机产生一个数a,并计算A = p^a mod g, 发送给小红。
小红随机产生一个数b,并计算......
选取两个大数p和g并公开,其中p是一个素数,g是p的一个模p本原单位根(primitive root module p),所谓本原单位根就是指在模p乘法运算下,g的1次方,2次方……(p-1)次方这p-1个数互不相同,并且取遍1到p-1;对于Alice(其中的一个通信者),随机产生一个整数a,a对外保
密
,计算Ka = g^a mod p,将Ka发送给Bob;
对于Bob(另一个通信者),随机产生一
两人首先协商确定使用有限域Zp,即确定p为多少。本例为p=2579,域中本原元是α=2;
假如现在Alice要发送信息x=1299给Bob:
1、首先Bob选择随机数a=765做为自己的私
钥
,通过私
钥
计算β=2765mod 2579=949,Bob公开他的公
钥
949给Alice。
2、Alice选择随机数K=853做为自己的私
钥
一、
Diffie-Hellman
算法
简介
Diffie-Hellman
算法
是第一个公开
密
钥
算法
,早在 1976 年就发现了。其安全性源于在有限域上计算离散对数,比计算指数更为困难。该
算法
可以使两个用户之间安全地
交换
一个
密
钥
,但不能用于加
密
或解
密
信息。
二、
Diffie-Hellman
密
钥
交换
Diffie-Hellman
密
钥
交换
方案(DHKE)提供了实际中
密
钥
分配问题的解决方案,即它允许双方通过不...
0x01 前言
picoCTF 2022的一道Cryptography题目,好评率只有25%,flag提交正确率只有9%,题目非常简单,主要是考察了
Diffie-Hellman
算法
以及变异凯撒问题,其实不需要解
Diffie-Hellman
也可以得到flag,但为了加深对
Diffie-Hellman
的理解,还是简单记录一下。
0x02 解题
Description:Alice and Bob wanted to exchange information secretly. The two of th
现在有Alice和Bob两个人要
交换
密
钥
。
① Alice选定一个小于p的数a作为Alice私
钥
,并且计算Alice的公
钥
A=g^a mod p,公开Alice的公
钥
A
② 与此同时Bob选定一个小于p的数b作为Bob私
钥
,并且计算Bob的公
钥
B=g^b mod p,公开B...
首先计算欧拉值 N=(p-1) * (q-1)=16 * 28 = 448
我们需要满足 d * e 除以 N 的余数是1
当d = 269 时,269 * 5 / 448 = 1。所以解
密
密
钥
是d = 269
例2. A和B使用
Diffie-Hellman
密
钥
交换
协议来建立一个公共
密
钥
。我们假设q=23和a=9是公开的,A选择XA=5,B选择XB=7。计算它们的公共
密
钥
。
解题步骤:
A的公
钥
是:
def generate_prime_and_primitive_root():
while True:
p = random.randint(100, 1000) # 生成随机数p
if is_prime(p):
break
for i in range(2, p):
if math.gcd(i, p-1) == 1:
g = i
return p, g
# 判断是否为质数
def is_prime(num):
if num == 2 or num == 3:
return True
if num % 2 == 0 or num < 2:
return False
for i in range(3, int(num ** 0.5) + 1, 2):
if num % i == 0:
return False
return True
#
Diffie-Hellman
密
钥
交换
def diffie_hellman(sock):
# 生成大质数p和原根g
p, g = generate_prime_and_primitive_root()
# 发送p和g给对方
sock.sendall(str(p).encode())
sock.sendall(str(g).encode())
# 生成私
钥
a并计算公
钥
A
a = random.randint(2, p-2)
A = pow(g, a, p)
# 接收对方的公
钥
B
B = int(sock.recv(1024).decode())
# 计算共享
密
钥
K = pow(B, a, p)
# 发送公
钥
A给对方
sock.sendall(str(A).encode())
return K
# 主函数
def main():
# 创建套接字并连接服务器
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
host = '127.0.0.1' # 服务器IP地址
port = 8000 # 服务器端口号
sock.connect((host, port))
#
Diffie-Hellman
密
钥
交换
K = diffie_hellman(sock)
# 输出共享
密
钥
print('共享
密
钥
K为:', K)
# 关闭套接字
sock.close()
if __name__ == '__main__':
main()
在上面的代码中,我们首先使用`generate_prime_and_primitive_root()`函数生成了大质数p和原根g,并将它们发送给对方。然后,我们生成私
钥
a并计算公
钥
A,接收对方的公
钥
B,计算共享
密
钥
K,最后将公
钥
A发送给对方。在`main()`函数中,我们创建套接字并连接服务器,执行
Diffie-Hellman
密
钥
交换
,输出共享
密
钥
K,最后关闭套接字。