openssl使用SM2进行数据加密和数据解密


一、准备工作

1. 安装依赖

sudo apt-get update
sudo apt-get install libssl-dev

2. 确认 OpenSSL 版本

openssl version

如果是 1.1.13.0+,就支持 SM2/SM3/SM4


二、C 语言示例代码

这个程序会:

  1. 生成 SM2 密钥对
  2. 使用公钥加密一段明文
  3. 使用私钥解密恢复明文
#include <stdio.h>
#include <string.h>
#include <openssl/evp.h>
#include <openssl/ec.h>
#include <openssl/sm2.h>
#include <openssl/pem.h>int main() {EVP_PKEY_CTX *pctx = NULL;EVP_PKEY *pkey = NULL;// ========== 1. 生成 SM2 密钥对 ==========pctx = EVP_PKEY_CTX_new_id(EVP_PKEY_SM2, NULL);if (!pctx) {printf("EVP_PKEY_CTX_new_id failed\n");return -1;}if (EVP_PKEY_keygen_init(pctx) <= 0) {printf("EVP_PKEY_keygen_init failed\n");return -1;}if (EVP_PKEY_keygen(pctx, &pkey) <= 0) {printf("EVP_PKEY_keygen failed\n");return -1;}EVP_PKEY_CTX_free(pctx);printf("SM2 KeyPair generated successfully!\n");// ========== 2. 加密 ==========const char *plaintext = "Hello, SM2 Encryption!";size_t plaintext_len = strlen(plaintext);size_t ciphertext_len = 0;unsigned char *ciphertext = NULL;if (!SM2_encrypt(EVP_sm3(), (const unsigned char*)plaintext, plaintext_len,NULL, &ciphertext_len, pkey)) {printf("SM2_encrypt (get length) failed\n");return -1;}ciphertext = OPENSSL_malloc(ciphertext_len);if (!ciphertext) {printf("malloc failed\n");return -1;}if (!SM2_encrypt(EVP_sm3(), (const unsigned char*)plaintext, plaintext_len,ciphertext, &ciphertext_len, pkey)) {printf("SM2_encrypt failed\n");return -1;}printf("Ciphertext length = %zu\n", ciphertext_len);// ========== 3. 解密 ==========unsigned char *decrypted = OPENSSL_malloc(ciphertext_len);size_t decrypted_len = 0;if (!SM2_decrypt(EVP_sm3(), ciphertext, ciphertext_len,decrypted, &decrypted_len, pkey)) {printf("SM2_decrypt failed\n");return -1;}decrypted[decrypted_len] = '\0'; // 末尾加字符串结束符printf("Decrypted text: %s\n", decrypted);// ========== 4. 释放资源 ==========OPENSSL_free(ciphertext);OPENSSL_free(decrypted);EVP_PKEY_free(pkey);return 0;
}

三、编译与运行

1. 编译

gcc sm2_enc_dec.c -o sm2_enc_dec -lcrypto

2. 运行

./sm2_enc_dec

3. 可能的输出

SM2 KeyPair generated successfully!
Ciphertext length = 115
Decrypted text: Hello, SM2 Encryption!

四、总结

  • EVP_PKEY_keygen() 生成 SM2 密钥对
  • SM2_encrypt() 使用公钥加密
  • SM2_decrypt() 使用私钥解密
  • 这里默认使用 SM3 作为哈希函数(推荐国密组合:SM2+SM3+SM4)

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

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

相关文章

用滑动窗口与线性回归将音频信号转换为“Token”序列:一种简单的音频特征编码方法

在深度学习和语音处理领域&#xff0c;如何将原始音频信号有效地表示为离散的“Token”序列&#xff0c;是语音识别、音频生成等任务中的关键问题。常见的方法如Mel频谱图向量量化&#xff08;VQ&#xff09;、wav2vec等已经非常成熟&#xff0c;但这些模型通常依赖复杂的神经网…

Vue开发准备

