Python实现国密GmSSL

Python实现国密GmSSL

  • 前言
  • 开始
    • 首先安装
    • 生成公钥与私钥
    • 从用户证书中读取公钥
    • 读取公钥
    • 生成签名
    • 验证签名
    • 加密解密
  • 遇到的大坑
  • 参考文献

前言

首先我是找得到的gmssl库,经过实操,发现公钥与密钥不能通过pem文件得到,就是缺少导入pem文件的api。这个库的私钥与密钥是16进制的字符串编码,如果是想用这个,我就推荐几个网站吧。

  1. 在线生成SM2的密钥对的网站
  2. gmssl

因为我是需要需要通过pem导入的,所以这种方法不适合我。

开始

在找到gmssl-python这个依赖的时候,终于是我所需要的了,下面简单介绍一下他的功能。

gmssl-python通过调用本地安装的GmSSL动态库实现的实现的,建议使用服务器测试,具体可以查看参考文献1。

首先安装

pip install gmssl-python

生成公钥与私钥

import gmssl
# 创建一个Sm2Key对象
Sm2Key = gmssl.Sm2Key()
# 生成公钥与私钥
Sm2Key.generate_key()
# 导出密码为1234的私钥private_key.pem文件
Sm2Key.export_encrypted_private_key_info_pem("private_key.pem", "1234")
# 导出公钥public_key.pem文件
Sm2Key.export_public_key_info_pem("public_key.pem")

从用户证书中读取公钥

import gmssl
# 创建一个SM2证书对象
cert = gmssl.Sm2Certificate()
# 导入pem证书
cert.import_pem('cert.pem')
# 通过自带的方法实现从证书中获取公钥
public_key = cert.get_subject_public_key()
# 将公钥存储到本地.pem文件中
public_key.export_public_key_info_pem('public_key.pem')

读取公钥

import gmssl
# 创建一个Sm2Key对象
Sm2Key = gmssl.Sm2Key()
# 导入公钥
Sm2Key.import_public_key_info_pem("public_key.pem")

生成签名

import gmssl
# 创建一个Sm2Key对象
private_key = gmssl.Sm2Key()
# 导入private_key.pem私钥文件,密码为1234
private_key.import_encrypted_private_key_info_pem('private_key.pem', '1234')
# 创建一个Sm3对象,Sm3是哈希加密
sm3 = gmssl.Sm3()
# 加密数据为123456,可以自定义内容
sm3.update('123456')
# 哈希加密,得到一串哈希字符串
dgst = sm3.digest()
# 对通过sm3加密的字符串进行签名
signed = private_key.sign(dgst)

验证签名

import gmssl
# 签名字符串
signed = ""
# 创建一个Sm2Key对象
Sm2Key= gmssl.Sm2Key()
# 导入公钥
Sm2Key.import_public_key_info_pem('public_key.pem')
# 创建一个Sm3对象,Sm3是哈希加密
sm3 = gmssl.Sm3()
# 加密数据为123456,可以自定义内容
sm3.update('123456')
# 哈希加密,得到一串哈希字符串
dgst = sm3.digest()
# 验签,得到是布尔值,真就成功,假就是失败
ret = Sm2Key.verify(dgst, signed)

加密解密

# ...需要导入公钥和私钥
# 原始字符串
ori_data = b"hello world"
# 加密
encrypt = Sm2Key.encrypt(ori_data)
print('加密:', encrypt)
# 解密
decrypt = Sm2Key.decrypt(encrypt)
print('解密:', decrypt)

遇到的大坑

  • 先导入私钥,后导入公钥会报错,提示没有私钥。
    错误示范与报错截图:
Sm2Key.import_encrypted_private_key_info_pem("test_private.pem", "1234")
Sm2Key.import_public_key_info_pem("test_public.pem")

error

  • 如果只导入私钥也可以加解密,很奇怪。

参考文献

[1]. gmssl-python
[1]. GitHub上的实践例子

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

