当前位置: 首页 > 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.dtcms.com/a/359367.html

相关文章:

  • Linux中卸载和安装Nginx
  • 第24章学习笔记|用正则表达式解析文本文件(PowerShell 实战)
  • Git版本管理工具零基础学习
  • ThinkPHP8学习篇(五):数据库(一)
  • windows docker 中的mysql 无法被外部浏览器访问如何解决
  • windows环境下安装dify到本地
  • 线程池、锁策略
  • Qt中UDP回显服务器和客户端
  • 第三十二天:数组
  • 如何保证redis和mysql的数据一致性
  • Spring Boot 3.x 微服务架构实战指南
  • 基于单片机停车场管理系统/车位管理/智慧停车系统
  • 大模型——xAI 发布 Grok Code Fast 1 编程模型,快、便宜、免费
  • 华为研发投资与管理实践(IPD)读书笔记
  • 第六章:透明度-Transparency《Unity Shaders and Effets Cookbook》
  • 机器视觉学习-day14-绘制图像轮廓
  • 基于Spring Cloud Sleuth与Zipkin的分布式链路追踪实战指南
  • 《深入剖析Kafka分布式消息队列架构奥秘》之Springboot集成Kafka
  • 【重学MySQL】九十四、MySQL请求到响应过程中字符集的变化
  • html添加水印
  • 馈电油耗讲解
  • 特殊符号在Html中的代码及常用标签格式的记录
  • Spring Task快速上手
  • 【多模态】使用LLM生成html图表
  • 【 复习SpringBoot 核心内容 | 配置优先级、Bean 管理与底层原理(起步依赖 + 自动配置) 】
  • 堆排序:高效稳定的大数据排序法
  • Kubernetes 服务发现与健康检查详解
  • 解锁GPU计算潜能:深入浅出CUDA架构与编程模型
  • ESP32学习笔记_Peripherals(5)——SPI主机通信
  • Asible——将文件部署到受管主机和管理复杂的Play和Playbook