20212312 2022-2023-2 《Python程序设计》实验3报告

20212312应万里 2024-04-24 11:01:50

20212312 2022-2023-2 《Python程序设计》实验3报告

课程:《Python程序设计》
班级: 2123
姓名: 应万里
学号:20212312
实验教师:王志强
实验日期:2020年X月X日
必修/选修: 公选课

1.实验内容

创建服务端和客户端,服务端在特定端口监听多个客户请求。客户端和服务端通过Socket套接字(TCP/UDP)进行通信。
(1)创建服务端和客户端,选择一个通信端口,用Python语言编程实现通信演示程序;

(2)要求包含文件的基本操作,例如打开和读写操作。

(3)要求发送方从文件读取内容,加密后并传输;接收方收到密文并解密,保存在文件中。

(4)程序代码托管到码云。

2. 实验过程及结果

2.1编写服务端代码

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'。最后,服务器关闭与该客户端的连接,等待下一个客户端连接。

2.2编写客户端代码

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加密后传输到指定的服务器。

2.3运行结果

服务端:

img


客户端:

img


整个加密通信过程:

2.4代码托管到码云

server.py和newclient.py

3. 实验过程中遇到的问题和解决过程

  • 问题1:没有问题哈哈哈哈哈哈
  • 问题1解决方案:这个socket是我上学期网编的实验二,我正巧就是用python编写的,于是乎刚好用上哈哈哈哈,这就是缘分呐~~~

其他(感悟、思考等)

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

参考资料

...全文
98 回复 打赏 收藏 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

110

社区成员

发帖
与我相关
我的任务
社区描述
人生苦短,我用Python!
python3.11 高校
社区管理员
  • blackwall0321
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