vs code VSCode的下载地址https://code.visualstudio.com/Download Node.js node.js的下载地址 https://nodejs.org/zh-cn/download 注意&#xff1a;nodejs安装路径不要和vscode安装到同一个文件夹&#xff0c;两个应用分别装到两个不同的文件夹 npm config set cache &q…

QT6(QFileSystemModel和QTreeView)

QT6QFileSystemModel和QTreeView QFileSystemModel为本机的文件系统提供一个模型&#xff0c;QFileSystemModelt和QTreeView结合使用&#xff0c;可以用目录树的形式显示本机的文件系统&#xff0c;如同Windows的资源管理器一样使用QFileSystemModel提供的接口函数&#xff0c;…

【开题答辩全过程】以 基于Spring Boot的房屋租赁系统的设计与实现为例,包含答辩的问题和答案

个人简介一名14年经验的资深毕设内行人&#xff0c;语言擅长Java、php、微信小程序、Python、Golang、安卓Android等开发项目包括大数据、深度学习、网站、小程序、安卓、算法。平常会做一些项目定制化开发、代码讲解、答辩教学、文档编写、也懂一些降重方面的技巧。感谢大家的…

构建下一代智能金融基础设施

1. 行业背景&#xff1a;从数字支付到可编程金融的范式跃迁全球数字支付市场正以万亿美元的规模持续扩张&#xff0c;但其底层系统仍受限于传统金融的清算、结算延迟和高昂的中间成本。尽管互联网技术提升了支付的便捷性&#xff0c;但其核心仍是中心化账户体系的延伸。Web3 技…

【C++】深入解析C++嵌套依赖类型与typename关键字

什么是嵌套依赖类型&#xff1f;嵌套依赖类型&#xff08;Nested Dependent Type&#xff09;是指在一个模板中&#xff0c;一个类型名称依赖于模板参数&#xff0c;并且是该模板参数内部的嵌套类型。具体来说&#xff0c;当一个类型满足以下两个条件时&#xff0c;它就是嵌套依…

管网信息化监测主要的内容

管网信息化监测是指通过现代信息技术手段对管网系统进行实时监控和数据采集的管理方式。其背景源于城市化进程加快以及基础设施建设规模不断扩大&#xff0c;传统的管网管理模式已无法满足现代化需求。管网信息化监测主要内容包括以下几个方面&#xff1a;█管网运行状态监测&a…

数据泄露代价千万,PII 保护你真的做对了吗?

一、PII—数据隐私的核心概念解析 在大多数数据隐私法律中,可识别个人信息(PII, Personally Identifiable Information)是指任何可以用来识别个人身份的信息。然而,PII 的定义并非由单一法律统一规定,不同国家和地区的法律对其定义略有差异: 各国对 PII 的定义 美国 20…

【数据结构】八大排序之快速排序:分而治之的艺术

文章目录快速排序1.hoare版本算法优化三数取中法小区间优化完整代码如下算法分析时间复杂度空间复杂度2.前后指针法排序过程3.非递归&#xff08;栈模拟&#xff09;实现思路总结快速排序 快速排序是Hoare于1962年提出的一种二叉树结构的交换排序方法&#xff0c;其基本思想为…

在ROS中获取并发布UBS式传感器的温湿度

哈喽大家好&#xff0c;我是钢板兽&#xff01; 今天更新一篇和ROS相关的文章&#xff0c;有个项目需求是在ROS中获取并发布UBS式传感器的温湿度&#xff0c;我使用的温湿度传感器简介如下&#xff1a;DL11- MC-S1 温湿度传感器通过USB 接口采用标准MODBUS RTU 协议通信&#x…

【图论】 Graph.jl 操作汇总

文章目录图论的集合类操作Base.getindexBase.intersectBase.joinBase.reverseBase.reverse!Base.sizeBase.sumBase.sumBase.union图生成与转换Graphs.cartesian_productGraphs.complementGraphs.compute_shiftsGraphs.crosspathGraphs.differenceGraphs.egonetGraphs.induced_s…

