• 20192320杨坤201920202 《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

    参考资料

  • 相关阅读:
    鬼斧神工:求n维球的体积
    一个双曲函数的积分
    复杂的对数积分(八)
    一个有意思的对数积分的一般形式
    Logarithmic-Trigonometric积分系列(二)
    Logarithmic-Trigonometric积分系列(一)
    Some series and integrals involving the Riemann zeta function binomial coefficients and the harmonic numbers
    Euler Sums系列(六)
    Euler Sums系列(五)
    级数欣赏
  • 原文地址:https://www.cnblogs.com/yk20192320/p/16175936.html
Copyright © 2020-2023  润新知