20202216 实验三《Python程序设计》实验报告
20202216 邓童丹 2020-2021-2 《Python程序设计》实验三报告
课程:《Python程序设计》
班级: 2022
姓名: 邓童丹
学号:20202216
实验教师:王志强
实验日期:2020年5月30日
必修/选修: 公选课
1.实验内容
创建服务端和客户端,服务端在特定端口监听多个客户请求。客户端和服务端通过Socket套接字(TCP/UDP)进行通信。
- 实验过程及结果
对文件的加密采用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解决方案:经检查后发现是用错了一个变量。
问题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] 在一个非套接字上尝试了一个操作