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

20202216 邓童丹 2020-2021-2 《Python程序设计》实验三报告

课程:《Python程序设计》
班级: 2022
姓名: 邓童丹
学号:20202216
实验教师:王志强
实验日期:2020年5月30日
必修/选修: 公选课

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

  1. 实验过程及结果
    对文件的加密采用AES对称加密算法,需要现在cmd上先安装pycryptodome才可以使用该模块。

服务端代码如下:

import socket
import base64
from Crypto.Cipher import AES

def add_to_16(value):
    while len(value) % 16 != 0:
        value += '\0'
    return str.encode(value)

def decrypt_oralce():
    key = input('\n请输入用于解密文件的秘钥:')
    global filepath
    global savefile
    savefile = input('\n请输入解密后文件的名字:')
    text = str(open(filepath, 'r').read())
    open(filepath, 'r').close()
    aes = AES.new(add_to_16(key), AES.MODE_ECB)  # 初始化加密器
    base64_decrypted = base64.decodebytes(text.encode(encoding='utf-8'))  
    decrypted_text = str(aes.decrypt(base64_decrypted)).replace('\0', '') 
    logbat = open(savefile, 'w')
    logbat.write(decrypted_text)
    logbat.close()
    print('\n文件解密成功 文件已保存为 ', savefile)

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind(('127.0.0.1', 8008))
s.listen(5)
print('Waiting for connection...')
while True:
    sock, addr = s.accept()
    filepath = input('please enter the filepath you want to save:')
    f = open(filepath, 'wb')
    data = sock.recv(1024)#接收文件内容
    f.write(data)
    f.close()
    if __name__ == '__main__':
        decrypt_oralce()
    break
s.close()

运行结果如下:

客户端代码如下:

import socket
import os
import base64
from Crypto.Cipher import AES

def add_to_16(value):
    while len(value) % 16 != 0:
        value += '\0'
    return str.encode(value) 

def encrypt_oracle():
    filename = input('please enter the filename you want to send:')
    key = input('\n请设置一个秘钥用于加密文件:')
    filepath,fname = os.path.split(filename)
    filename1,extension = os.path.splitext(fname)
    global savefile
    savefile = filename1+'已加密'+extension#加密后文件名称
    text = open(filename, 'rb')
    text.read()
    text.close()
    text = str(text)
    aes = AES.new(add_to_16(key), AES.MODE_ECB)  
    encrypt_aes = aes.encrypt(add_to_16(text))
    encrypted_text = str(base64.encodebytes(encrypt_aes), encoding='utf-8')
    logbat = open(savefile, 'w')
    logbat.write(encrypted_text)
    logbat.close()
    print('\n文件已加密为', savefile)

if __name__ == '__main__':
    encrypt_oracle()

filesize = str(os.path.getsize(savefile))
fname1, fname2 = os.path.split(savefile)

f = open(savefile, 'rb')
cs = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
cs.connect(('127.0.0.1', 8008))
while True:
    for line in f:
        cs.send(line)#发送文件内容
        print('sending...')
    break
cs.close()

运行结果如下:

  1. 实验过程中遇到的问题和解决过程
    问题1:客户端代码运行后提示找不到文件,可文件明明确实存在。
    问题1解决方案:经检查后发现是用错了一个变量。
    问题2:提示报错“在一个非套接字上尝试了一个操作”。
    问题2解决方案:是之前关闭进程出了错误,最后换了一个端口。
    问题3:一开始安装pip install pycryptodome失败
    问题3解决方案:更新pip 后重新安装成功。

其他(感悟、思考等)
在写代码时不断遇到各种问题真的很崩溃,但最后做完后还是有成就感。在python的学习上还是要继续努力。

参考资料
Python变量作用域
解决 Command "python setup.py egg_info" failed with error code 1
安装 Python 模块
OSError: [WinError 10038] 在一个非套接字上尝试了一个操作

posted @ 2021-05-31 21:01  rprsu  阅读(64)  评论(0编辑  收藏  举报