九宫格转圈圈抽奖活动,有加速,减速效果

在线访问demo和代码在底部 代码&#xff0c;复制就可以跑 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><tit…

作业-day-240523

思维导图 知识点问答 1、IO多路复用的原理 1、创建一个检测文件描述符的容器 fd_set fds; 2、将需要检测的文件描述符放入容器中 FD_SET(文件描述符&#xff0c;&fds); 3、通过一个阻塞函数阻塞等待容器中是否有事件产生&#xff0c;如果有一个或多个事件产生&#xff0c…

vscode 插件开发指南

1安装nodejs、vscode 2安装插件脚手架 npm install -g yo generator-code 3使用命令创建插件项目 yo code 4在vscode中打开项目 5运行调试&#xff0c;按F5键 6在新打开的窗口中按shiftctrlp 然后执行命令 7配置右键菜单命令 遇到问题&#xff1a; 1.package.json中vsc…

科大讯飞Nano+耳机套装登场:智能录音转写,办公充电新方案

目录 一、科大讯飞Nano会议耳机&#xff1a;专业会议助手 二、会议狗Kit&#xff1a;即插即用&#xff0c;智能会议新体验 三、努比亚65W氮化镓充电头&#xff1a;全能快充&#xff0c;一充多用 四、产品总结 在这个快节奏的数字化时代&#xff0c;高效沟通与信息处理能力成…

Koupleless 单进程多应用如何解决兼容问题

文&#xff5c;苟振东&#xff08;花名&#xff1a;盛知&#xff09; Koupleless 项目 committer 蚂蚁集团技术专家 本文 5789 字 阅读 12 分钟 本篇文章属于 Koupleless 进阶系列文章第二篇&#xff0c;默认读者对 Koupleless 的基础概念、能力都已经了解&#xff0c;如果还…

【VTKExamples::Texture】第六期 TextureThreshold

很高兴在雪易的CSDN遇见你 VTK技术爱好者 QQ:870202403 公众号:VTK忠粉 前言 本文分享VTK样例TextureThreshold,并解析接口vtkTexture,希望对各位小伙伴有所帮助! 感谢各位小伙伴的点赞+关注,小易会继续努力分享,一起进步! 你的点赞就是我的动力(^U^)ノ~Y…

ImportError: urllib3 v2.0 only supports OpenSSL 1.1.1+解决方案

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…

网络空间资产梳理

网络空间资产梳理 网络安全建设的实质是对风险的管理&#xff0c;古人云&#xff1a;知己知彼百战不殆。所谓知己&#xff0c;就是要了解自己的资产以及这些资产的脆弱性&#xff0c;知彼就是了解外部威胁及威胁所使用的手段。要做到知己&#xff0c;首先就要对自身的资产进行梳…

虚拟局域网VLAN

前面的是ip地址&#xff0c;后面的子网掩码 hr和财务是俩网段&#xff0c;hr部门发的广播包财务部门也能收到&#xff0c;那么怎么把不同的网段隔离在不同的广播域里呢 如果只有俩部门就用路由器隔离就行了&#xff0c;但是部门一多每一个都用交换机就浪费钱了 可以通过虚拟…

在MySQL数据库中的视图和事务。

视图 view 临时表 作用&#xff1a;优化多表查询的效率 可以将经常使用的连接查询结果使用视图进行保存&#xff0c;避免多次重复的笛卡尔积运算 MySQL数据库在多表查询的时候会自动进行笛卡尔积运算。 如果将来经常要用到某一个多表查询的结果就可以使用视图将这个结果…

代码随想录——路径总和(Leetcode112)需要回顾

题目链接 递归 递归函数什么时候需要返回值&#xff1f; 如果需要搜索整棵二叉树且不需要处理递归返回值&#xff0c;递归函数不要返回值如果需要搜索整棵二叉树且需要处理递归返回值&#xff0c;递归函数需要返回值如果搜索其中一条条件的路径&#xff0c;递归一定需要返回值…

iOS App上架全流程及审核避坑指南

App Store作为苹果官方的应用商店&#xff0c;审核严格周期长一直让用户头疼不已&#xff0c;很多app都“死”在了审核这一关&#xff0c;那我们就要放弃iOS用户了吗&#xff1f;当然不是&#xff01;本期我们从iOS app上架流程开始梳理&#xff0c;详细了解下iOS app上架的那些…

升级版网创教程wordpress插件自动采集并发布

主要功能&#xff1a; wordpress 插件主题系列支持自动采集并发布。 主要采集: 福缘&#xff0c;中创&#xff0c;冒泡 自动采集各大项目网进行整合发布到自己个人网站 插件话更新&#xff0c;减少网络请求&#xff0c;提升稳定性 代码完美开源 傻瓜式操作&#xff0c;一…

计算机SCI期刊,中科院2区,收稿范围非常广泛!

一、期刊名称 Journal of Web Semantics 二、期刊简介概况 期刊类型&#xff1a;SCI 学科领域&#xff1a;计算机科学 影响因子&#xff1a;2.5 中科院分区&#xff1a;2区 出版方式&#xff1a;开放出版 版面费&#xff1a;$1600 三、期刊征稿范围 《网络语义学杂志》…

Redis实现热点数据排行榜或游戏积分排行榜

数据库中的某张表中存储着文章的浏览量&#xff0c;或者点赞数等&#xff0c;或者游戏积分等数据...... 这些数据的更新在redis中完成&#xff0c;并定时同步到mysql数据库中。 而如果要对这些数据进行排序的话&#xff1a; Redis中的Sorted Set(有序集合)非常适合用于实现排…

ZEDmini使用完全指南

ZEDmini使用 ZED stereolabs 开箱测评 使用说明 ubuntu18.04nvidiacuda10 ubuntu18.04ZED SDK安装和使用 Ubuntu16.04安装NVIDIA显卡驱动 查看显卡信息 redwallredwall-G3-3500:~/catkin_ws$ lspci | grep VGA 00:02.0 VGA compatible controller: Intel Corporation Device …

成功案例(IF=7.4)| 代谢组+16s联合分析助力房颤代谢重构的潜在机制研究

研究背景 心房颤动&#xff08;AF&#xff09;是临床上最常见的持续性心律失常&#xff0c;具有显著的发病率和死亡率。高龄是房颤发病率、患病率和进展最显著的危险因素。与年龄在50-59岁之间的参与者相比&#xff0c;80-89岁之间的参与者患房颤的风险增加了9.33倍。目前尚不…

IEEE Transactions on Neural Networks and Learning Systems神经网络和学习系统TNNLS论文投稿须知

一、TNNLS介绍 IEEE Transactions on Neural Networks and Learning Systems作为控制领域的TOP期刊&#xff0c;2024年5月影响因子为10.4&#xff0c;虽然有些下降&#xff0c;之前五年平均影响因子为11.2&#xff0c;但依然是该领域王牌期刊&#xff0c;接收关于神经网络和相…

【软考中级 软件设计师】计算机网络和安全

计算机网络和安全是软件设计师&#xff08;软考中级&#xff09;考试中的重要组成部分&#xff0c;它涵盖了网络基础、网络协议、网络架构、网络安全等多个方面。以下是一些核心概念和要点&#xff0c; 计算机网络基础 OSI七层模型&#xff1a;物理层、数据链路层、网络层、传…

《intel开发手册卷3》读书笔记2

IA-32架构的内存管理分为两个部分&#xff1a;分段和分页。分段提供了一种隔离每个进程 或者任务代码、数据和栈模块的机制,保证多个进程或者任务能够在同一个处理器上运 行而不会互相干扰。分页机制实现了传统请求调页的虚拟内存系统&#xff0c;在这种系统中&#xff0c; 程序…