引言

在信息安全领域,密码算法是数据保护的核心基石。2010 年,中国国家密码管理局发布了 SM2 椭圆曲线公钥密码算法,作为国产密码标准的核心成员,它凭借高效安全的特性,逐步替代 RSA 等国际算法,广泛应用于金融、政务、物联网等关键领域。SM2 的诞生不仅是技术突破,更是国家信息安全战略的重要布局。其基于椭圆曲线密码学(ECC)的设计,在同等安全强度下,密钥长度仅为 RSA 的 1/10,运算效率提升数倍。SM2 已成为 ISO/IEC 国际标准,并深度融入国产密码生态体系,为构建安全可靠的网络安全架构提供了坚实支撑。

一、核心功能

SM2算法提供了三大核心功能:非对称加密、数字签名和密钥交换,其设计目标是通过椭圆曲线的数学特性,实现高效且安全的数据保护。

1. 密钥生成

SM2的密钥对由私钥和公钥组成:

  • 私钥:一个256位的随机整数 dd,满足 1≤d≤n−11≤d≤n−1,其中 nn 是椭圆曲线基点 GG 的阶。
  • 公钥:通过椭圆曲线点乘运算生成,即 P=[d]GP=[d]G,结果是一个椭圆曲线上的点 (x,y)(x,y),通常以非压缩格式 04∣∣x∣∣y04∣∣x∣∣y 存储(65字节)。

2. 加密与解密

SM2的加密过程采用混合加密体系,结合非对称加密和对称加密的优点:

  • 加密:生成密文 C=C1∣∣C2∣∣C3C=C1∣∣C2∣∣C3,其中:
    • C1C1:随机数 kk 与基点 GG 的点乘结果 [k]G[k]G,用于生成临时共享密钥。
    • C2C2:明文 MM 通过对称加密(如SM3派生的密钥流)生成的密文。
    • C3C3:通过SM3哈希算法计算的完整性校验值 Hash(x2∣∣M∣∣y2)Hash(x2∣∣M∣∣y2),防止数据篡改。
  • 解密:接收方通过私钥 dd 计算共享密钥,解密 C2C2 并验证 C3C3。

3. 数字签名与验证

SM2的签名机制基于SM3哈希算法和椭圆曲线数学特性:

  • 签名生成:私钥 dd 和随机数 kk 生成签名 (r,s)(r,s),其中 rr 是 [k]G[k]G 的 xx 坐标模 nn,ss 是 (1+d)−1⋅(k−r⋅d)mod  n(1+d)−1⋅(k−r⋅d)modn。
  • 签名验证:通过公钥 PP 和签名参数 (r,s)(r,s) 验证等式 u1⋅G+u2⋅Pu1​⋅G+u2​⋅P 的 xx 坐标是否等于 rr。

4. 密钥交换

SM2通过椭圆曲线Diffie-Hellman(ECDH)变体实现密钥交换:

  • 客户端生成临时密钥对 (dC,QC)(dC​,QC​),服务端使用证书中的公钥 QSQS​ 与 dCdC​ 计算共享密钥,双方通过KDF生成会话密钥。

二、数学原理

SM2算法的安全性建立在**椭圆曲线离散对数问题(ECDLP)**的困难性上。其数学基础包括以下核心参数:

1. 椭圆曲线方程

SM2采用素数域上的椭圆曲线,方程为:

y2=x3+ax+bmod  py2=x3+ax+bmodp

其中:

  • pp:256位大素数,定义有限域 FpFp​。
  • aa、bb:曲线系数,满足 4a3+27b2≠0mod  p4a3+27b2=0modp。
  • GG:基点,是曲线上的一个固定点,作为生成元。
  • nn:基点 GG 的阶,为大素数。

2. 密钥生成与点乘运算

  • 私钥生成:随机选择 d∈[1,n−1]d∈[1,n−1]。
  • 公钥生成:计算 P=[d]GP=[d]G,即基点 GG 与私钥 dd 的点乘结果。

3. 安全性分析

