20242129《Python程序设计》实验三报告

20242129 2024-2025-2 《Python程序设计》实验三报告

课程:《Python程序设计》
班级: 2421
姓名: 史若晨
学号:20242129
实验教师:王志强
实验日期:2025年4月16日
必修/选修:公选课

1. 实验内容

  • 创建服务端和客户端,服务端在特定端口监听多个客户请求。客户端和服务端通过Socket套接字(TCP/UDP)进行通信

2. 实验要求

  • 创建服务端和客户端,选择一个通信端口,用Python语言编程实现通信演示程序
  • 要求包含文件的基本操作,例如打开和读写操作
  • 要求发送方从文件读取内容,加密后并传输;接收方收到密文并解密,保存在文件中
  • 程序代码托管到码云

3. 实验过程及结果

1. 实验代码

客户端

#通过Socket套接字进行通信
import socket
#新建客户端socket
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
#连接
client_socket.connect(('192.168.43.54', 8080))
#发送数据
while True:
    client_socket.send(input("客户端说:").encode())
    data = client_socket.recv(1024)
    print("服务端回答:{}".format(data.decode('utf-8')))
client_socket.close()
#通过socket和aes加密传输加密文件
import socket
from Crypto.Cipher import AES
from Crypto.Util.Padding import pad
# 加密密钥,必须是16、24或32字节
key = b'2cbed40efc5cd05b5eddd706d0e1265f'
# 初始化向量,必须是16字节
iv = bytes.fromhex('2cbed40efc5cd05b5eddd706d0e1265f')
def encrypt_message(message):
    cipher = AES.new(key, AES.MODE_CBC, iv)
    encrypted = cipher.encrypt(pad(message.encode('utf-8'), AES.block_size))
    return iv + encrypted
# 创建客户端 Socket
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client_socket.connect(('192.168.43.54', 8080))
# 固定文件路径
file_path = r'D:\code\python\file.txt'
try:
    # 读取文件内容
    with open(file_path, 'r', encoding='utf-8') as file:
        file_content = file.read()
    # 加密文件内容
    encrypted_content = encrypt_message(file_content)
    # 发送加密数据
    client_socket.send(encrypted_content)
    print("文件内容已加密并发送。")
except FileNotFoundError:
    print("文件未找到,请检查路径。")
except Exception as e:
    print(f"发生错误: {e}")
finally:
    client_socket.close()

服务端

#通过Socket套接字进行通信
import socket
#新建服务端socket
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
address = ('192.168.43.34', 8080)
#绑定
server_socket.bind(address)
#监听
server_socket.listen(5)
print("开始监听....",address)
#accept
client_socket, client_address = server_socket.accept()
print("我们收到{}的连接".format(address))
while True:
    data = client_socket.recv(1024)
    if not data:
        break
    print("客户端说:{}".format(data.decode('utf-8')))
    client_socket.send(input("服务器回应:").encode())
#关闭
client_socket.close()
#收到加密文件读取并解密文件
import socket
import os
from Crypto.Cipher import AES
from Crypto.Util.Padding import unpad
# 加密密钥,必须是16、24或32字节
key = b'2cbed40efc5cd05b5eddd706d0e1265f'
# 初始化向量,必须是16字节
iv = bytes.fromhex('2cbed40efc5cd05b5eddd706d0e1265f')
def decrypt_message(encrypted_message):
    cipher = AES.new(key, AES.MODE_CBC, iv)
    decrypted = unpad(cipher.decrypt(encrypted_message), AES.block_size)
    return decrypted.decode('utf-8')
# 创建服务端 Socket
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
address = ('192.168.43.34', 8080)
server_socket.bind(address)
server_socket.listen(5)
print("服务端开始监听....", address)
# 接收客户端连接
client_socket, client_address = server_socket.accept()
print("收到来自 {} 的连接".format(client_address))
try:
    # 接收加密数据
    encrypted_data = client_socket.recv(4096)
    if encrypted_data:
        # 解密数据
        decrypted_data = decrypt_message(encrypted_data[16:])  # 跳过前16字节的IV
        print("解密后的文件内容: {}".format(decrypted_data))
    else:
        print("未收到数据。")
except Exception as e:
    print(f"发生错误: {e}")
finally:
    client_socket.close()
    server_socket.close()

2. 实验结果





3. 代码托管到码云

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

  • 问题1:监听的ip错误
  • 问题1解决方案:终端管理员输入ipconfig查看
  • 问题2:客户端报错iv不是十六字节
  • 问题2解决方案:将十六进制字符串转换为二进制数据

其他(感悟、思考等)

两端的key和iv必须相同才可正确运行,不可都使用随机密钥,这样key对不上

参考资料

posted @ 2025-04-20 11:04  St0ry  阅读(36)  评论(0)    收藏  举报