【链表 - LeetCode】146. LRU 缓存

146. LRU 缓存 题解&#xff1a; class LRUCache {list<pair<int,int>>v;unordered_map<int,list<pair<int,int>>::iterator>idx;int capacity; public:LRUCache(int capacity):capacity(capacity){}int get(int key) {if(idx.count(key) 0) …

Elasticsearch vs Solr vs OpenSearch:搜索引擎方案对比与索引设计最佳实践

Elasticsearch vs Solr vs OpenSearch&#xff1a;搜索引擎方案对比与索引设计最佳实践 随着大数据和实时分析需求的爆发&#xff0c;搜索引擎已成为许多业务系统中的核心组件。本篇文章将从“技术方案对比分析型”角度切入&#xff0c;重点比较三大主流搜索引擎&#xff1a;El…

光颉科技)Viking)的CS25FTFR009 1225 0.009R/9mR 3W电阻介绍-华年商城

“**华年商城”**小编为您介绍&#xff1a;光颉科技&#xff08;Viking&#xff09;的CS25FTFR009 1225 0.009R/9mR 3W电阻 光颉CS25FTFR009合金电阻&#xff1a;0.009Ω/9mΩ 3W 1%精密采样电阻 光颉科技&#xff08;Viking&#xff09;的CS25FTFR009是一款高性能的电流检测电…

港科大开放世界长时域具身导航!LOVON:足式机器人开放词汇目标导航

作者&#xff1a;Daojie Peng1^{1}1, Jiahang Cao1,2^{1,2}1,2, Qiang Zhang1,2^{1,2}1,2, Jun Ma1,3^{1,3}1,3单位&#xff1a;1^{1}1香港科技大学&#xff08;广州&#xff09;&#xff0c;2^{2}2北京人形机器人创新中心&#xff0c;3^{3}3香港科技大学论文标题&#xff1a;L…

【前端教程】JavaScript 数组对象遍历与数据展示实战

在前端开发中&#xff0c;处理数组和对象是日常工作的基础。无论是篇文章将通过一个具体案例&#xff0c;详细讲解如何使用JavaScript遍历包含对象的数组&#xff0c;并将数据以清晰的格式展示在页面上。我们会从基础语法开始&#xff0c;逐步优化代码&#xff0c;最终实现一个…

无重复字符的最长子串,leetCode热题100,C++实现

题目来源&#xff1a;leetCode 3. 无重复字符的最长子串 - 力扣&#xff08;LeetCode&#xff09; 给定一个字符串 s &#xff0c;请你找出其中不含有重复字符的 最长 子串 的长度。 解法 class Solution { public:int lengthOfLongestSubstring(string s) {unordered_set<…

卷积神经网络中1×1卷积的作用

part I &#xff1a;来源part II &#xff1a;应用part III &#xff1a;作用&#xff08;降维、升维、跨通道交互、增加非线性&#xff09;part IV &#xff1a;从fully-connected layers的角度理解一、来源&#xff1a;[1312.4400] Network In Network &#xff08;如果11…

VMware设置Ubuntu虚拟机桥接模式完整教程

VMware 设置 Ubuntu 虚拟机桥接模式完整教程 下面是一个详细的、避免出错的 VMware Ubuntu 桥接模式设置教程&#xff0c;包含常见问题的解决方案。 准备工作 确保宿主机&#xff08;Windows 11&#xff09;已连接到网络&#xff08;有线或无线&#xff09;确认您有管理员权限关…

浅析NVMe协议:DIF

文章目录概述DIF数据格式盘片支持DIFFormatPILPIMSETLBAF协议命令DIF支持PRACTPRACT0PRACT1PRCHK相关参考概述 NVMe协议将DIF信息作为元数据的一部分进行携带。 DIF数据格式 DIF的PI由多个字段组成&#xff0c;包括&#xff1a; Guard字段&#xff1a;基于逻辑块数据计算的C…