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上的实践例子

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

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

相关文章

迷你手持小风扇到底哪个牌子最好?揭秘迷你手持手持小风扇排行榜

在炎炎夏日,迷你手持小风扇成为了我们不可或缺的清凉伴侣。然而,面对市场上琳琅满目的品牌,迷你手持小风扇到底哪个牌子最好?今天,我将揭秘迷你手持小风扇排行榜,带大家一探各大品牌的魅力,让你…

字节面试:百亿级数据存储,怎么设计?只是分库分表吗?

尼恩:百亿级数据存储架构起源 在40岁老架构师 尼恩的读者交流群(50)中,经常性的指导小伙伴们改造简历。 经过尼恩的改造之后,很多小伙伴拿到了一线互联网企业如得物、阿里、滴滴、极兔、有赞、希音、百度、网易、美团的面试机会&#xff0c…

【LeetCode】【5】最长回文子串

文章目录 [toc]题目描述样例输入输出与解释样例1样例2 提示Python实现动态规划 个人主页:丷从心 系列专栏:LeetCode 刷题指南:LeetCode刷题指南 题目描述 给一个字符串s,找到s中最长的回文子串 样例输入输出与解释 样例1 输入…

文件上传安全指南:保护免受不受限制的文件上传攻击

文件上传安全指南:保护免受不受限制的文件上传攻击 在现代应用程序中,文件上传功能是一个常见且重要的部分。然而,这也为攻击者提供了潜在的攻击向量,尤其是不受限制的文件上传攻击。本文将详细介绍如何通过一系列安全措施来保护…

安全设计 | Microsoft 威胁建模工具Threat Modeling Tool安装及使用详解(文末附样例)

1. 概览 微软威胁建模工具(Threat Modeling Tool)是 Microsoft 安全开发生命周期 (SDL,Security Develop LifeCycle) 的核心要素。 当潜在安全问题处于无需花费过多成本即可相对容易解决的阶段,软件架构师可以使用威胁建模工具提…

linux系统防火墙开放端口命令

目录 linux相关命令参考文章1.开放端口1.1 开发单个端口1.2 一次性开放多个端口 2.保存设置3.查看所有开放的端口4.查看防火墙状态 linux相关命令参考文章 管理、设置防火墙规则(firewalld): https://download.csdn.net/blog/column/8489557/137911049 i…

打造AI虚拟伴侣 - 优化方案

第一部分:框架优化概述 1、精确定位: 构建一个高度灵活且用户友好的平台,旨在通过无缝集成多种大型语言模型(LLMs)后端,为用户创造沉浸式的角色交互体验。不仅适配电脑端,还特别优化移动端体验,满足二次元AI虚拟伴侣市场的特定需求。 2、核心功能强化: 增强后端兼容…

每日练习之深度优先搜索——最大的湖

最大的湖 题目描述 运行代码 #include<iostream> using namespace std; bool mp[102][102]; int sum,num; int N,M,K; int dfs(int x,int y ) {if( mp[x][y] ){mp[x][y]0;sum;dfs(x1,y);dfs(x-1,y);dfs(x,y1);dfs(x,y-1);}return 0; } int main() {cin>>N>>…

【每日一题】52.20个机器学习问题 2 (模型部署、实践流程和应用问题)

在上一篇《20个机器学习问答题》中&#xff0c;问题主要围绕机器学习的基础概念和理论知识。 这次&#xff0c;本篇内容针对机器学习的实践和应用继续提出了20个不同的问题。【点击跳转原文】 在实际应用中&#xff0c;机器学习模型的建立流程是怎样的&#xff1f; 机器学习模…

使用delphi11编写一个基于xls作为数据库的照片展示程序

1、创建xls文档可以参考前一篇博客&#xff0c;并使用wps将文档保存为2003格式xls后缀。 2、在form上面放置adoconnection、adotable、datasource、spinedit、timer、checkbox、image、4个button组件。 image的设置&#xff1a; Image1.Align : alClient; Image1.Center : Tr…

如何找到docker的run(启动命令)

