当前位置: 首页 > news >正文

openssl+ SM2 + linux 签名开发实例(C++)

文章目录

  • 一、SM2 签名理论基础
  • 二、SM2签名开发实例

一、SM2 签名理论基础

SM2是中国国家密码管理局发布的椭圆曲线密码算法标准,用于数字签名、密钥交换和公钥加密等安全通信场景。以下是SM2签名的理论基础相关知识点:

  1. 椭圆曲线密码学(Elliptic Curve Cryptography,ECC): SM2基于椭圆曲线密码学,该密码学利用椭圆曲线上的数学运算实现加密和签名。椭圆曲线的选择对于安全性至关重要。

  2. SM2签名算法: SM2签名算法采用基于椭圆曲线的数字签名算法(ECDSA)。签名过程涉及到私钥的使用和椭圆曲线上的数学运算。

  3. 椭圆曲线参数: SM2使用了特定的椭圆曲线参数,包括椭圆曲线方程、基点坐标、曲线上的素数阶数等。这些参数在标准中有详细规定。

  4. 椭圆曲线的离散对数问题: ECC的安全性基于椭圆曲线上的离散对数问题的难解性,即在给定椭圆曲线参数和基点的情况下,计算离散对数是困难的。

  5. SM2签名流程:

    • 选择椭圆曲线参数。
    • 生成随机数作为私钥。
    • 利用椭圆曲线上的点乘法计算公钥。
    • 签名者使用私钥和消息的哈希值进行签名,得到签名值。
    • 验证者使用签名值、公钥和消息的哈希值进行验证。
  6. SM2签名验证: 验证SM2签名的过程是使用签名者的公钥、签名值和消息的哈希值进行一系列的椭圆曲线运算,最终验证签名的有效性。

  7. 消息摘要算法: SM2签名使用消息摘要算法对原始消息进行哈希,通常采用SM3算法。

  8. 随机数生成: 随机数在SM2签名中的生成对于私钥的安全性至关重要。伪随机数生成器的质量直接影响签名的安全性。

  9. SM2签名安全性: SM2签名的安全性基于椭圆曲线的数学困难问题,如离散对数问题。在选择椭圆曲线参数时需要确保足够的安全强度。

这些知识点构成了SM2签名的理论基础,理解这些基础概念有助于深入了解SM2签名算法的工作原理和安全性。

二、SM2签名开发实例

要在Linux环境下使用C++和OpenSSL库实现SM2签名,你可以按照以下步骤进行:

  1. 安装 OpenSSL: 确保你的系统上已经安装了 OpenSSL 库。可以使用包管理器进行安装,例如在 Ubuntu 上可以使用以下命令:

    sudo apt-get install libssl-dev
    
  2. 创建 C++ 项目: 创建一个新的 C++ 项目,并确保项目的编译脚本中包含 OpenSSL 库的链接。

  3. 编写 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;
    }
    

    请注意,这只是一个简单的示例,实际应用中需要适应你的具体需求,例如加载公钥、处理错误等。

  4. 编译和运行: 使用适当的编译器和选项来编译你的代码。例如,使用 g++ 编译上述代码:

    g++ -o sm2_sign sm2_sign.cpp -lssl -lcrypto
    

    然后运行可执行文件:

    ./sm2_sign
    

请注意,私钥文件 private_key.pem 需要事先准备好,它包含了用于签名的私钥信息。确保你在实际应用中妥善管理密钥,并且根据你的具体情况进行适当的错误处理和安全性考虑。

相关文章:

openssl+ SM2 + linux 签名开发实例(C++)

文章目录 一、SM2 签名理论基础二、SM2签名开发实例 一、SM2 签名理论基础 SM2是中国国家密码管理局发布的椭圆曲线密码算法标准&#xff0c;用于数字签名、密钥交换和公钥加密等安全通信场景。以下是SM2签名的理论基础相关知识点&#xff1a; 椭圆曲线密码学&#xff08;Elli…...

U4_1:图论之DFS/BFS/TS/Scc

文章目录 一、图的基本概念二、广度优先搜索&#xff08;BFS&#xff09;记录伪代码时间复杂度流程应用 三、深度优先搜索&#xff08;DFS&#xff09;记录伪代码时间复杂度流程时间戳结构BFS和DFS比较 四、拓扑排序一些概念有向图作用拓扑排序 分析伪代码时间复杂度彩蛋 五、强…...

STM32框架之按键扫描新思路

STM32框架之按键扫描新思路 引入代码展示思路分析 我们学习了定时器实现毫秒级/秒级任务框架&#xff0c;这期我们基于任务框架学习按键扫描新思路。 引入 在按键扫描的过程中&#xff0c;最重要的一步就是按键消抖&#xff0c;解决的方法最简单粗暴的就是先扫描一次按键状态&…...

完美解决k8s master节点无法ping node节点中的IP或Service NodePort的IP

1、问题一 使用搭建好了K8S集群&#xff0c;先是node节点加入k8s集群时&#xff0c;用的内网IP&#xff0c;导致master节点无法操作node节点中的pod&#xff08;这里的不能操作&#xff0c;指定是无法查看node节点中pod的日志、启动描述、无法进入pod内部&#xff0c;即 kubec…...

