在以上通信程序实现基础上为两个客户端添加秘钥协商及对称加密部件,邀请参与通信双方除实现双工通信外,还需要在通信开始前完成身份认证、秘钥协商,且通信内容必须使用对称秘钥加密算法加密后传输。

时间: 2024-02-28 15:53:07 浏览: 14
好的,以下是一个添加了秘钥协商和对称加密部件的Python代码示例: ```python import socket import hashlib from Crypto.Cipher import AES # 创建一个套接字对象 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 获取本地IP地址 local_ip = socket.gethostbyname(socket.gethostname()) # 设置端口号 port = 8888 # 绑定IP地址和端口号 sock.bind((local_ip, port)) # 监听客户端请求 sock.listen() print(f"Listening on {local_ip}:{port}") # 等待客户端1连接 client1_sock, client1_address = sock.accept() print(f"Accepted connection from {client1_address}") # 发送公钥给客户端1 public_key = "12345" # 公钥 client1_sock.send(public_key.encode()) # 等待客户端2连接 client2_sock, client2_address = sock.accept() print(f"Accepted connection from {client2_address}") # 发送公钥给客户端2 client2_sock.send(public_key.encode()) # 接收客户端1的密钥 key1 = client1_sock.recv(1024).decode() # 发送密钥给客户端2 client2_sock.send(key1.encode()) # 接收客户端2的密钥 key2 = client2_sock.recv(1024).decode() # 发送密钥给客户端1 client1_sock.send(key2.encode()) # 对称加密算法 def encrypt(key, message): cipher = AES.new(key, AES.MODE_EAX) ciphertext, tag = cipher.encrypt_and_digest(message.encode()) return ciphertext, cipher.nonce, tag # 对称解密算法 def decrypt(key, nonce, ciphertext, tag): cipher = AES.new(key, AES.MODE_EAX, nonce=nonce) plaintext = cipher.decrypt(ciphertext) try: cipher.verify(tag) except ValueError: print("Message authentication failed") return None return plaintext.decode() # 生成密钥 def generate_key(secret): return hashlib.sha256(secret.encode()).digest() while True: # 接收客户端1发来的消息 ciphertext = client1_sock.recv(1024) nonce = client1_sock.recv(16) tag = client1_sock.recv(16) # 解密消息 message = decrypt(generate_key(key1), nonce, ciphertext, tag) if not message: break print(f"Received message from client 1: {message}") # 发送消息给客户端2 message = input("Enter message to send to client 2: ") ciphertext, nonce, tag = encrypt(generate_key(key2), message) client2_sock.send(ciphertext) client2_sock.send(nonce) client2_sock.send(tag) # 接收客户端2发来的消息 ciphertext = client2_sock.recv(1024) nonce = client2_sock.recv(16) tag = client2_sock.recv(16) # 解密消息 message = decrypt(generate_key(key2), nonce, ciphertext, tag) if not message: break print(f"Received message from client 2: {message}") # 发送消息给客户端1 message = input("Enter message to send to client 1: ") ciphertext, nonce, tag = encrypt(generate_key(key1), message) client1_sock.send(ciphertext) client1_sock.send(nonce) client1_sock.send(tag) # 关闭套接字 client1_sock.close() client2_sock.close() sock.close() ``` 在这个示例中,我们首先向两个客户端发送公钥。然后我们等待客户端1发送密钥,将其发送给客户端2,并等待客户端2发送密钥,将其发送给客户端1。这样,双方就完成了秘钥协商。 接下来我们使用一个对称加密算法对通信内容进行加密和解密。这里我们使用了AES算法,我们使用一个密码字符串生成一个密钥,然后使用该密钥对通信内容进行加密和解密。 在每次接收到消息时,我们首先对其进行解密,然后再打印出来。然后我们要求用户输入要发送给对方的消息,并将其加密后发送给对方。 请注意,这只是一个简单的示例,用于演示如何实现秘钥协商和对称加密。在实际应用中,需要使用更安全的加密算法和更复杂的协商过程来确保通信的安全。

相关推荐

最新推荐

recommend-type

C#实现简单的RSA非对称加密算法示例

主要介绍了C#实现简单的RSA非对称加密算法,结合实例形式分析了C#实现RSA加密的具体步骤与相关操作技巧,需要的朋友可以参考下
recommend-type

Java实现的对称加密算法AES定义与用法详解

主要介绍了Java实现的对称加密算法AES,结合实例形式分析了对称加密算法AES的定义、特点、用法及使用场景,需要的朋友可以参考下
recommend-type

vue项目中使用AES实现密码加密解密(ECB和CBC两种模式)

主要介绍了vue项目中使用AES实现密码加密解密的方法,主要是通过ecb和cbc两种模式,本文通过实例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
recommend-type

Java实现url加密处理的方法示例

主要介绍了Java实现url加密处理的方法,涉及java基于base64、编码转换实现加密解密相关操作技巧,需要的朋友可以参考下
recommend-type

SQLSERVER加密解密函数(非对称密钥 证书加密 对称密钥)使用方法代码

主要介绍了SQLSERVER加密解密函数使用方法,使用了非对称密钥、证书加密、对称密钥、通行短语(PassPhrase)加密,大家参考使用吧
recommend-type

zigbee-cluster-library-specification

最新的zigbee-cluster-library-specification说明文档。
recommend-type

管理建模和仿真的文件

管理Boualem Benatallah引用此版本:布阿利姆·贝纳塔拉。管理建模和仿真。约瑟夫-傅立叶大学-格勒诺布尔第一大学,1996年。法语。NNT:电话:00345357HAL ID:电话:00345357https://theses.hal.science/tel-003453572008年12月9日提交HAL是一个多学科的开放存取档案馆,用于存放和传播科学研究论文,无论它们是否被公开。论文可以来自法国或国外的教学和研究机构,也可以来自公共或私人研究中心。L’archive ouverte pluridisciplinaire
recommend-type

实现实时数据湖架构:Kafka与Hive集成

![实现实时数据湖架构:Kafka与Hive集成](https://img-blog.csdnimg.cn/img_convert/10eb2e6972b3b6086286fc64c0b3ee41.jpeg) # 1. 实时数据湖架构概述** 实时数据湖是一种现代数据管理架构,它允许企业以低延迟的方式收集、存储和处理大量数据。与传统数据仓库不同,实时数据湖不依赖于预先定义的模式,而是采用灵活的架构,可以处理各种数据类型和格式。这种架构为企业提供了以下优势: - **实时洞察:**实时数据湖允许企业访问最新的数据,从而做出更明智的决策。 - **数据民主化:**实时数据湖使各种利益相关者都可
recommend-type

list根据id查询pid 然后依次获取到所有的子节点数据

可以使用递归的方式来实现根据id查询pid并获取所有子节点数据。具体实现可以参考以下代码: ``` def get_children_nodes(nodes, parent_id): children = [] for node in nodes: if node['pid'] == parent_id: node['children'] = get_children_nodes(nodes, node['id']) children.append(node) return children # 测试数
recommend-type

JSBSim Reference Manual

JSBSim参考手册,其中包含JSBSim简介,JSBSim配置文件xml的编写语法,编程手册以及一些应用实例等。其中有部分内容还没有写完,估计有生之年很难看到完整版了,但是内容还是很有参考价值的。