20192320杨坤2019-2020-2 《Python程序设计》实验三报告
20192320杨坤2019-2020-2 《Python程序设计》实验三报告
课程:《Python程序设计》
班级:1923
姓名: 杨坤
学号:20192320
实验教师:王志强
实验日期:2022年4月21日
必修/选修: 公选课
1.实验内容
创建服务端和客户端,服务端在特定端口监听多个客户请求。客户端和服务端通过Socket套接字(TCP/UDP)进行通信。
2. 实验过程及结果
2.1实验代码
SM4加密算法:
# _*_ coding:utf-8 _*_
'''
**************************************************
@File :myPycharm -> SM4Utils
@IDE :PyCharm
@Author :20192320杨坤
@Date :2022/4/22 10:39
**************************************************
'''
import binascii
from gmssl import sm4
class SM4:
"""
国产加密 sm4加解密
"""
def __init__(self):
self.crypt_sm4 = sm4.CryptSM4() # 实例化
def str_to_hexStr(self, hex_str):
"""
字符串转hex
:param hex_str: 字符串
:return: hex
"""
hex_data = hex_str.encode('utf-8')
str_bin = binascii.unhexlify(hex_data)
return str_bin.decode('utf-8')
def encryptSM4(self, encrypt_key, value):
"""
国密sm4加密
:param encrypt_key: sm4加密key
:param value: 待加密的字符串
:return: sm4加密后的十六进制值
"""
crypt_sm4 = self.crypt_sm4
crypt_sm4.set_key(encrypt_key.encode(), sm4.SM4_ENCRYPT) # 设置密钥
date_str = str(value)
encrypt_value = crypt_sm4.crypt_ecb(date_str.encode()) # 开始加密。bytes类型
return encrypt_value.hex() # 返回十六进制值
def decryptSM4(self, decrypt_key, encrypt_value):
"""
国密sm4解密
:param decrypt_key:sm4加密key
:param encrypt_value: 待解密的十六进制值
:return: 原字符串
"""
crypt_sm4 = self.crypt_sm4
crypt_sm4.set_key(decrypt_key.encode(), sm4.SM4_DECRYPT) # 设置密钥
decrypt_value = crypt_sm4.crypt_ecb(bytes.fromhex(encrypt_value)) # 开始解密。十六进制类型
return decrypt_value.decode()
# return self.str_to_hexStr(decrypt_value.hex())
if __name__ == '__main__':
key = "f38fc9b32af486e65d6f93dbc41b9123"
strData = "9090你好"
SM4 = SM4()
print("原字符:", strData)
encData = SM4.encryptSM4(key, strData) # 加密后的数据,返回bytes类型
print("sm4加密结果:", encData)
decData = SM4.decryptSM4(key, encData)
print("sm4解密结果:", decData) # 解密后的数据
服务器端
- socket初始化
- 端口绑定
- 数据接收
- 文件解密
- 文件的处理,w+ :以读写方式打开文件。如果文件存在会被覆盖。如果文件不存在,创建新文件。
# -*- coding : utf-8 -*-
# coding: utf-8
# -*- coding: utf-8 -*-
# !/usr/bin/env Python
# coding=utf-8
'''
**************************************************
@File :myPycharm -> socket_server
@IDE :PyCharm
@Author :20192320杨坤
@Date :2022/4/21 19:48
**************************************************
'''
import base64
import socket
import sm4Utils
if __name__ == '__main__':
sm4 = sm4Utils.SM4()
key = "f38fc9b32af486e65d6f93dbc41b9123"
try:
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind(('127.0.0.1', 5000))
print("服务器监听")
s.listen()
except socket.error as err:
print(err)
err.exit(1)
conn, address = s.accept()
print("服务器已经连接")
data = conn.recv(1024)
print("已接收到文件:" + data.decode())
conn.sendall(("服务器已经接收到信号" + str(data)).encode())
with open(r'E:/大三下/python/receive.txt', 'w+') as rec:
strdecode=data.decode()
decrypt_value=sm4.decryptSM4(key,strdecode)
# print("strdecode:"+strdecode)
# print("decrypt_value: "+decrypt_value)
rec.write(decrypt_value)
print("已终止")
s.close()
客户端
- 连接
- 文件读取
- 文件加密
# _*_ coding:utf-8 _*_
'''
**************************************************
@File :myPycharm -> socket_client
@IDE :PyCharm
@Author :20192320杨坤
@Date :2022/4/21 19:49
**************************************************
'''
import base64
import socket
import sys
import sm4Utils
if __name__ == '__main__':
key = "f38fc9b32af486e65d6f93dbc41b9123"
sm4 = sm4Utils.SM4()
try:
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(('127.0.0.1', 5000))
except socket.error as err:
print(err)
sys.exit(1)
except socket.error as err:
print(err)
sys.exit(1)
path = input("传输文件地址: ")
with open(path, 'r', encoding='UTF-8') as object:
str = object.read(1024)
encrypt_value = sm4.encryptSM4(key, str)
print("加密"+str+"中:")
# strencode = base64.b64encode(encrypt_value.encode())
strencode=encrypt_value
print("加密完毕")
s.sendall(strencode.encode())
data = s.recv(1024)
print(strencode)
2.2实验结果截图
1 初始传输文件trans.txt和接收文件recieve.txt
2 运行截图
3 完成后的接收文件recieve.txt
3. 实验过程中遇到的问题和解决过程
- 问题1:中文编码问题
- 问题1解决方案:在open函数中加入指定的编码方式,就可以解决该问题。
其他(感悟、思考等)
多学多练
码云: https://gitee.com/providence2320/python-study/commit/5836ea37de9743a2cc6f0703ddc54c0d0698ca5c