110
社区成员
发帖
与我相关
我的任务
分享课程:《Python程序设计》
班级: 2123
姓名: 应万里
学号:20212312
实验教师:王志强
实验日期:2020年X月X日
必修/选修: 公选课
创建服务端和客户端,服务端在特定端口监听多个客户请求。客户端和服务端通过Socket套接字(TCP/UDP)进行通信。
(1)创建服务端和客户端,选择一个通信端口,用Python语言编程实现通信演示程序;
(2)要求包含文件的基本操作,例如打开和读写操作。
(3)要求发送方从文件读取内容,加密后并传输;接收方收到密文并解密,保存在文件中。
(4)程序代码托管到码云。
import socket
from Crypto.Cipher import AES
# 创建 socket 对象
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 获取本地主机名和端口
host = '127.0.0.1'
port = 12345
# 绑定端口
server_socket.bind((host, port))
# 设置最大连接数,超过后排队
server_socket.listen(5)
while True:
# 建立客户端连接
client_socket, addr = server_socket.accept()
print('连接地址:', addr)
# 接收加密后的文件数据和nonce
ciphertext = client_socket.recv(1024)
tag = client_socket.recv(16)
nonce = client_socket.recv(16)
key = b'Sixteen byte key' # 16字节的密钥
# 使用密钥解密文件数据
cipher = AES.new(key, AES.MODE_EAX, nonce=nonce)
decrypted_data = cipher.decrypt_and_verify(ciphertext, tag)
# 将解密后的数据保存为文件
with open('received.txt', 'wb') as file:
file.write(decrypted_data)
print('文件接收并解密完成!')
client_socket.close()
当客户端与服务器建立连接后,服务器等待接收来自客户端的加密文件数据、认证标签(tag)和nonce。接收到这些数据后,服务器使用预先共享的密钥和nonce来解密文件数据。解密后的数据被保存到服务器的文件系统中,通常命名为'received.txt'。最后,服务器关闭与该客户端的连接,等待下一个客户端连接。
import tkinter as tk
from tkinter import filedialog
import socket
from Crypto.Cipher import AES
import time # 导入time模块
# 创建 socket 对象
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 连接服务,指定主机和端口
host = '127.0.0.1'
port = 12345
client_socket.connect((host, port))
# 使用AES加密算法定义了一个encrypt_file函数。该函数接受文件路径和加密密钥作为输入,读取文件内容,然后返回加密后的数据、加密标签和随机数(nonce)。
def encrypt_file(file_path, key):
cipher = AES.new(key, AES.MODE_EAX)
with open(file_path, 'rb') as file:
data = file.read()
ciphertext, tag = cipher.encrypt_and_digest(data)
return ciphertext, tag, cipher.nonce
# 选择文件并触发加密传输操作
def choose_file_and_send():
file_path = filedialog.askopenfilename() # 弹出文件选择对话框
key = b'Sixteen byte key' # 16字节的密钥
ciphertext, tag, nonce = encrypt_file(file_path, key)
start_time = time.perf_counter() # 开始传输的时间
client_socket.send(ciphertext)
client_socket.send(tag)
client_socket.send(nonce)
end_time = time.perf_counter() # 结束传输的时间
print(f"传输耗时:{end_time - start_time}秒")
client_socket.close()
# 创建GUI应用程序窗口
root = tk.Tk()
root.title("加密文件传输")
# 添加按钮用于选择文件并触发加密传输操作
select_button = tk.Button(root, text="选择文件并传输", command=choose_file_and_send)
select_button.pack(pady=20)
# 运行应用程序
root.mainloop()
我写了一个基于Tkinter的简单GUI应用程序,用于选择文件并将其aes加密后传输到指定的服务器。
服务端:


通过这次python实验和之前的网编,我深刻领悟到了Python的强大之处。Python以其简洁、优雅的语法和丰富的库而闻名,这使得我能够以一种相对轻松的方式实现复杂的功能。例如,在我的应用程序中,使用了Tkinter库创建了一个GUI界面,这让用户能够方便地选择文件并触发加密传输操作。同时,利用Crypto库中的AES模块,我能够轻松地对文件内容进行加密,确保数据传输的安全性。之前孙以诺在上学期还得自己编写Java的aes加解密算法,搞得他焦头烂额,而我只要import一下就好哈哈哈哈哈~