SM2的256位密钥长度提供约128比特的安全强度,相当于3072位RSA的安全水平。其优势在于:

  • 密钥长度短:运算效率高,适合资源受限设备(如智能卡、嵌入式系统)。
  • 抗攻击性强:基于ECDLP问题,目前无多项式时间算法可破解。

三、加解密及数字签名开源代码实现示例

 1. SM2加解密代码示例:

/** This file is part of the openHiTLS project.** openHiTLS is licensed under the Mulan PSL v2.* You can use this software according to the terms and conditions of the Mulan PSL v2.* You may obtain a copy of Mulan PSL v2 at:**     http://license.coscl.org.cn/MulanPSL2** THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.* See the Mulan PSL v2 for more details.*/#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <string.h>
#include "crypt_eal_pkey.h" // Header file of the interfaces for asymmetric encryption and decryption.
#include "bsl_sal.h"
#include "bsl_err.h"
#include "crypt_algid.h"
#include "crypt_errno.h"
#include "crypt_eal_rand.h"
#include "crypt_eal_init.h"
#include "crypt_types.h"void *StdMalloc(uint32_t len) {return malloc((uint32_t)len);
}
void PrintLastError(void) {const char *file = NULL;uint32_t line = 0;BSL_ERR_GetLastErrorFileLine(&file, &line);printf("failed at file %s at line %d\n", file, line);
}int main(void) {int32_t ret;BSL_ERR_Init();  // Initialize the error code module./*** Before calling the algorithm APIs,* call the BSL_SAL_CallBack_Ctrl function to register the malloc and free functions.* Execute this step only once. If the memory allocation ability of Linux is available,* the two functions can be registered using Linux by default.*/BSL_SAL_CallBack_Ctrl(BSL_SAL_MEM_MALLOC, StdMalloc);BSL_SAL_CallBack_Ctrl(BSL_SAL_MEM_FREE, free);ret = CRYPT_EAL_Init(CRYPT_EAL_INIT_CPU | CRYPT_EAL_INIT_PROVIDER);if (ret != CRYPT_SUCCESS) {printf("error code is %x\n", ret);PrintLastError();goto EXIT;}CRYPT_EAL_PkeyCtx *pkey = NULL;pkey = CRYPT_EAL_PkeyNewCtx(CRYPT_PKEY_SM2);if (pkey == NULL) {PrintLastError();goto EXIT;}// Initialize the random number.ret = CRYPT_EAL_ProviderRandInitCtx(NULL, CRYPT_RAND_SHA256, "provider=default", NULL, 0, NULL);if (ret != CRYPT_SUCCESS) {printf("RandInit: error code is %x\n", ret);PrintLastError();goto EXIT;}// Generate a key pair.ret = CRYPT_EAL_PkeyGen(pkey);if (ret != CRYPT_SUCCESS) {printf("CRYPT_EAL_PkeyGen: error code is %x\n", ret);PrintLastError();goto EXIT;}// Data to be encrypted.char *data = "test enc data";uint32_t dataLen = 12;uint8_t ecrypt[125] = {0};uint32_t ecryptLen = 125;uint8_t dcrypt[125] = {0};uint32_t dcryptLen = 125;// Encrypt data.ret = CRYPT_EAL_PkeyEncrypt(pkey, data, dataLen, ecrypt, &ecryptLen);if (ret != CRYPT_SUCCESS) {printf("CRYPT_EAL_PkeyEncrypt: error code is %x\n", ret);PrintLastError();goto EXIT;}// Decrypt data.ret = CRYPT_EAL_PkeyDecrypt(pkey, ecrypt, ecryptLen, dcrypt, &dcryptLen);if (ret != CRYPT_SUCCESS) {printf("CRYPT_EAL_PkeyDecrypt: error code is %x\n", ret);PrintLastError();goto EXIT;}if (memcmp(dcrypt, data, dataLen) == 0) {printf("encrypt and decrypt success\n");} else {ret = -1;}
EXIT:// Release the context memory.CRYPT_EAL_PkeyFreeCtx(pkey);CRYPT_EAL_RandDeinit();BSL_ERR_DeInit();return ret;
}

2. SM2签名代码示例:

