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

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

文章目录

  • 一、SM2校验理论基础
  • 二、SM2签名校验开发实例(C++)

一、SM2校验理论基础

SM2的校验过程是使用椭圆曲线上的公钥验证签名的有效性。以下是SM2校验的理论基础相关知识点:

  1. SM2签名算法: SM2的校验基于椭圆曲线数字签名算法(ECDSA)。在签名算法中,签名者使用私钥对消息的哈希值进行签名,而验证者使用相应的公钥、签名值和消息的哈希值进行验证。

  2. 公钥验证签名: SM2签名校验的核心在于使用签名者的公钥对签名值进行验证。只有持有私钥的一方才能够生成有效的签名,而任何人都可以使用相应的公钥验证签名的有效性。

  3. 椭圆曲线运算: 校验过程中涉及到椭圆曲线上的数学运算,包括点的加法、点的乘法等。这些运算是基于椭圆曲线离散对数问题的难解性来保障安全性。

  4. 消息摘要算法: SM2签名使用消息摘要算法对原始消息进行哈希,通常采用SM3算法。在校验过程中,验证者也需要使用相同的哈希算法对接收到的消息进行哈希。

  5. 椭圆曲线的离散对数问题: ECC的安全性基于椭圆曲线上的离散对数问题的难解性。在校验过程中,验证者需要执行椭圆曲线运算,确保签名值与消息的哈希值匹配。

  6. SM2校验流程:

    • 选择椭圆曲线参数。
    • 生成公钥。
    • 获取签名值、消息的哈希值和公钥。
    • 使用椭圆曲线运算验证签名的有效性。
  7. 随机数生成: 随机数的生成在签名的校验中通常不涉及,因为验证者只需要使用公钥进行椭圆曲线运算。

  8. 校验结果: 如果校验成功,说明签名是由持有相应私钥的一方生成的,消息在传输过程中没有被篡改,校验者可以信任消息的完整性和真实性。

理解这些基础知识点有助于深入了解SM2校验的工作原理和安全性。在实际应用中,确保正确管理公钥,处理错误和异常情况,并根据具体需求进行适当的安全性考虑。

二、SM2签名校验开发实例(C++)

在Linux环境下使用C++和OpenSSL库进行SM2签名校验的示例代码如下。请注意,这里的公钥和签名数据是预先准备好的,你需要替换为你实际的公钥、签名和消息哈希值。

#include <openssl/evp.h>
#include <openssl/sm2.h>
#include <openssl/pem.h>int main() {EVP_PKEY* pubKey = EVP_PKEY_new();FILE* publicKeyFile = fopen("public_key.pem", "r");// 从文件中加载公钥if (!PEM_read_PUBKEY(publicKeyFile, &pubKey, NULL, NULL)) {perror("Error loading public key");return 1;}fclose(publicKeyFile);// 待验证的签名const char* signatureHex = "3046022100...";const char* messageHex = "e1e2a1...";// 将十六进制的签名和消息哈希值转换为二进制数据unsigned char* signature;unsigned char* messageHash;size_t sigLen, hashLen;sigLen = strlen(signatureHex) / 2;hashLen = strlen(messageHex) / 2;signature = (unsigned char*)malloc(sigLen);messageHash = (unsigned char*)malloc(hashLen);if (!signature || !messageHash) {perror("Memory allocation error");return 1;}if (hex2bin(signatureHex, signature, sigLen) != 0 ||hex2bin(messageHex, messageHash, hashLen) != 0) {perror("Error converting hex to binary");free(signature);free(messageHash);return 1;}// 创建 SM2 验签上下文EVP_MD_CTX* ctx = EVP_MD_CTX_new();EVP_MD_CTX_init(ctx);// 选择 SM3 摘要算法const EVP_MD* md = EVP_sm3();// 初始化验签if (!EVP_DigestVerifyInit(ctx, NULL, md, NULL, pubKey)) {perror("Error initializing verification");free(signature);free(messageHash);return 1;}// 添加待验证的消息if (!EVP_DigestVerifyUpdate(ctx, messageHash, hashLen)) {perror("Error updating verification");free(signature);free(messageHash);return 1;}// 执行验签int result = EVP_DigestVerifyFinal(ctx, signature, sigLen);// 输出验签结果if (result == 1) {printf("Signature verification successful\n");} else {printf("Signature verification failed\n");}// 释放资源EVP_MD_CTX_free(ctx);EVP_PKEY_free(pubKey);free(signature);free(messageHash);return 0;
}

