基于Python+OpenSSL实验【100010445】
第二部分:python+openssl实验报告
一、实验内容
1.安装openSSL
2.编写一个服务器的程序,服务器端的功能是建立SSL网络服务,接受客户端的SSL连接,收发SSL消息。
3.编写一个客户端的程序,客户端的功能是通过SSL协议连接服务器,收发SSL消息。
4.生成SSL证书。
5.撰写试验报告,包括了服务器端和客户端运行结果截图,以及生成的SSL证书。
二、实验框架
程序分为两部分,客户端和服务器端,我们的目的是利用SSL/TLS的特性保证通信双方能够互相验证对方身份(真实性),并保证数据的完整性, 私密性。服务器认证阶段:1)客户端向服务器发送一个开始信息“Hello”以便开始一个新的会话连接;2)服务器根据客户的信息确定是否需要生成新的主密钥,如需要则服务器在响应客户的“Hello”信息时将包含生成主密钥所需的信息;3)客户根据收到的服务器响应信息,产生一个主密钥,并用服务器的公开密钥加密后传给服务器;4)服务器恢复该主密钥,并返回给客户一个用主密钥认证的信息,以此让客户认证服务器。用户认证阶段:在此之前,服务器已经通过了客户认证,这一阶段主要完成对客户的认证。经认证的服务器发送一个提问给客户,客户则返回(数字)签名后的提问和其公开密钥,从而向服务器提供认证
对于客户端而言:发送6次100byte的数据,显示客户端发送时长,以及客户端数据的时长,并显示平均时长
对于服务端而言:接收客户端的数据,并向客户端发送1000byte的数据,显示服务端收到时间,发送时间,以及平均时间。
三、实验步骤
(1)生成证书
同理,用openssl程序
openssl req -new -x509 -days 365 -nodes -out cert.pem -keyout key.pem
(2)Pip openssl库
Pip安装openssl库后。
(3)编写客户端和服务端
代码基本和c++类似,框架以及概括了基本代码,代码截图如下:
对于客户端而言:发送6次100byte的数据,显示客户端发送时长,以及客户端数据的时长,并显示平均时长
对于服务端而言:接收客户端的数据,并向客户端发送1000byte的数据,显示服务端收到时间,发送时间,以及平均时间。
客户端代码:
import socket, ssl, pprint, time
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
ssl_s=ssl.wrap_socket(s,cert_reqs=ssl.CERT_REQUIRED,ca_certs="cert.pem")
ssl_s.connect(("127.0.0.1", 443))
print("套接字连接成功")
n=0
sendtime=0
recvtime=0
while n<6:
n=n+1
t1=time.clock()
ssl_s.send(b'a'*100)
t2=time.clock()
sendtime+=t2-t1
print("发送时长",t2-t1)
t1=time.clock()
data=ssl_s.recv(1024)
t2=time.clock()
recvtime+=t2-t1
print("接收时长",t2-t1)
print(len(data))
print("平均接收时间",sendtime/n,"平均发送时间",recvtime/n)
print("生成的证书信息")
pprint.pprint(ssl_s.getpeercert())
ssl_s.close()
服务器端代码
import socket
import ssl,time
sock=socket.socket()
print("建立套接字成功")
sock.bind(("127.0.0.1", 443))
print("绑定成功")
sock.listen(1)
def input_pro(connstream,data):
print("接收到的客户端数据长度是",len(data))
return True
def doclient(connstream):
recvtime=0
sendtime=0
n=0
t1=time.clock()
data=connstream.recv(1024)
t2=time.clock()
print("服务端接收客户端数据的时间",t2-t1)
while data:
if not input_pro(connstream,data):
break
n=n+1
t3 = time.clock()
connstream.send(b'b' * 1000)
t4 = time.clock()
sendtime += t4 - t3
print("服务端发送数据时长", t4 - t3)
t3 = time.clock()
data = connstream.recv(1024)
t4 = time.clock()
recvtime += t4 - t3
print("服务端接收客户端数据时间", t4 - t3)
print("平均发送时间是",sendtime/n,"平均接收时间是",recvtime/n,)
return True
while True:
#接受连接并返回(conn,address),
# 其中conn是新的套接字对象,
# 可以用来接收和发送数据。
# address是连接客户端的地址。
conn,addr=sock.accept()
print("客户端的套接字数据接收到了")
connstream=ssl.wrap_socket(conn,"key.pem","cert.pem",server_side=True)
try:
doclient(connstream)
finally:
connstream.shutdown(socket.SHUT_RDWR)
connstream.close()
四、实验结果截图
客户端运行结果:
发送6次100字节的数据
接收服务器1000字节的数据,并显示服务器发来的数据的长度(1000)
证书信息:
服务端运行截图:
显示接收到的客户端数据的时间,客户端数据的长度,服务端发送数据的时间
以及平均时长
♻️ 资源
大小: 1.61MB
➡️ 资源下载:https://download.csdn.net/download/s1t16/87390784
相关文章
- Python脚本写端口扫描器(socket,python-nmap)
- Python模拟锟斤拷等各类乱码
- Python:对文件的操作
- 基于python的密码生成器实例解析
- python中基于queue的打印机仿真算法
- Python threading Thread多线程的使用方法
- 基于Python实现选择性重复ARQ模拟实验【100010496】
- 基于Python实现路由器转发内容【100010464】
- python装饰器3:进阶
- 「基于Python技术的智慧中医商业项目」问诊模块后台管理
- 「基于Python技术的智慧中医商业项目」问诊模块问诊应用
- SwiftUI全栈工程师之用Python提取清洗数据(做个国旗App)
- (数据科学学习手札98)纯Python绘制满满艺术感的山脊地图
- python django2.x报错No module named 'django.core.urlresolvers'
- 机器学习算法: 基于逻辑回归的分类预测Python实现
- 基于Python的股市市场情绪分析
- 【转载】python的魔法方法———A Guide to Python's Magic Methods
- Python爬虫框架Scrapy
- python学习(九)之切片和迭代
- python docx 读取word文件 转换药典目录
- (5)Python字典
- [Python]2分钟完成python + Selenium Web端自动化环境搭建,开启~~~
- [Python] map()函数