/** This file is part of the openHiTLS project.** openHiTLS is licensed under the Mulan PSL v2.* You can use this software according to the terms and conditions of the Mulan PSL v2.* You may obtain a copy of Mulan PSL v2 at:**     http://license.coscl.org.cn/MulanPSL2** THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.* See the Mulan PSL v2 for more details.*/#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <string.h>
#include "crypt_eal_pkey.h" // Header file for signature verification.
#include "bsl_sal.h"
#include "bsl_err.h"
#include "crypt_algid.h"
#include "crypt_errno.h"
#include "crypt_eal_rand.h"
#include "crypt_eal_init.h"void *StdMalloc(uint32_t len) {return malloc((size_t)len);
}void PrintLastError(void) {const char *file = NULL;uint32_t line = 0;BSL_ERR_GetLastErrorFileLine(&file, &line);// Obtain the name and number of lines of the error file.printf("failed at file %s at line %d\n", file, line);
}int main(void)
{int ret;uint8_t userId[32] = {0};uint8_t key[32] = {0};uint8_t msg[32] = {0};uint8_t signBuf[100] = {0};uint32_t signLen = sizeof(signBuf);CRYPT_EAL_PkeyPrv prv = {0};CRYPT_EAL_PkeyPub pub = {0};CRYPT_EAL_PkeyCtx *ctx = NULL;BSL_ERR_Init(); // Initialize the error code module./*** Before calling the algorithm APIs,* call the BSL_SAL_CallBack_Ctrl function to register the malloc and free functions.* Execute this step only once. If the memory allocation ability of Linux is available,* the two functions can be registered using Linux by default.*/BSL_SAL_CallBack_Ctrl(BSL_SAL_MEM_MALLOC, StdMalloc);BSL_SAL_CallBack_Ctrl(BSL_SAL_MEM_FREE, free);ret = CRYPT_EAL_Init(CRYPT_EAL_INIT_CPU | CRYPT_EAL_INIT_PROVIDER);if (ret != CRYPT_SUCCESS) {printf("error code is %x\n", ret);goto EXIT;}ctx = CRYPT_EAL_PkeyNewCtx(CRYPT_PKEY_SM2);if (ctx == NULL) {goto EXIT;}// Set a user ID.ret = CRYPT_EAL_PkeyCtrl(ctx, CRYPT_CTRL_SET_SM2_USER_ID, userId, sizeof(userId));if (ret != CRYPT_SUCCESS) {printf("error code is %x\n", ret);PrintLastError();goto EXIT;}// Initialize the random number.ret = CRYPT_EAL_ProviderRandInitCtx(NULL, CRYPT_RAND_SHA256, "provider=default", NULL, 0, NULL);if (ret != CRYPT_SUCCESS) {printf("error code is %x\n", ret);PrintLastError();goto EXIT;}// Generate a key pair.ret = CRYPT_EAL_PkeyGen(ctx);if (ret != CRYPT_SUCCESS) {printf("error code is %x\n", ret);PrintLastError();goto EXIT;}// Sign.ret = CRYPT_EAL_PkeySign(ctx, CRYPT_MD_SM3, msg, sizeof(msg), signBuf, &signLen);if (ret != CRYPT_SUCCESS) {printf("error code is %x\n", ret);PrintLastError();goto EXIT;}// Verify the signature.ret = CRYPT_EAL_PkeyVerify(ctx, CRYPT_MD_SM3, msg, sizeof(msg), signBuf, signLen);if (ret != CRYPT_SUCCESS) {printf("error code is %x\n", ret);PrintLastError();goto EXIT;}printf("pass \n");EXIT:// Release the context memory.CRYPT_EAL_PkeyFreeCtx(ctx);CRYPT_EAL_RandDeinit();BSL_ERR_DeInit();return ret;
}

【免费下载openHiTLS开源代码】

 openHiTLS旨在打造算法先进、性能卓越、高效敏捷、安全可靠的密码套件,通过轻量级、可剪裁的软件技术架构满足各行业不同场景的多样化要求,让密码技术应用更简单,同时探索后量子等先进算法创新实践,构建密码前沿技术底座!
 项目地址:https://gitcode.com/openHiTLS/openhitls

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

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

相关文章

QT开发中如何加载第三方dll文件

