• Python 实现国产SM4加密算法


    国密sm4

    sm4 算法是一个分组算法,用于无线局域网产品。该算法的分组长度为128比特,密钥长度为128比特。加密算法与密钥扩展算法都采用32轮非线性迭代结构。解密算法与加密算法的结构相同,只是轮密钥的使用顺序相反,解密轮密钥是加密轮密钥的逆序。

    gmssl

    gmssl是一个开源的加密包的python实现,支持SM2/SM3/SM4等国密(国家商用密码)算法、项目采用对商业应用友好的类BSD开源许可证,开源且可以用于闭源的商业应用。

    Python实现sm4

    ##############################################################################
    #                                                                            #
    #                            国产SM4加密算法                                  #
    #                                                                            #
    ##############################################################################
    
    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 = "90897h8789thvht"
        SM4 = SM4()
        print("原字符", strData)
        encData = SM4.encryptSM4(key, strData)  # 加密后的数据,返回bytes类型
        print("sm4加密结果:", encData)
        
        decData = SM4.decryptSM4(key, encData)
        print("sm4解密结果:", decData)  # 解密后的数据

     效果截图:

     

    至此。转载请注明出处,记得扫码打赏支持哦,谢谢!

  • 相关阅读:
    asp.net C# 实现阿里大鱼和云片网短信接口类
    asp.net C# 实现微信接口权限开发类
    asp.net C# 实现微信服务器配置
    php学习资料
    阿里云ECS升级OpenSSL记录
    Docker(十三):OpenStack部署Docker集群
    Docker(十二):Docker集群管理之Compose
    Docker(十一):Docker实战部署HTTPS的Tomcat站点
    Docker(十):Docker安全
    Docker(九):Docker容器卷插件
  • 原文地址:https://www.cnblogs.com/wcwnina/p/15580364.html
Copyright © 2020-2023  润新知