openssl+ SM2 + linux 签名开发实例(C++)
文章目录
- 一、SM2 签名理论基础
- 二、SM2签名开发实例
一、SM2 签名理论基础
SM2是中国国家密码管理局发布的椭圆曲线密码算法标准,用于数字签名、密钥交换和公钥加密等安全通信场景。以下是SM2签名的理论基础相关知识点:
-
椭圆曲线密码学(Elliptic Curve Cryptography,ECC): SM2基于椭圆曲线密码学,该密码学利用椭圆曲线上的数学运算实现加密和签名。椭圆曲线的选择对于安全性至关重要。
-
SM2签名算法: SM2签名算法采用基于椭圆曲线的数字签名算法(ECDSA)。签名过程涉及到私钥的使用和椭圆曲线上的数学运算。
-
椭圆曲线参数: SM2使用了特定的椭圆曲线参数,包括椭圆曲线方程、基点坐标、曲线上的素数阶数等。这些参数在标准中有详细规定。
-
椭圆曲线的离散对数问题: ECC的安全性基于椭圆曲线上的离散对数问题的难解性,即在给定椭圆曲线参数和基点的情况下,计算离散对数是困难的。
-
SM2签名流程:
- 选择椭圆曲线参数。
- 生成随机数作为私钥。
- 利用椭圆曲线上的点乘法计算公钥。
- 签名者使用私钥和消息的哈希值进行签名,得到签名值。
- 验证者使用签名值、公钥和消息的哈希值进行验证。
-
SM2签名验证: 验证SM2签名的过程是使用签名者的公钥、签名值和消息的哈希值进行一系列的椭圆曲线运算,最终验证签名的有效性。
-
消息摘要算法: SM2签名使用消息摘要算法对原始消息进行哈希,通常采用SM3算法。
-
随机数生成: 随机数在SM2签名中的生成对于私钥的安全性至关重要。伪随机数生成器的质量直接影响签名的安全性。
-
SM2签名安全性: SM2签名的安全性基于椭圆曲线的数学困难问题,如离散对数问题。在选择椭圆曲线参数时需要确保足够的安全强度。
这些知识点构成了SM2签名的理论基础,理解这些基础概念有助于深入了解SM2签名算法的工作原理和安全性。
二、SM2签名开发实例
要在Linux环境下使用C++和OpenSSL库实现SM2签名,你可以按照以下步骤进行:
-
安装 OpenSSL: 确保你的系统上已经安装了 OpenSSL 库。可以使用包管理器进行安装,例如在 Ubuntu 上可以使用以下命令:
sudo apt-get install libssl-dev -
创建 C++ 项目: 创建一个新的 C++ 项目,并确保项目的编译脚本中包含 OpenSSL 库的链接。
-
编写 SM2 签名代码: 使用 OpenSSL 提供的 API 进行 SM2 签名。以下是一个简单的示例代码:
#include <openssl/evp.h> #include <openssl/sm2.h> #include <openssl/pem.h>int main() {EVP_PKEY* key = EVP_PKEY_new();FILE* privateKeyFile = fopen("private_key.pem", "r");// 从文件中加载私钥if (!PEM_read_PrivateKey(privateKeyFile, &key, NULL, NULL)) {perror("Error loading private key");return 1;}fclose(privateKeyFile);// 创建 SM2 签名上下文EVP_MD_CTX* ctx = EVP_MD_CTX_new();EVP_MD_CTX_init(ctx);// 选择 SM3 摘要算法const EVP_MD* md = EVP_sm3();// 初始化签名if (!EVP_DigestSignInit(ctx, NULL, md, NULL, key)) {perror("Error initializing signature");return 1;}// 添加要签名的数据const char* message = "Hello, SM2!";if (!EVP_DigestSignUpdate(ctx, message, strlen(message))) {perror("Error updating signature");return 1;}// 获取签名长度size_t sig_len;if (!EVP_DigestSignFinal(ctx, NULL, &sig_len)) {perror("Error getting signature length");return 1;}// 执行签名unsigned char* signature = (unsigned char*)malloc(sig_len);if (!EVP_DigestSignFinal(ctx, signature, &sig_len)) {perror("Error signing data");return 1;}// 输出签名printf("Signature: ");for (size_t i = 0; i < sig_len; ++i) {printf("%02X", signature[i]);}printf("\n");// 释放资源EVP_MD_CTX_free(ctx);EVP_PKEY_free(key);free(signature);return 0; }请注意,这只是一个简单的示例,实际应用中需要适应你的具体需求,例如加载公钥、处理错误等。
-
编译和运行: 使用适当的编译器和选项来编译你的代码。例如,使用 g++ 编译上述代码:
g++ -o sm2_sign sm2_sign.cpp -lssl -lcrypto然后运行可执行文件:
./sm2_sign
请注意,私钥文件 private_key.pem 需要事先准备好,它包含了用于签名的私钥信息。确保你在实际应用中妥善管理密钥,并且根据你的具体情况进行适当的错误处理和安全性考虑。
相关文章:
openssl+ SM2 + linux 签名开发实例(C++)
文章目录 一、SM2 签名理论基础二、SM2签名开发实例 一、SM2 签名理论基础 SM2是中国国家密码管理局发布的椭圆曲线密码算法标准,用于数字签名、密钥交换和公钥加密等安全通信场景。以下是SM2签名的理论基础相关知识点: 椭圆曲线密码学(Elli…...
U4_1:图论之DFS/BFS/TS/Scc
文章目录 一、图的基本概念二、广度优先搜索(BFS)记录伪代码时间复杂度流程应用 三、深度优先搜索(DFS)记录伪代码时间复杂度流程时间戳结构BFS和DFS比较 四、拓扑排序一些概念有向图作用拓扑排序 分析伪代码时间复杂度彩蛋 五、强…...
STM32框架之按键扫描新思路
STM32框架之按键扫描新思路 引入代码展示思路分析 我们学习了定时器实现毫秒级/秒级任务框架,这期我们基于任务框架学习按键扫描新思路。 引入 在按键扫描的过程中,最重要的一步就是按键消抖,解决的方法最简单粗暴的就是先扫描一次按键状态&…...
完美解决k8s master节点无法ping node节点中的IP或Service NodePort的IP
1、问题一 使用搭建好了K8S集群,先是node节点加入k8s集群时,用的内网IP,导致master节点无法操作node节点中的pod(这里的不能操作,指定是无法查看node节点中pod的日志、启动描述、无法进入pod内部,即 kubec…...
弗洛伊德算法(C++)
目录 介绍: 代码: 结果: 介绍: 弗洛伊德算法(Floyd algorithm)也称为Floyd-Warshall算法,是一种用于求解所有节点对之间的最短路径的动态规划算法。它使用了一个二维数组来存储所有节点…...
相对定位、绝对定位、固定定位、绝对定位堆叠顺序
相对定位:相对自己本身进行偏移 CSS语法: position: relative;/*相对自己进行定位*/ top: 10px;/*距离上边*/ left: 10px;/*距离左边*/ 演示图: 绝对定位:默认以浏览器进行定位。如果想依照父盒子定位,需要在父盒子…...
px4+vio实现无人机室内定位
文章主要讲述px4 如何利用vins_fusion里程计数据实现在室内定位功能。 文章基于以下软、硬件展开。 硬件软件机载电脑: Intel NUC系统:Ubuntu 20.04相机: Intel Realsense D435iros:noetic飞控:Pixhawk 2.4.8固件&am…...
享元模式 rust和java的实现
文章目录 享元模式介绍实现javarust实现代码 rust仓库rust仓库 享元模式 享元模式(Flyweight Pattern)主要用于减少创建对象的数量,以减少内存占用和提高性能。这种类型的设计模式属于结构型模式,它提供了减少对象数量从而改善应…...
XmlElement注解在Java的数组属性上,以产生多个相同的XML元素
例如,下面这段XML数据,有多个data元素,并且它们级别相同: <?xml version"1.0" encoding"UTF-8"?><request><reqtype>05</reqtype><secret>test</secret><body><userid&…...
SQLServer 数字加千分位 用FORMAT函数强转不管多大位数
问题 CONVERT ( money, CONVERT ( money, CAST ( round( FTP_AMOUNT, 2 ) AS NUMERIC ( 20, 2 ) ) ) 1 ) AS FTP_AMOUNT用的money函数 结果空间不足,无法将 money 值转换为 varchar。 可以强转 select FORMAT(CAST ( round( ‘-8926143870680.62000000’, 2 ) AS N…...
说说mvc和mvvm的区别和联系
mvvm 与mvc mvvm 与mvcmvc和mvvm的区别和联系 举例说明mvvm与mvc MVC是一种用于构建应用程序的架构模式,它也将应用程序的逻辑和界面分离。它由三个主要组件组成: 模型(Model):表示应用程序的数据和业务逻辑。视图&a…...
linux rsyslog综合实战2
本次我们通过rsyslog服务将A节点服务器上的两个(E.g:多个日志也可以)日志(Path:/var/log/245-1.log、245-2.log)实时同步到B节点服务器目录下(Path:/opt/rsyslog/245) 1.rsyslog架构 2.环境信息 环境信息 HostnameIpAddressOS versionModuleNotersyslog1192.168.10.245CentOS…...
AcWing 4. 多重背包问题 I 学习笔记
有 N� 种物品和一个容量是 V� 的背包。 第 i� 种物品最多有 si�� 件,每件体积是 vi��,价值是 wi��。 求解将哪些物品装入背包,可使物…...
解决selenium使用chrome下载文件(如pdf)时,反而打开浏览器的预览界面
文章目录 解决方法完整的配置 解决方法 在初始化浏览器的时候,添加以下配置即可: option webdriver.ChromeOptions()prefs {"profile.managed_default_content_settings.images": 2, # 禁止加载图片# permissions.default.stylesheet: 2, …...
2024年山东省职业院校技能大赛中职组“网络安全”赛项竞赛试题-C
2024年山东省职业院校技能大赛中职组 “网络安全”赛项竞赛试题-C 一、竞赛时间 总计:360分钟 二、竞赛阶段 竞赛阶段 任务阶段 竞赛任务 竞赛时间 分值 A、B模块 A-1 登录安全加固 180分钟 200分 A-2 本地安全策略设置 A-3 流量完整性保护 A-4 …...
基于Python实现用于实时监控和分析 MySQL 服务器的性能指标和相关信息工具源码
MySQL命令行监控工具 - mysqlstat 介绍 mysqlstat 是一个命令行工具,用于实时监控和分析 MySQL 服务器的性能指标和相关信息。 它可以帮助 DBA(数据库管理员)和开发人员定位和解决数据库性能问题。 以下是 mysqlstat 工具的主要功能&#…...
Android 10-13鼠标右键返回功能适配
Android 10-13鼠标右键返回功能适配 文章目录 Android 10-13鼠标右键返回功能适配一、前言二、鼠标右键适配修改1、Android 10 以及更低版本2、Android11 或者更高版本三、总结1、鼠标右键返回功能修改主要代码2、标右键返回修改代码系统源码搜索3、其他 一、前言 Android 原生…...
51单片机/STM32F103/STM32F407学习1_点亮LED灯
目录: 基础知识单片机从0实现单片机GPIO介绍 参考连接: 野火霸天虎教程 https://doc.embedfire.com/products/link/zh/latest/mcu/stm32/ebf_stm32f407_batianhu_v1_v2/download/stm32f407_batianhu_v1_v2.html x.1 基础知识 x.1.1 指针中的取地址&a…...
(Transfer Learning)迁移学习在IMDB上训练情感分析模型
1. 背景 有些场景下,开始的时候数据量很小,如果我们用一个几千条数据训练一个全新的深度机器学习的文本分类模型,效果不会很好。这个时候你有两种选择,1.用传统的机器学习训练,2.利用迁移学习在一个预训练的模型上训练…...
蓝桥杯每日一题2023.11.20
题目描述 “蓝桥杯”练习系统 (lanqiao.cn) 题目分析 方法一:暴力枚举,如果说数字不在正确的位置上也就意味着这个数必须要改变,进行改变记录即可 #include<bits/stdc.h> using namespace std; const int N 2e5 10; int n, a[N], …...
Vim 调用外部命令学习笔记
Vim 外部命令集成完全指南 文章目录 Vim 外部命令集成完全指南核心概念理解命令语法解析语法对比 常用外部命令详解文本排序与去重文本筛选与搜索高级 grep 搜索技巧文本替换与编辑字符处理高级文本处理编程语言处理其他实用命令 范围操作示例指定行范围处理复合命令示例 实用技…...
测试微信模版消息推送
进入“开发接口管理”--“公众平台测试账号”,无需申请公众账号、可在测试账号中体验并测试微信公众平台所有高级接口。 获取access_token: 自定义模版消息: 关注测试号:扫二维码关注测试号。 发送模版消息: import requests da…...
黑马Mybatis
Mybatis 表现层:页面展示 业务层:逻辑处理 持久层:持久数据化保存 在这里插入图片描述 Mybatis快速入门 医院信息管理系统
医院信息管理系统 1. 课程设计内容 在 visual studio 2017 平台上,开发一个“医院信息管理系统”Web 程序。 2. 课程设计目的 综合运用 c#.net 知识,在 vs 2017 平台上,进行 ASP.NET 应用程序和简易网站的开发;初步熟悉开发一…...
2024年赣州旅游投资集团社会招聘笔试真
2024年赣州旅游投资集团社会招聘笔试真 题 ( 满 分 1 0 0 分 时 间 1 2 0 分 钟 ) 一、单选题(每题只有一个正确答案,答错、不答或多答均不得分) 1.纪要的特点不包括()。 A.概括重点 B.指导传达 C. 客观纪实 D.有言必录 【答案】: D 2.1864年,()预言了电磁波的存在,并指出…...
【ROS】Nav2源码之nav2_behavior_tree-行为树节点列表
1、行为树节点分类 在 Nav2(Navigation2)的行为树框架中,行为树节点插件按照功能分为 Action(动作节点)、Condition(条件节点)、Control(控制节点) 和 Decorator(装饰节点) 四类。 1.1 动作节点 Action 执行具体的机器人操作或任务,直接与硬件、传感器或外部系统…...
P3 QT项目----记事本(3.8)
3.8 记事本项目总结 项目源码 1.main.cpp #include "widget.h" #include <QApplication> int main(int argc, char *argv[]) {QApplication a(argc, argv);Widget w;w.show();return a.exec(); } 2.widget.cpp #include "widget.h" #include &q…...
基于Docker Compose部署Java微服务项目
一. 创建根项目 根项目(父项目)主要用于依赖管理 一些需要注意的点: 打包方式需要为 pom<modules>里需要注册子模块不要引入maven的打包插件,否则打包时会出问题 <?xml version"1.0" encoding"UTF-8…...
Caliper 配置文件解析:config.yaml
Caliper 是一个区块链性能基准测试工具,用于评估不同区块链平台的性能。下面我将详细解释你提供的 fisco-bcos.json 文件结构,并说明它与 config.yaml 文件的关系。 fisco-bcos.json 文件解析 这个文件是针对 FISCO-BCOS 区块链网络的 Caliper 配置文件,主要包含以下几个部…...
AI,如何重构理解、匹配与决策?
AI 时代,我们如何理解消费? 作者|王彬 封面|Unplash 人们通过信息理解世界。 曾几何时,PC 与移动互联网重塑了人们的购物路径:信息变得唾手可得,商品决策变得高度依赖内容。 但 AI 时代的来…...