请确保替换public_key.pemsignatureHexmessageHex为你实际使用的公钥文件、签名和消息哈希值。这个示例中的hex2bin函数用于将十六进制字符串转换为二进制数据,你可以根据需要实现或使用现有的实现。

相关文章:

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

文章目录 一、SM2校验理论基础二、SM2签名校验开发实例&#xff08;C&#xff09; 一、SM2校验理论基础 SM2的校验过程是使用椭圆曲线上的公钥验证签名的有效性。以下是SM2校验的理论基础相关知识点&#xff1a; SM2签名算法&#xff1a; SM2的校验基于椭圆曲线数字签名算法&a…...

有关Vue、微信小程序、UniApp中的CSS中的宽度width单位、自适应

在Vue中&#xff0c;可以使用以下单位来设置宽度&#xff08;width&#xff09; 像素&#xff08;px&#xff09;&#xff1a;最常用的单位&#xff0c;表示一个绝对长度单位。例如&#xff0c;width: 200px; 表示宽度为200像素。百分比&#xff08;%&#xff09;&#xff1a;…...

黑马React18: ReactRouter

黑马React: ReactRouter Date: November 21, 2023 Sum: React路由基础、路由导航、导航传参、嵌套路由配置 路由快速上手 1. 什么是前端路由 一个路径 path 对应一个组件 component 当我们在浏览器中访问一个 path 的时候&#xff0c;path 对应的组件会在页面中进行渲染 2. …...

算法刷题-动态规划-1

算法刷题-动态规划-1 不同路径不同路径||方法一&#xff1a;方法二 第N个泰波那契数递归写法滚动数组 三步问题递归操作滚动数组 使用最小画法爬楼梯递归 解码方法方法一方法二&#xff1a;&#xff08;大佬讲解&#xff09; 不同路径 //机器人不同的路径进入到指定的地点 publ…...

分享一篇很就以前的文档-VMware Vsphere菜鸟篇

PS&#xff1a;由于内容是很久以前做的记录&#xff0c;在整理过程中发现了一些问题&#xff0c;简单修改后分享给大家。首先ESXI节点和win7均运行在VMware Workstation上面&#xff0c;属于是最底层&#xff0c;而新创建的CentOS则是嵌套后创建的操作系统&#xff0c;这点希望…...

QT中的lambda表达式