使用python三方库进行 需要安装python解释器 安装runlike安装包 pip3 install runlike 运行命令 runlike -p <container_name> # 后面可以是容器名和容器id&#xff0c;-p参数是显示自动换行实验 使用docker启动一个jenkins 启动命令为 docker run -d \ -p 9002:80…

无线领夹麦克风哪个品牌音质最好,揭秘无线领夹麦哪个牌子好用

​随着社交媒体和内容创作的兴起&#xff0c;清晰可靠的音频捕捉已成为打造高品质作品的关键要素。无线领夹麦克风因其轻巧设计和用户友好的接口而受到青睐&#xff0c;它能够确保你的声音在任何环境下都能被完美捕捉。经过精心测试和对比&#xff0c;以下几款无线领夹麦克风是…

大数据学习之安装并配置maven环境

什么是Maven Maven字面意&#xff1a;专家、内行Maven是一款自动化构建工具&#xff0c;专注服务于Java平台的项目构建和依赖管理。依赖管理&#xff1a;jar之间的依赖关系&#xff0c;jar包管理问题统称为依赖管理项目构建&#xff1a;项目构建不等同于项目创建 项目构建是一…

C语言——⾼位优先与低位优先的不同之处是什么?

一、问题 C语⾔的最⼤特⾊就是可移植性好。根据机器类型的不同&#xff0c;⾼位优先与低位优先也不同。那么&#xff0c;最好的可移植的 C 程序应该同时适⽤这两种类型的计算机。下⾯了解⼀下⾼位优先与低位优先的不同之处。 二、解答 所谓的⾼位优先&#xff0c;就是最低的地…

使用docker-compose部署时序数据库InfluxDB1.8.4

背景 如今 InfluxDB 已经更新到了 2.x &#xff0c; InfluxDB 1.x 和 2.x 版本之间有几个主要的区别&#xff1a; 数据模型&#xff1a; 1.x&#xff1a;使用数据库和保留策略来组织数据。 2.x&#xff1a;引入了组织&#xff08;organizations&#xff09;和存储桶&#xff…

牛客NC236 最大差值【simple 动态规划 Java/Go/PHP】

题目 题目链接&#xff1a; https://www.nowcoder.com/practice/a01abbdc52ba4d5f8777fb5dae91b204 思路 不难看出该题可以使用动态规划的方式解题。 在循环数组的过程中&#xff0c;记录截止到当前位置-1的最小值&#xff0c; 然后用当前的值去计算最大的差值。Java代码 im…

融媒宝:群发自媒体平台的神器,注册送7天中级会员

近几年自媒体比较火&#xff0c;做自媒体往往需要发布文章或视频到多个平台&#xff0c;如手工复制粘贴逐一发布&#xff0c;委实费时费力、效率不高。今天就给大家分享一款提高自媒体运营效率的神器--融媒宝&#xff1a; 融媒宝简介 融媒宝是一款可免费使用的高效自媒体工具…

22个C语言小白常见问题总结

一.语言使用错误 在打代码的过程中&#xff0c;经常需要在中文与英文中进行转换&#xff0c;因此常出现一些符号一不小心就用错&#xff0c;用成中文。例如&#xff1a;“&#xff1b;”中文中的分号占用了两个字节&#xff0c;而英文中“;”分号只占用一个字节。编译器只能识…

Scala的简单学习一

一 相关知识 1.1 scala的安装 1.在idea中导入依赖&#xff0c;并在Idea下载scala插件 1.2 scala基础知识点 1.scala代码中一行语句的结束是以换行符为标准&#xff0c;可以不用写分号 2.class是一个普通的类&#xff0c;object相当于一个单例对象&#xff0c;object类中的…

OpenStack配置 之 不同cpu迁移虚拟机

介绍 OpenStack是一个开源的云计算管理平台项目&#xff0c;是一系列软件开源项目的组合。 OpenStack由NASA&#xff08;美国国家航空航天局&#xff09;和Rackspace合作研发并发起&#xff0c;以Apache许可证&#xff08;Apache软件基金会发布的一个自由软件许可证&#xff…