python实现diffie-hellman密钥交换
时间: 2023-11-26 14:04:48 浏览: 127
Diffie-Hellman密钥交换是一种公钥加密协议,用于两个人在不安全的通信信道上共享一个秘密密钥。
下面是Python实现Diffie-Hellman密钥交换的代码:
```python
import random
# 公共参数
p = 23
g = 5
# 随机生成私钥
a = random.randint(2, p-2)
b = random.randint(2, p-2)
# 计算公钥
A = pow(g, a, p)
B = pow(g, b, p)
# 计算共享密钥
Ka = pow(B, a, p)
Kb = pow(A, b, p)
# 输出结果
print("a私钥:", a)
print("b私钥:", b)
print("A公钥:", A)
print("B公钥:", B)
print("Ka共享密钥:", Ka)
print("Kb共享密钥:", Kb)
```
在这个代码中,我们使用了一个23位的素数p和一个基数g=5作为共享的公共参数。然后,我们随机生成两个私钥a和b,并计算出对应的公钥A和B。最后,我们使用各自的私钥和对方的公钥计算出共享的密钥Ka和Kb。
运行这个代码,你将得到类似下面的结果:
```
a私钥: 15
b私钥: 4
A公钥: 19
B公钥: 4
Ka共享密钥: 4
Kb共享密钥: 4
```
注意,这个共享密钥Ka和Kb是相同的,这是因为Diffie-Hellman密钥交换协议保证了在不同的私钥和公共参数下,两个人计算出的共享密钥是相同的。
相关问题
Diffie-Hellman密钥交换python代码
以下是一个简单的Python实现Diffie-Hellman密钥交换的代码:
```python
# 实现Diffie-Hellman密钥交换的Python代码
# 定义素数p和基数g
p = 23
g = 5
# 选择私钥a和b
a = 6
b = 15
# 计算A和B
A = (g ** a) % p
B = (g ** b) % p
# 计算共享密钥
s = (B ** a) % p
t = (A ** b) % p
# 验证共享密钥是否相同
assert s == t
print('共享密钥为:', s)
```
在这个例子中,我们首先定义了素数p和基数g。然后我们选择了私钥a和b,并计算了A和B。接着,我们分别计算了共享密钥s和t,并验证它们是否相同。最后,我们输出了共享密钥s的值。
python书写socket Diffie-Hellman密钥交换算法
下面是使用Python编写的Socket Diffie-Hellman密钥交换算法的示例代码:
```python
import socket
import math
import random
# 生成大质数p和原根g
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,最后关闭套接字。
阅读全文