首页 > 编程语言 >python如何使用 秘钥证书 进行 SM2 加密

python如何使用 秘钥证书 进行 SM2 加密

时间:2024-09-12 18:35:36浏览次数:12  
标签:sm2 encrypt python crypt self sm4 SM2 秘钥 key

最近一个项目,需要使用sm2非对称加密,对方直接给的秘钥证书,python使用gmssl 进行加密,解密,加签,验签用的秘钥是这种格式
# Private Key秘钥 5aa03412c3051e1d4cf9d19cfbeeec70c28f388c9f82747cc912096c9cd44bea 
# Public Key 公钥 044291b381a039a8d7d02d7272d2d7c78a30d33e3eeaa0b509bf77d2376582ab2d573730e6bfe9a53bad53f53ac1a85d9c11050931f04bc8b3afc04144d5a6f9be
但是对方给的是这种格式的秘钥证书,python如何使用呢?

1. openssl提取 privateKey.pfx秘钥证书秘钥转换为python gmssl库可用秘钥

# 注意openssl提取sm2秘钥证书需要对应版本,我这里是下载的 openssl.1.1.1 因为有的版本是不支持提取sm2秘钥证书的
openssl pkcs12 -in privateKey.pfx -nocerts -out private_key.pem -nodes
# 转为把私钥证书转为private_key.pem格式
openssl ec -in private_key.pem -text -noout
# 查看公私钥 

priv = """上面复制私钥"""

pub = """上面复制公钥"""

print('处理后的私钥:{}'.format(priv.replace(":", '').replace('\n', '').replace(' ', '')))
print('处理后的公钥:{}'.format(pub.replace(":", '').replace('\n', '')).replace(' ',''))
# 我这里privateKey.pfx 其实就包含了公私钥信息,就不用单独提取公钥了

2.对方PublicKey.cer文件公钥提取

对方公钥提取就简单了,直接安装下面步骤来

3.python实现 SM2加密

# 这里直接上代码 python解释器版本为3.6 3.10 本人亲测可以运行下面代码  sm2有不同的配置,要看对方使用的sm2进行修改 如 iv mode
import os
import random
import string
import base64

from gmssl import sm4, sm2


