首页 > 技术文章 > 20191204李浩鹏2020-2021-2实验三《Python程序设计》实验报告

lhpshuaibi 2021-05-27 22:53 原文

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
  • ...

其他(感悟、思考等)

在遇到不会的事情时,首先要想到的通过自己动手解决,我们现在的问题之前肯定要也有好多人遇到过,并且解决。搜集信息的能力很重要。如果是在搜不到的问题,建议返回头在看一眼代码,有可能是自己理解还不到位。

参考资料

推荐阅读