弗洛伊德算法(C++)

目录 介绍&#xff1a; 代码&#xff1a; 结果&#xff1a; 介绍&#xff1a; 弗洛伊德算法&#xff08;Floyd algorithm&#xff09;也称为Floyd-Warshall算法&#xff0c;是一种用于求解所有节点对之间的最短路径的动态规划算法。它使用了一个二维数组来存储所有节点…...

相对定位、绝对定位、固定定位、绝对定位堆叠顺序

相对定位&#xff1a;相对自己本身进行偏移 CSS语法&#xff1a; position: relative;/*相对自己进行定位*/ top: 10px;/*距离上边*/ left: 10px;/*距离左边*/ 演示图&#xff1a; 绝对定位&#xff1a;默认以浏览器进行定位。如果想依照父盒子定位&#xff0c;需要在父盒子…...

px4+vio实现无人机室内定位

文章主要讲述px4 如何利用vins_fusion里程计数据实现在室内定位功能。 文章基于以下软、硬件展开。 硬件软件机载电脑&#xff1a; Intel NUC系统&#xff1a;Ubuntu 20.04相机&#xff1a; Intel Realsense D435iros&#xff1a;noetic飞控&#xff1a;Pixhawk 2.4.8固件&am…...

享元模式 rust和java的实现

文章目录 享元模式介绍实现javarust实现代码 rust仓库rust仓库 享元模式 享元模式&#xff08;Flyweight Pattern&#xff09;主要用于减少创建对象的数量&#xff0c;以减少内存占用和提高性能。这种类型的设计模式属于结构型模式&#xff0c;它提供了减少对象数量从而改善应…...

XmlElement注解在Java的数组属性上,以产生多个相同的XML元素

例如&#xff0c;下面这段XML数据&#xff0c;有多个data元素&#xff0c;并且它们级别相同: <?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函数 结果空间不足&#xff0c;无法将 money 值转换为 varchar。 可以强转 select FORMAT(CAST ( round( ‘-8926143870680.62000000’, 2 ) AS N…...

说说mvc和mvvm的区别和联系

mvvm 与mvc mvvm 与mvcmvc和mvvm的区别和联系 举例说明mvvm与mvc MVC是一种用于构建应用程序的架构模式&#xff0c;它也将应用程序的逻辑和界面分离。它由三个主要组件组成&#xff1a; 模型&#xff08;Model&#xff09;&#xff1a;表示应用程序的数据和业务逻辑。视图&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&#xfffd; 种物品和一个容量是 V&#xfffd; 的背包。 第 i&#xfffd; 种物品最多有 si&#xfffd;&#xfffd; 件&#xff0c;每件体积是 vi&#xfffd;&#xfffd;&#xff0c;价值是 wi&#xfffd;&#xfffd;。 求解将哪些物品装入背包&#xff0c;可使物…...

解决selenium使用chrome下载文件(如pdf)时,反而打开浏览器的预览界面

文章目录 解决方法完整的配置 解决方法 在初始化浏览器的时候&#xff0c;添加以下配置即可&#xff1a; option webdriver.ChromeOptions()prefs {"profile.managed_default_content_settings.images": 2, # 禁止加载图片# permissions.default.stylesheet: 2, …...

2024年山东省职业院校技能大赛中职组“网络安全”赛项竞赛试题-C

2024年山东省职业院校技能大赛中职组 “网络安全”赛项竞赛试题-C 一、竞赛时间 总计&#xff1a;360分钟 二、竞赛阶段 竞赛阶段 任务阶段 竞赛任务 竞赛时间 分值 A、B模块 A-1 登录安全加固 180分钟 200分 A-2 本地安全策略设置 A-3 流量完整性保护 A-4 …...

基于Python实现用于实时监控和分析 MySQL 服务器的性能指标和相关信息工具源码

MySQL命令行监控工具 - mysqlstat 介绍 mysqlstat 是一个命令行工具&#xff0c;用于实时监控和分析 MySQL 服务器的性能指标和相关信息。 它可以帮助 DBA&#xff08;数据库管理员&#xff09;和开发人员定位和解决数据库性能问题。 以下是 mysqlstat 工具的主要功能&#…...

Android 10-13鼠标右键返回功能适配

Android 10-13鼠标右键返回功能适配 文章目录 Android 10-13鼠标右键返回功能适配一、前言二、鼠标右键适配修改1、Android 10 以及更低版本2、Android11 或者更高版本三、总结1、鼠标右键返回功能修改主要代码2、标右键返回修改代码系统源码搜索3、其他 一、前言 Android 原生…...

51单片机/STM32F103/STM32F407学习1_点亮LED灯

目录&#xff1a; 基础知识单片机从0实现单片机GPIO介绍 参考连接&#xff1a; 野火霸天虎教程 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. 背景 有些场景下&#xff0c;开始的时候数据量很小&#xff0c;如果我们用一个几千条数据训练一个全新的深度机器学习的文本分类模型&#xff0c;效果不会很好。这个时候你有两种选择&#xff0c;1.用传统的机器学习训练&#xff0c;2.利用迁移学习在一个预训练的模型上训练…...

