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

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.xdnf.cn/news/1408807.html

相关文章:

  • 科普:requirements.txt 和 environment.yml
  • Labview使用modbus或S7与PLC通信
  • Machine Learning HW3 report:图像分类(Hongyi Lee)
  • 《深入剖析Kafka分布式消息队列架构奥秘》之Springboot集成Kafka
  • 中级统计师-统计实务-第四章 专业统计
  • 嵌入式ARM程序高级调试技能:20.qemu arm ARM Linux 上 addr2line 的实际应用示例
  • 【重学MySQL】九十五、Linux 下 MySQL 大小写规则设置详解
  • CF每日3题(1500-1600)
  • 阿里云创建自己的博客,部署wordpress
  • 基于Matlab元胞自动机的强场电离过程模拟与ADK模型分析
  • Scikit-learn Python机器学习 - 数据集的划分
  • 网格图--Day03--网格图DFS--2658. 网格图中鱼的最大数目,1034. 边界着色,1020. 飞地的数量
  • Cartographer中的gflag与lua文件
  • 【开题答辩全过程】以 基于Java的城市公交查询系统设计与实现为例,包含答辩的问题和答案
  • 记录测试环境hertzbeat压测cpu高,oom问题排查。jvm,mat,visulavm
  • 浏览器和 node 操作文件的 api 以及区别
  • GEE 实战:Landsat 5 月度 NDVI 数据插值填补(以 8 月为例)_后附完整代码
  • Python:如何批量下载CLMS NDVI V3数据集?
  • PyQt5 K线图实现与性能优化详解
  • 神州数码之FTP/TFTP 升级 篇
  • 深入解析Linux系统中的/etc/hosts文件
  • 在Windows的wsl中如何以root登录Ubuntu
  • OpenStack 02:使用 DevStack 单节点一体化部署
  • Kafka面试精讲 Day 3:Producer生产者原理与配置
  • Java提供高效后端支撑,Vue呈现直观交互界面,共同打造的MES管理系统,含完整可运行源码,实现生产计划、执行、追溯一站式管理,提升制造执行效率
  • isp图像处理--bayer Binning
  • isp 图像处理--DPC坏点矫正
  • 张柏芝亮相林家谦演唱会 再次演绎《任何天气》
  • 秋招笔记-8.31
  • 【ACP】2025-最新-疑难题解析- 练习一汇总