在两个主机之间进行TCP传输及加解密的实现代码
时间: 2024-06-09 08:05:39 浏览: 16
这是一个基于Python的简单实现,用于两个主机之间进行TCP传输及加解密:
```python
# 导入必要的库
import socket
import ssl
import hashlib
# 设置参数
HOST = 'localhost' # 定义服务器IP地址
PORT = 8080 # 定义服务器端口
BUFFER_SIZE = 1024 # 定义缓冲区大小
KEY = 'mysecretkey' # 定义密钥,用于加密和解密数据
# 创建SSL上下文
context = ssl.SSLContext(ssl.PROTOCOL_TLS_SERVER)
context.load_cert_chain(certfile="server.crt", keyfile="server.key")
# 创建TCP服务器套接字,并绑定IP地址和端口
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((HOST, PORT))
s.listen(1)
# 等待客户端连接
print('等待客户端连接...')
conn, addr = s.accept()
# 创建SSL握手
ssl_conn = context.wrap_socket(conn, server_side=True)
# 接收客户端发送的数据,并解密
while True:
data = ssl_conn.recv(BUFFER_SIZE)
if not data:
break
# 解密数据
decrypted_data = decrypt_data(data, KEY)
print('接收到客户端数据:', decrypted_data)
# 将数据加密后发送到客户端
encrypted_data = encrypt_data(decrypted_data.upper(), KEY)
ssl_conn.send(encrypted_data)
# 关闭连接
ssl_conn.close()
s.close()
# 加密数据
def encrypt_data(data, key):
sha = hashlib.sha256()
sha.update(key.encode('utf-8'))
aes_key = sha.digest()[:16]
iv = b'0123456789abcdef'
cipher = AES.new(aes_key, AES.MODE_CFB, iv)
encrypted_data = cipher.encrypt(data)
return encrypted_data
# 解密数据
def decrypt_data(encrypted_data, key):
sha = hashlib.sha256()
sha.update(key.encode('utf-8'))
aes_key = sha.digest()[:16]
iv = b'0123456789abcdef'
cipher = AES.new(aes_key, AES.MODE_CFB, iv)
decrypted_data = cipher.decrypt(encrypted_data)
return decrypted_data.decode('utf-8')
```
上述代码中,我们使用了Python的socket和ssl库,用于创建TCP服务器套接字和SSL握手。我们还使用了hashlib和AES库,用于加密和解密数据。
在代码中,我们首先定义了服务器的IP地址、端口和数据缓冲区大小。接下来,我们创建了SSL上下文,并使用SSL证书和密钥来验证服务器的身份和加密通信。然后,我们创建了TCP服务器套接字,并绑定IP地址和端口。接着,我们等待客户端连接,并使用SSL握手来建立加密通信。一旦连接建立,我们就可以接收客户端发送的数据,并解密。然后,我们将数据转换为大写字母,并使用相同的密钥加密数据,然后将其发送回客户端。最后,我们关闭连接。
在代码中,我们还定义了两个函数encrypt_data和decrypt_data,用于加密和解密数据。在这些函数中,我们使用SHA-256哈希函数来生成16字节的AES密钥,并使用AES-128算法来加密和解密数据。我们还使用一个固定的初始向量(IV)来确保每个加密操作生成的密文都是唯一的。
请注意,这只是一个简单的示例,并且在生产环境中可能需要更复杂的加密和认证方案。此外,还需要考虑如何保护密钥和SSL证书,以及如何处理错误和异常情况。