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

news/2024/9/19 15:50:39/文章来源:https://www.cnblogs.com/guokaifeng/p/18410813
最近一个项目,需要使用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 json
import os
import random
import string
import base64
import tracebackimport requests
from Crypto.PublicKey import RSA
from gmssl import sm4, sm2
from datetime import datetime# 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_sm4crypt_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_sm4crypt_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@staticmethoddef 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_resreturn 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()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/796162.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

让小爱音箱播放电脑/NAS上歌曲,支持自动从哔哩哔哩/油管下载歌曲,无需刷机。支持语音控制和WebUI控制,docker部署多平台兼容,解决仅能播放试听版的苦恼

小米AI音箱很多人都有,但使用中播放歌曲时总是提示仅能播放试听版,不能完整听歌,很烦人。今天介绍的方法就是要彻底解决这个问题,实现让小爱AI音箱能够播放本地歌曲,本地没有的歌曲还能自动从网上搜索下载的功能。 已测试支持的设备:型号 名称L06A 小爱音箱L07A Redmi小爱…

Linux系统搭建性能测试监控体系

一.安装Grafana 1.Grafana介绍: Grafana是一个开源的监控和可视化工具,用于显示和跟踪各种指标,数据和日志,支持多种源,包括influxDB、prometheus、mango DB,Redis,Mysql,PostgreSQL等。它提供多种图标类型,饼图,支持设置预警机制,当监控指标超出预定阈值时,可以通过em…

公胶壳和母胶壳

公胶壳和母胶壳 在电子连接器领域,"公胶壳"和"母胶壳"是两种常见的术语,它们通常用来描述连接器的性别,即插头和插座。公胶壳:通常指的是连接器的阳性部分,也就是带有突出的针脚或插销的部分。这些针脚可以插入母胶壳中的相应孔洞,以完成电路的连接。…

2024秋软件工程个人作业(第二次)

这个作业属于哪个课程 https://edu.cnblogs.com/campus/fzu/SE2024这个作业要求在哪里 https://edu.cnblogs.com/campus/fzu/SE2024/homework/13253这个作业的目标 要求使用Python编写一个“羊了个羊”风格的消除类小游戏。对开发过程进行实践,更加熟悉aigc工具学号 102202135…

PbootCMS网站apache伪静态规则

<IfModule mod_rewrite.c>Options +FollowSymlinksRewriteEngine OnRewriteCond %{REQUEST_FILENAME} !-dRewriteCond %{REQUEST_FILENAME} !-fRewriteRule ^(.*)$ index.php?p=$1 [QSA,PT,L]</IfModule>扫码添加技术【解决问题】专注中小企业网站建设、网站安全1…

PbootCMS网站nginx伪静态规则

nginx #请复制下面伪静态配置到nginx配置文件中: #规则适合PbootCMS V2.0+版本location / {if (!-e $request_filename){rewrite ^/(.*)$ /index.php?p=$1 last;} }扫码添加技术【解决问题】专注中小企业网站建设、网站安全12年。熟悉各种CMS,精通PHP+MYSQL、HTML5、CSS3、J…

记一次SSH无法远程

故障现象 主机无法使用ssh远程 输入密码之后报错如下# Permission denied (password,keyboard-interactive).原因 看起来好像是远端设置了不允许用户名和密码登录 其实是客户端设置问题 修复或者注释# ChallengeResponseAuthentication no

bluecms搭建和代码审计(SQL)

bluecms搭建 将bluecms的源码文件bluecms放在www目录下,进入bluecms/install/index.php目录安装bluecms填写数据库配置信息和管理员账号信息填写完上述信息后,会自动在bluecms数据库下创建这些文件返回主界面 http://127.0.0.1/bluecms后发现管理员不能从前台登录, 需要从ht…

KubeSphere 社区双周报| 2024.08.30-09.12

KubeSphere 社区双周报主要整理展示新增的贡献者名单和证书、新增的讲师证书以及两周内提交过 commit 的贡献者,并对近期重要的 PR 进行解析,同时还包含了线上/线下活动和布道推广等一系列社区动态。 本次双周报涵盖时间为:2024.08.30-09.12。 贡献者名单近期重要更新 KubeS…

Appium+python框架搭建

一、Appium-Python-Client ①安装依赖库也就大家说的客户端,这里的客户端指的是我编辑代码的界面,因为代码界面我要引入webdriver所以叫客户端,其实本质是一个依赖库跟selenium差不多 ②安装的命令:pip install Appium-Python-Client(python环境所以安装python包) ③Appi…

2576. 求出最多标记下标

给你一个下标从 0 开始的整数数组 nums 。 一开始,所有下标都没有被标记。你可以执行以下操作任意次: 选择两个 互不相同且未标记 的下标 i 和 j ,满足 2 * nums[i] <= nums[j] ,标记下标 i 和 j 。 请你执行上述操作任意次,返回 nums 中最多可以标记的下标数目。 示例…

**** oracle 数据库-监听故障处理-故障单

**** 数据库-监听故障处理-故障单**** 数据库-监听故障处理故障反馈人张**工单接收时间2024年9月11日 9:10审核/复核人张**/张***处理完毕时间2024年9月11日 9:22报告人柏*报告时间2024年9月11日11:22故障环境IP: 180.5.115.** 数据库版本: 10.2.0.4.0故障现象告警时间: 起…