蓝桥杯每日一题2023.11.20

题目描述 “蓝桥杯”练习系统 (lanqiao.cn) 题目分析 方法一&#xff1a;暴力枚举&#xff0c;如果说数字不在正确的位置上也就意味着这个数必须要改变&#xff0c;进行改变记录即可 #include<bits/stdc.h> using namespace std; const int N 2e5 10; int n, a[N], …...

突破音乐限制:3分钟解锁QQ音乐加密格式的终极Mac解决方案

突破音乐限制&#xff1a;3分钟解锁QQ音乐加密格式的终极Mac解决方案 【免费下载链接】QMCDecode QQ音乐QMC格式转换为普通格式(qmcflac转flac&#xff0c;qmc0,qmc3转mp3, mflac,mflac0等转flac)&#xff0c;仅支持macOS&#xff0c;可自动识别到QQ音乐下载目录&#xff0c;默…...

三步告别蓝奏云下载烦恼:LanzouAPI开源解析方案完全指南

三步告别蓝奏云下载烦恼&#xff1a;LanzouAPI开源解析方案完全指南 【免费下载链接】LanzouAPI 蓝奏云直链&#xff0c;蓝奏api&#xff0c;蓝奏解析&#xff0c;蓝奏云解析API&#xff0c;蓝奏云带密码解析 项目地址: https://gitcode.com/gh_mirrors/la/LanzouAPI 你…...

ComfyUI ControlNet预处理器:5分钟掌握AI图像精准控制技术

ComfyUI ControlNet预处理器&#xff1a;5分钟掌握AI图像精准控制技术 【免费下载链接】comfyui_controlnet_aux ComfyUIs ControlNet Auxiliary Preprocessors 项目地址: https://gitcode.com/gh_mirrors/co/comfyui_controlnet_aux 想要让AI图像生成完全按照你的想法来…...

如何实现魔兽争霸3终极兼容性修复:WarcraftHelper完整技术指南

如何实现魔兽争霸3终极兼容性修复&#xff1a;WarcraftHelper完整技术指南 【免费下载链接】WarcraftHelper Warcraft III Helper , support 1.20e, 1.24e, 1.26a, 1.27a, 1.27b 项目地址: https://gitcode.com/gh_mirrors/wa/WarcraftHelper 魔兽争霸3作为经典的即时战…...

Deno Deploy部署Azure OpenAI代理:零成本解决API兼容问题

1. 项目概述&#xff1a;在Deno Deploy上搭建一个免费的Azure OpenAI代理如果你正在折腾各种开源的ChatGPT WebUI项目&#xff0c;比如ChatGPT-Next-Web、Lobe Chat&#xff0c;或者想在自己的应用里集成GPT能力&#xff0c;大概率会遇到一个头疼的问题&#xff1a;这些项目默认…...

从硬件分压到软件查表:手把手教你为你的Arduino/STM32项目添加精准电量显示功能

从硬件分压到软件查表&#xff1a;手把手教你为Arduino/STM32项目添加精准电量显示 在创客项目中&#xff0c;电池供电设备的电量显示一直是个既基础又关键的痛点。想象你正在调试一台自制的便携气象站&#xff0c;突然断电导致数据丢失&#xff1b;或是遥控车在关键时刻电量耗…...

如何精准诊断并解决机械键盘连击问题:Keyboard Chatter Blocker深度配置指南

如何精准诊断并解决机械键盘连击问题&#xff1a;Keyboard Chatter Blocker深度配置指南 【免费下载链接】KeyboardChatterBlocker A handy quick tool for blocking mechanical keyboard chatter. 项目地址: https://gitcode.com/gh_mirrors/ke/KeyboardChatterBlocker …...

C++面向对象编程之继承

目录 一、继承的概念及定义 1.1 继承的基本概念 1.2 继承的定义与访问方式 1.2.1 定义格式 1.2.2 继承方式与访问权限 1.3 继承类模板 二、基类与派生类的转换 2.1 向上转型&#xff08;Upcasting&#xff09; 2.2 向下转型&#xff08;Downcasting&#xff09; 三、…...

Driver Store Explorer:5分钟掌握Windows驱动管理的终极免费方案

Driver Store Explorer&#xff1a;5分钟掌握Windows驱动管理的终极免费方案 【免费下载链接】DriverStoreExplorer Driver Store Explorer 项目地址: https://gitcode.com/gh_mirrors/dr/DriverStoreExplorer 您是否发现Windows系统运行越来越慢&#xff1f;C盘空间莫名…...

开源工具token-usage-ui:可视化监控LLM API Token用量与成本

1. 项目概述&#xff1a;一个为AI开发者量身打造的Token用量监控利器如果你正在开发基于OpenAI、Anthropic、Azure OpenAI等主流大语言模型API的应用&#xff0c;那么“Token用量”这个指标&#xff0c;你一定不会陌生。它直接关联着你的API调用成本、应用性能&#xff0c;甚至…...