python 实验3
学号 20181316《Python程序设计》实验报告
课程:《Python程序设计》
班级: 1813
姓名: 曾令杰
学号:20181316
实验教师:王志强
实验日期:2021年5月31日
必修/选修: 公选课
一、实验内容:
创建服务端和客户端,服务端在特定端口监听多个客户请求,通过Socket套接字(TCP/UDP)进行通信。
(1)创建服务端和客户端,选择一个通信端口,用Python语言编程实现通信演示程序;
(2)要求包含文件的基本操作,例如打开和读写操作。
(3)要求发送方从文件读取内容,加密后并传输;接收方收到密文并解密,保存在文件中。
(4)程序代码托管到码云。
二、实验过程及结果:
本次实验我使用了RSA算法加密传输内容,需要调用如下:
from Crypto.PublicKey import RSA from Crypto.Cipher import PKCS1_OAEP
服务器端代码如下:
#socket技术,socket=IP+端口 ''' 1、创建套接字 s=socket.socket() 2、绑定ip+端口 s.bind(('ip',端口)) 3、 ''' import socket from Crypto.PublicKey import RSA from Crypto.Cipher import PKCS1_OAEP key = RSA.generate(2048) # 实例化密钥对,密钥长度为2048bits # 生成的私钥公钥都是bytes的数据,这里密钥转不转str都可以 .decode()默认用utf-8把bytes转str # 私钥 解密 private_key = key.export_key() public_key = key.publickey().export_key() s=socket.socket(socket.AF_INET,socket.SOCK_STREAM) s.bind(('127.0.0.1',8001)) s.listen() conn,address=s.accept() data=conn.recv(1024) print('用户端发来了连接请求!') s.close() s1=socket.socket(socket.AF_INET,socket.SOCK_STREAM) s1.connect(('127.0.0.1',8002)) s1.sendall(public_key) s1.close() s2=socket.socket(socket.AF_INET,socket.SOCK_STREAM) s2.bind(('127.0.0.1',8001)) s2.listen() conn2,address2=s2.accept() c_data=conn2.recv(1204) print('用户端发来了加密文件,内容为:') print(c_data) private_key = RSA.importKey(private_key) d_cipher = PKCS1_OAEP.new(private_key) # 解密套件 org_data = d_cipher.decrypt(c_data) print('解密后为:') print(org_data) file=open(r'C:\Users\曾令杰\Desktop\3.txt','w+',encoding='utf-8') file.write(str(org_data))
客户端代码如下:
import socket from Crypto.PublicKey import RSA from Crypto.Cipher import PKCS1_OAEP s=socket.socket(socket.AF_INET,socket.SOCK_STREAM) s.connect(('127.0.0.1',8001)) st="请求连接!" s.sendall(st.encode()) s1=socket.socket(socket.AF_INET,socket.SOCK_STREAM) s1.bind(('127.0.0.1',8002)) s1.listen() conn,address=s1.accept() public_key_get=conn.recv(1024) public_key = RSA.importKey(public_key_get) cipher = PKCS1_OAEP.new(public_key) print('服务器发来了公钥:'+ str(public_key)) s2=socket.socket(socket.AF_INET,socket.SOCK_STREAM) s2.connect(('127.0.0.1',8001)) file=open(r'C:\Users\曾令杰\Desktop\2.txt','r+',encoding='utf-8') data=file.read() c_data = cipher.encrypt(data.encode()) s2.sendall(c_data) s2.close()
流程:
每边构造了三个socket套接字,不知道是不是多余了,没多想,第一个是请求连接的,当服务器端收到客户端发送的连接请求后将生成的公钥发送给客户端,第二个就是客户端收到了服务器端发送的公钥后,使用该公钥对要发送的文件数据进行加密并发送给服务器端,服务器端收到密文后使用私钥进行解密得出最后的文本并将该解密后的文本保存到文件中。
以下是实验截图:
客户端读取的数据文本是我电脑桌面上的2.txt文件,文件内容为:
服务器端收到数据存储数据于3.txt,内容为:
三、实验问题及解决方案:
服务器出现积极拒绝访问的情况
原因:我尝试了很多次,每次都要连接3次才能成功,后面发现是上次运行结束端口资源没有立刻释放,然后我又连接了导致端口被占用没连接成功,等一会就好了!
四、其他
本来我做了一个base64对文件加密,然后又想base64一般都说是base64编码。。。好像有点问题不太符合。。。可能是我理解有问题,之后实验最终使用了RSA加密!感觉收获很大!