20191204 2020-2021-2 《Python程序设计》实验三报告
课程:《Python程序设计》
班级: 1912
姓名: 李浩鹏
学号:20191204
实验教师:王志强
实验日期:2021年5月27日
必修/选修: 公选课
1.实验内容
创建服务端和客户端,服务端在特定端口监听多个客户请求。客户端和服务端通过Socket套接字(TCP/UDP)进行通信。
2. 实验过程及结果
客户端
首先设置好AES算法的相关环境,设置key
然后读取一个文件,对其内容进行加密,然后输出一下加密后结果给用户看一下
接下来,连接到服务器上,把密文发送给服务器
最后 ,关闭文件,关闭客户端
from Crypto.Cipher import AES
#客户端的Socket初始化
def splice(text):
while len(text) % 16 != 0:
text += b' '
return text
# 拼接秘钥,秘钥长度需为16的倍数,不足则拼接空格
def splice_key(key):
while len(key) % 16 != 0:
key += b' '
return key
if __name__ == '__main__':
s = socket.socket(socket.AF_INET,socket.SOCK_STREAM) #参数1:服务器之间网络通信;参数2:流式socket , for TCP
s.connect(('127.0.0.1', 8001))#连接,元组的形式,(IP地址,端口)
f = open(input("请输入文件名:"), "r+")
f0 = f.readlines()
f0 = ''.join(f0)
text = f0
text = text.encode()
key = b'20191204' # 秘钥
aes = AES.new(splice_key(key), AES.MODE_ECB) # 根据秘钥初始化加密器
encrypted_byte = aes.encrypt(splice(text)) # 使用加密器的加密方法对文本进行加密,返回加密结果(byte类型)
print("encrypted_byte: ", encrypted_byte)
s.sendall(encrypted_byte)
f.close()
s.close()
服务器
首先设置好 AES的相关环境,设置相同的key
然后设置好服务器,等待客户端连接
接受 客户端的密文 ,进行解密
将解密后的明文 ,写入一个新建的文件里。
最后 ,输出新建文件中的内容,关闭服务器
import socket
from Crypto.Cipher import AES
def splice(text):
while len(text) % 16 != 0:
text += b' '
return text
# 拼接秘钥,秘钥长度需为16的倍数,不足则拼接空格
def splice_key(key):
while len(key) % 16 != 0:
key += b' '
return key
# 服务器端的socket初始化
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 参数1:服务器之间网络通信;参数2:流式socket , for TCP
# s = socket.socket()
s.bind(('127.0.0.1', 8001)) # 绑定. localhost = 127.0.0.1,port=0-65535
s.listen() # 监听
conn, address = s.accept() # 阻塞
data = conn.recv(1024) # 接收
# print(data.decode())
key = b'20191204' # 秘钥
aes = AES.new(splice_key(key), AES.MODE_ECB) # 根据秘钥初始化加密器
decrypt_byte = aes.decrypt(data) # 使用加密器的解密方法对文本进行解密,返回解密结果(byte类型)
decrypt_byte = decrypt_byte.decode()
#print("decrypt_str: ", str(decrypt_byte, encoding='utf-8', errors="ignore")) # 将字节
# conn.sendall(("服务器已经接收到了数据内容:"+str(data.decode())).encode())
name = input("请填写解密后明文的文件名称:")
f = open(name,"w+")
f.write("\n经服务器解密后的明文是:\n")
f.write(decrypt_byte)
f.close()
f = open(name,"r+")
f0 = f.readlines()
f0 = ''.join(f0)
print(f0)
f.close()
s.close()
gitte开源代码
https://gitee.com/besti2021python/l20191204/tree/master/
3. 实验过程中遇到的问题和解决过程
- 问题1:采用何种加密算法,以及算法的加解密算法。
- 问题1解决方案:通过百度搜所发现了python中要crypto相关的库,采用了python3.6安装pycrypto,pycrytodome和crypto中的方法安装了相关的库,并且根据相关教程配置好了AES算法。
- 问题2:读取文件并转换成字节的方法还是有点不熟悉。
- 问题2解决方案:查了查教材和文档,但是由于AES只能加密ascii码中的字符,由于汉字的编码方式不同,现在文件中还无法出现汉字,只能使用英文。转换字节的方法:上链接https://blog.csdn.net/cyan20115/article/details/106548750
- ...
其他(感悟、思考等)
在遇到不会的事情时,首先要想到的通过自己动手解决,我们现在的问题之前肯定要也有好多人遇到过,并且解决。搜集信息的能力很重要。如果是在搜不到的问题,建议返回头在看一眼代码,有可能是自己理解还不到位。