文章目录&#x1f527; 一、隐式加载&#xff08;静态链接&#xff09;操作步骤&#xff1a;⚙️ 二、显式加载&#xff08;动态链接&#xff0c;推荐使用QLibrary&#xff09;操作步骤&#xff1a;&#x1f4bb; 三、直接调用Windows API&#xff08;仅Windows&#xff09;⚠️…

后端学习资料 持续更新中

数据库&#xff1a; 该网址包含&#xff1a;图解MySql&#xff0c; 看明白谁也问不倒你~ 图解计算机网络、操作系统、计算机组成、MySQL、Redis&#xff0c;让天下没有难懂的八股文&#xff01;https://xiaolincoding.com/

《嵌入式Linux应用编程(六):并发编程基础:多进程exec函数族及多线程基础》

一、exec函数族在一个进程里面执行另一个文件本质&#xff1a;将文本区的指令代码替换成exec要执行的指令#include <unistd.h>参数&#xff1a;path:要执行的可执行文件的路径和名称arg:执行该可执行文件时需要传递的参数NULL&#xff1a;参数传递结束标志 返回值&#x…

【121页PPT】智慧方案智慧综合体智能化设计方案(附下载方式)

篇幅所限&#xff0c;本文只提供部分资料内容&#xff0c;完整资料请看下面链接 https://download.csdn.net/download/2501_92808859/91654007 资料解读&#xff1a;【121页PPT】智慧方案智慧综合体智能化设计方案 详细资料请看本解读文章的最后内容 一、项目概述与智能化总…

Linux网络基础(一)

目录 计算机网络背景 网络发展 初识 "协议" 网络协议初识 协议分层 软件分层的好处 打电话例子 OSI七层模型 TCP/IP五层(或四层)模型 参考资料 再识协议 为什么要有 TCP/IP 协议&#xff1f; 什么是 TCP/IP 协议&#xff1f; TCP/IP 协议与操作系统的关系(宏观上&…

MySQL多表查询案例

多表查询本文介绍了多表查询中的表关系概念和操作方法。主要内容包括&#xff1a;1.三种表关系类型&#xff08;一对多、多对多、一对一&#xff09;及其实现方式&#xff1b;2.多表查询的四种连接方式&#xff08;内连接、左外连接、右外连接、自连接&#xff09;及语法&#…

Dify 从入门到精通(第 36/100 篇):Dify 的插件生态扩展

Dify 从入门到精通&#xff08;第 36/100 篇&#xff09;&#xff1a;Dify 的插件生态扩展 Dify 入门到精通系列文章目录 第一篇《Dify 究竟是什么&#xff1f;真能开启低代码 AI 应用开发的未来&#xff1f;》介绍了 Dify 的定位与优势第二篇《Dify 的核心组件&#xff1a;从…

【已解决】在Spring Boot工程中,若未识别到resources/db文件夹下的SQL文件

在Spring Boot工程中&#xff0c;若未识别到resources/db文件夹下的SQL文件&#xff0c;通常与资源路径配置、构建工具设置或代码加载方式有关。以下是逐步排查和解决方案&#xff1a;​​1. 确认SQL文件存放路径​​Spring Boot默认从类路径&#xff08;classpath:&#xff09…

【Java】网络编程(4)

1. 再谈 UDP 报文长度&#xff1a;也是 2 个字节&#xff0c; 0 - 65535&#xff0c;也就是 64 kb。这表示一个 UDP 数据包一次最多只能传输 64 kb 的数据校验和&#xff1a;验证数据是否在传输过程中发生修改。数据在传输过程中可能受到信号干扰&#xff0c;发生 “比特翻转”…

QT(事件)

一、事件前言事件是QT的三大机制之一&#xff0c;一定程度上信号和槽也属于事件的一种 QT中的事件指哪些&#xff1a;窗口关闭&#xff0c;窗口显示&#xff0c;敲击键盘&#xff0c;点击鼠标左键、鼠标右键、鼠标滚轮&#xff0c;文件拖放等等1、事件循环QT中的所有事件&#…

基于 Vue2+Quill 的富文本编辑器全方案:功能实现与样式优化

