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

参考资料

posted @ 2022-04-21 20:34  providence2320  阅读(74)  评论(0编辑  收藏  举报