面是对Qt中在QObject::connect()中的lambda表达式常用用法 QString str("I am a string!"); devicestr; connect(ui- connect(m_imgshowUI, &ImgShow::GetImgPath, m_visionplatform, [](const std::string filename){m_visionplatform->ReadImg(filename);}…...

linux文件I/O:文件锁的概念、函数以及代码实现

文件锁是一种用来保证多个进程对同一个文件的安全访问的机制。文件锁可以分为两种类型&#xff1a;建议性锁和强制性锁。建议性锁是一种协作式的锁&#xff0c;它只有在所有参与的进程都遵守锁的规则时才有效。强制性锁是一种强制式的锁&#xff0c;它由内核或文件系统来强制执…...

MySQL数据库系统教程

目录 基础篇 通用语法及分类 DDL&#xff08;数据定义语言&#xff09; 数据库操作 表操作 DML&#xff08;数据操作语言&#xff09; 添加数据 更新和删除数据 DQL&#xff08;数据查询语言&#xff09; 基础查询 条件查询 聚合查询&#xff08;聚合函数&#xff0…...

这样写postman实现参数化,阿里p8都直呼牛逼

什么时候会用到参数化 比如&#xff1a;一个模块要用多组不同数据进行测试 验证业务的正确性 Login模块&#xff1a;正确的用户名&#xff0c;密码 成功&#xff1b;错误的用户名&#xff0c;正确的密码 失败 postman实现参数化 在实际的接口测试中&#xff0c;部分参数…...

【Qt-25】控件篇

一、comboBox控件 1、获取item数量 ui->comboBox_2->count(); 2、根据索引值获取文本 ui->comboBox->itemText(i); 3、调整当前显示文本内容 ui->comboBox->setCurrentIndex(j); 4、添加item ui->comboBox->addItem("");//添加一个内…...

《算法通关村——反转字符串中的单词问题解析》

《算法通关村——反转字符串中的单词问题解析》 151. 反转字符串中的单词 给你一个字符串 s &#xff0c;请你反转字符串中 单词 的顺序。 单词 是由非空格字符组成的字符串。s 中使用至少一个空格将字符串中的 单词 分隔开。 返回 单词 顺序颠倒且 单词 之间用单个空格连接…...

C++使用Tensorflow2.6训练好的模型进行预测

要在C语言中调用训练好的TensorFlow模型,需要使用TensorFlow C API。 https://tensorflow.google.cn/install/lang_c?hl=zh-cnten TensorFlow 提供了一个 C API,该 API 可用于为其他语言构建绑定。该 API 在 c_api.h 中定义,旨在实现简洁性和一致性,而不是便利性。 下载…...

5-1 Java 网络编程

第1关&#xff1a;URL类与InetAddress类 任务描述 本关任务&#xff1a;了解网络编程基础知识。 相关知识 为了完成本关任务&#xff0c;你需要掌握&#xff1a;1.URL&#xff1b;2.InetAddress。 URL 统一资源定位符&#xff08;Uniform Resource Locator&#xff0c;缩…...

汇编-CALL和RET指令

CALL指令调用一个过程&#xff0c; 使处理器从新的内存位置开始执行。过程使用RET(从过程返回) 指令将处理器转回到该过程被调用的程序点上。 CALL指令的动作&#xff1a; 1.将CALL指令的下一条指令地址压栈(作为子过程返回的地址) 2.将被调过程的地址复制到指令指针寄存器E…...

STM32_5(中断)

中断系统 中断&#xff1a;在主程序运行过程中&#xff0c;出现了特定的中断触发条件&#xff08;中断源&#xff09;&#xff0c;使得CPU暂停当前正在运行的程序&#xff0c;转而去处理中断程序&#xff0c;处理完成后又返回原来被暂停的位置继续运行中断优先级&#xff1a;当…...

docker 部署hbase 并且java Api连接

首先先运行容器 docker run -d --name hbase -p 2181:2181 -p 16010:16010 -p16000:16000 -p 16020:16020 -p 16030:16030 harisekhon/hbase2.在本机的hosts中注册docker的id 因为docker内部集成了其他环境而其他环境 中的ip是docker id 所以需要在hosts中转换 192.168.80.120…...

EasyExcel listener无法通过Autowired注入xxMapper

easyexcel listener无法通过Autowired注入xxMapper 文章目录 easyexcel listener无法通过Autowired注入xxMapperbug记录&#xff1a;解决方案&#xff1a;easyexcel 使用例子controllerServiceImpllistener bug记录&#xff1a; productMapper注入一直为null,而procureDetailM…...

Android Spannable 使用​注意事项

1、当前示例中间的 "评论"&#xff0c;使用SpannableStringBuilder实现&#xff0c;点击评论会有高亮效果加粗&#xff0c;但再点击其它Bar时无法恢复默认样式。 2、因为SpannableString或SpannableStringBuilder中的效果是叠加的&#xff0c;恢复默认样式需要先移除…...

Apache访问控制

服务器相关的访问控制 Options指令 Options指令是Apache服务器配置文件中的一个重要指令,它可以用于控制特定目录启用哪些服务器特性。Options指令可以在Apache服务器的核心配置、虚拟主机配置、特定目录配置以及.htaccess文件中使用。 以下是一些常用的服务器特性选项: N…...

二、类与对象(二)

8 this指针 8.1 this指针的引入 我们先来定义一个日期的类Date&#xff1a; #include <iostream> using namespace std; class Date { public:void Init(int year, int month, int day){_year year;_month month;_day day;}void Print(){cout << _year <&l…...

可学习小波卷积一维信号异常诊断【附代码】

✨ 本团队擅长数据搜集与处理、建模仿真、程序设计、仿真代码、EI、SCI写作与指导&#xff0c;毕业论文、期刊论文经验交流。 ✅ 专业定制毕设、代码 ✅ 如需沟通交流&#xff0c;查看文章底部二维码&#xff08;1&#xff09;参数化连续小波变换与卷积层融合的预处理模块&…...

手把手教你修改RK3588的DTS,给CPU/GPU/NPU超频或降频(附完整配置流程)

RK3588硬件调频实战&#xff1a;从DTS修改到性能优化的完整指南 在嵌入式开发领域&#xff0c;性能调优一直是开发者关注的焦点。RK3588作为Rockchip旗下的旗舰级SoC&#xff0c;凭借其强大的CPU/GPU/NPU异构计算能力&#xff0c;在边缘计算、AI推理和多媒体处理等领域大放异彩…...

避坑指南:Realme手机MTK深刷时,如何避免掉基带、IMEI和端口锁问题?

Realme手机MTK深刷避坑实战手册&#xff1a;基带/IMEI/端口锁防护指南 当你手握一台Realme GT Neo系列手机&#xff0c;面对SP Flash Tool界面上密密麻麻的选项时&#xff0c;那种既兴奋又忐忑的心情我太熟悉了。三年前我第一次尝试深刷RMX3031时&#xff0c;就曾因为勾选了&qu…...

Awesome ChatGPT Store安全指南:保护你的定制GPTs指令不被泄露

Awesome ChatGPT Store安全指南&#xff1a;保护你的定制GPTs指令不被泄露 【免费下载链接】awesome-chatgpt-store A curated list of awesome GPTs in the GPT Store 项目地址: https://gitcode.com/gh_mirrors/aw/awesome-chatgpt-store 在当今AI驱动的数字时代&…...

Stencil样式变量管理终极指南:构建灵活的主题系统与动态样式切换

Stencil样式变量管理终极指南&#xff1a;构建灵活的主题系统与动态样式切换 【免费下载链接】stencil A toolchain for building scalable, enterprise-ready component systems on top of TypeScript and Web Component standards. Stencil components can be distributed na…...

自主智能体的自指内生描述与自适应规则生成(世毫九实验室AGI子系统)

自主智能体的自指内生描述与自适应规则生成方见华 世毫九实验室 摘要 当前的主流强化学习与自主智能体系统缺乏内生的自我认知能力&#xff1a;它们对自身的理解完全依赖人类定义的外部标签&#xff0c;而非来自对自身行为历史的内生建模。本文试图回答一个核心问题——如果一个…...

世纪华通年营收379亿:净利56亿 同比增362% 拟投资60亿理财

雷递网 雷建平 4月29日浙江世纪华通集团股份有限公司&#xff08;证券代码&#xff1a;002602 证券简称&#xff1a;世纪华通&#xff09;今日发布2025年的年报。年报显示&#xff0c;世纪华通2025年营收为379亿元&#xff0c;较上年同期的226亿元增长67.55%。世纪华通2025年净…...

压缩机灰铁液压油泵ACF 080K4 IVFE

ACF定做螺杆泵 进口润滑油泵维修附带对轮螺杆泵&#xff0c;以其独特的结构和工作原理&#xff0c;在工业领域有着广泛的应用。而ACF进口螺杆泵&#xff0c;则在此基础上更进一步&#xff0c;根据客户的具体工况、介质特性、流量压力等要求&#xff0c;进行精准的设计和制造。无…...

Tidyverse 2.0正式发布后,92%的数据科学家还没掌握的5个自动化报告新范式:从手动渲染到CI/CD集成

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;Tidyverse 2.0自动化报告的核心演进与范式跃迁 Tidyverse 2.0 不再是工具包的简单叠加&#xff0c;而是一次以“声明式报告流”&#xff08;Declarative Reporting Flow&#xff09;为内核的范式重构。…...

【车辆控制】基于电动车静态PID与动态(动学地平线)自适应巡航控制策略的比较分析附Matlab代码

​✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;擅长毕业设计辅导、数学建模、数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。&#x1f34e; 往期回顾关注个人主页&#xff1a;Matlab科研工作室&#x1f447; 关注我领取海量matlab电子书…...