在 Web 开发中&#xff0c;富文本编辑器是内容管理系统、博客平台等应用的核心组件。本文将详细介绍如何基于 Vue 和 Quill 构建一个功能完善、样式精美的富文本编辑器&#xff0c;重点解决字体字号选项冗长、样式不美观及功能完整性问题&#xff0c;提供可直接部署使用的完整方…

C#内嵌字符串格式化输出

内嵌字符串格式输出 double speedOfLight 299792.458;System.Globalization.CultureInfo.CurrentCulture System.Globalization.CultureInfo.GetCultureInfo("nl-NL"); string messageInCurrentCulture $"The speed of light is {speedOfLight:N3} km/s.&quo…

ThreeJS程序化生成城市大场景底座(性能测试)

一、简介基于矢量geojson数据构建建筑、植被、道路等&#xff0c;实现城市场景底座。涉及渲染的性能优化无非就是众所周知的那些事儿。视锥剔除、mesh合并、减少draw call、四叉树、八叉树、数据压缩、WebWorker、着色器优化等。下面是对东莞市数十万建筑以及海量3D树的渲染测试…

​电风扇离线语音芯片方案设计与应用场景:基于 8 脚 MCU 与 WTK6900P 的创新融合

​电风扇离线语音芯片方案设计与应用场景&#xff1a;基于 8 脚 MCU 与 WTK6900P 的创新融合一、引言在智能家居领域蓬勃发展的当下&#xff0c;用户对于家电产品的智能化和便捷性需求日益增长。传统的电风扇控制方式&#xff0c;如按键操作或遥控器控制&#xff0c;在某些场景…

(第四篇)spring cloud之Consul注册中心

目录 一、介绍 二、安装 三、整合代码使用 1、创建服务提供者8006 2、创建服务消费者80 3、Eureka、zookeeper和consul的异同点 一、介绍 Consul 是一套开源的分布式服务发现和配置管理系统&#xff0c;由 HashiCorp 公司用 Go 语言开发。它提供了微服务系统中的服务治理…

NAT 和 PNAT

核心概念与背景 IPv4 地址枯竭&#xff1a; IPv4 地址空间有限&#xff08;约 42.9 亿个&#xff09;&#xff0c;早已分配殆尽。NAT/PNAT 是缓解此问题的最重要、最广泛部署的技术。私有 IP 地址空间&#xff1a; IANA 保留了三个 IPv4 地址段专供私有网络内部使用&#xff08…

windows系统创建FTP服务

一丶开启FTP功能 控制面板->程序与功能->启用或关闭windows功能->Internet Information Services->勾选FTP服务器二丶创建FTP服务 1丶控制面板->windows工具->Internet Information Services (IIS) 管理器2丶网站->添加FTP站点->输入对应内容3丶点击新…

DeepSeek补全IBM MQ 9.4 REST API 执行命令的PPT

DeepSeek补全了我在网上找到的PPT的一页内容&#xff0c;帮了大忙了。人机协同&#xff0c;人工智能可以协助人更好的做事。下面的内容是讲解IBM MQ REST API 执行IBM MQ命令的PPT: MQSC for REST Tailored RESTful support for individual MQ objects and actions are in the …

【swift】SwiftUI动画卡顿全解:GeometryReader滥用检测与Canvas绘制替代方案

SwiftUI动画卡顿全解&#xff1a;GeometryReader滥用检测与Canvas绘制替代方案一、GeometryReader的性能陷阱深度解析1. 布局计算机制2. 动画中的灾难性表现二、GeometryReader滥用检测系统1. 静态代码分析器2. 运行时性能监控三、Canvas绘制优化方案1. 基础Canvas实现2. 性能优…

悄悄话、合唱层次感:声网空间音频解锁语聊新玩法

作为语聊房主播&#xff0c;我曾觉得线上相聚差点意思。多人开麦时声音混杂&#xff0c;互动缺真实感&#xff0c;观众留不住&#xff0c;自己播着也没劲。直到平台接入声网空间音频&#xff0c;一切改观&#xff0c;观众说像在真实房间聊天&#xff0c;留存率涨 35%&#xff0…