# python解释器版本3.6
class SM4(object):
    def __init__(self):
        self.crypt_sm4 = sm4.CryptSM4()
        self.crypt_sm4_iv = base64.b64decode("这里请填写你的iv值")

    # sm4 cbc 加密
    def encrypt_sm4(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_cbc(self.crypt_sm4_iv, date_str.encode())
        # 返回base64编码的加密数据
        return base64.b64encode(encrypt_value).decode()

    # sm4 cbc 解密
    def decrypt_sm4(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_cbc(self.crypt_sm4_iv, encrypt_value)  # 开始解密。十六进制类型
        return decrypt_value.decode()

    # 生成128位随机密钥key
    @staticmethod
    def generate_key():
        """
        生成128位随机密钥key
        :return: 128位随机密钥key
        """
        return ''.join(random.sample(string.ascii_letters + string.digits, 16))


class SM2(object):
    def __init__(self):
        self.public_key = '044291b381a039a8d7d02d7272d2d7c78a30d33e3eeaa0b509bf77d2376582ab2d573730e6bfe9a53bad53f53ac1a85d9c11050931f04bc8b3afc04144d5a6f9be'
        self.private_key = '5aa03412c3051e1d4cf9d19cfbeeec70c28f388c9f82747cc912096c9cd44bea'
        # 对方的公钥
        self.others_public_key = ''

    # 公钥加密
    def encrypt_sm2(self, public_key, data, java=False):
        sm2_crypt = sm2.CryptSM2(public_key=public_key, private_key='', mode=1, asn1=True)
        encrypt_res = sm2_crypt.encrypt(data.encode("UTF_8"))
        if java:
            encrypt_res = b'\x04' + encrypt_res
        return base64.b64encode(encrypt_res).decode("utf-8")

    # 私钥签名
    def sign_sm2(self, private_key, public_key, data):
        sm2_crypt = sm2.CryptSM2(private_key, public_key, mode=1, asn1=True)
        random_hex_str = os.urandom(32).hex()  # 随机数
        signature = sm2_crypt.sign_with_sm3(data.encode("utf-8"), random_hex_str)
        return base64.b64encode(bytes.fromhex(signature)).decode('utf-8')

    # 公钥验签
    def verify_sm2(self, public_key, sign, data):
        sm2_crypt = sm2.CryptSM2(private_key=None, public_key=public_key, mode=1, asn1=True)
        return sm2_crypt.verify(sign, data)


obj_sm4 = SM4()
obj_sm2 = SM2()

标签:sm2,encrypt,python,crypt,self,sm4,SM2,秘钥,key
From: https://www.cnblogs.com/guokaifeng/p/18410813

相关文章

  • Python 内置函数汇总(使用示例)
    abs(number)求解整数,浮点数绝对值,返回复数模大小aiter()异步的方式遍历可迭代对象的异步迭代器importasynciocount=0asyncdefexample():asyncdefasync_generator():globalcountwhileTrue:count+=1......
  • Python调用Rust
    Python跨语言调用其他语言方法通过FFI(外部程序接口)调用,Java中称JNI,将Rust/Go/C/C++按C类型编译称动态连接库,Python中使用ctypes加载并调用通过进程间通信IPC调用(如使用socket)通过网络接口调用,如RPC,HTTP接口等通过本地虚拟机/解释器/代理调用,如Python调用Java,执行JavaS......
  • python 异步的几种方式
    importasyncioimportrandomimportthreadingfromconcurrent.futuresimportThreadPoolExecutorimporttimedefblocking_task(x):time.sleep(2)thread_name()print(f'arg:{x}\n')returnx*2asyncdefunblocking_task(x):t......
  • Appium+python框架搭建
    一、Appium-Python-Client①安装依赖库也就大家说的客户端,这里的客户端指的是我编辑代码的界面,因为代码界面我要引入webdriver所以叫客户端,其实本质是一个依赖库跟selenium差不多②安装的命令:pipinstallAppium-Python-Client(python环境所以安装python包)③Appium-Python-Clien......
  • Python 和 Go 实现 AES 加密算法的技术详解
    AES(AdvancedEncryptionStandard,高级加密标准)是一种对称密钥加密算法,广泛应用于各种安全通信场景中。AES使用128、192或256位的密钥,能够提供不同级别的安全性。本文将详细讲解如何使用Python和Go来实现AES加密算法,提供代码示例并对其进行逐步解析。1.什么是AES加密......
  • Python文件操作:文件的读取和写入(文本文件、二进制文件)①
    文章目录1.文件操作基础1.1打开文件1.2关闭文件2.文本文件操作2.1读取文本文件2.1.1逐行读取2.1.2读取所有内容2.1.3读取所有行2.2写入文本文件2.2.1写入内容2.2.2追加内容3.二进制文件操作3.1读取二进制文件3.2写入二进制文件4.综合示例4.1示例描......
  • 基于MicroPython的ESP8266控制RGB颜色传感器识别颜色的设计方案
        以下是一个基于MicroPython的ESP8266控制RGB颜色传感器进行颜色识别的设计方案:一、硬件准备1. ESP8266开发板(如NodeMCU)。2. RGB颜色传感器(例如TCS3200传感器)。3. 面包板。4. 杜邦线若干。5.3.3V直流电源二、硬件连接1. 将ESP8266的3.3V引脚、GND......
  • 基于MicroPython的ESP8266控制舵机的设计方案
        以下是一个基于MicroPython的ESP8266控制舵机的设计方案: 一、硬件准备1. ESP8266开发板(如NodeMCU)。2. 舵机(如SG90)。3. 杜邦线若干。 二、硬件连接1.将5V直流电源连接到舵机的电源引脚(通常为红色线)。2.将3.3V直流电源连接到ESP8266的3.3V管脚。3......
  • python利用matplot绘制横向条形图,并调整每个条形的位置
    通过color_x和t_x控制每个条形的颜色和文本,draw_mybar里的y和left可以控制条形显示的位置。importmatplotlib.pyplotaspltimportnumpyasnp#数据设置categories=["A","B","C","D"]color_1="#9dc3e4"color_2="#f8cbbd"color_3=......
  • python基于django框架医院管理系统设计与实现mysql数据库
    随着信息技术的快速发展和医疗卫生事业的不断进步,医院信息化管理已成为提高医疗服务质量和效率的重要手段。本文设计并实现了一个基于PythonDjango框架的医院管理系统,旨在为医院提供一个全面、高效、易用的信息化管理平台。本系统采用Django框架作为后端开发框架,利用其强大......