引言
SM2 是我国自主研发的非对称加密算法(国密算法),于 2010 年由国密局发布,2017 年成为 ISO/IEC 国际标准。其基于椭圆曲线密码学(ECC),具备安全性高(256 位密钥强度相当于 RSA-3072 位)、运算速度快、密钥短(256 位)等优势,广泛应用于数字签名、公钥加密、密钥交换等领域,是金融、政务、物联网等场景的核心安全技术。本文从算法原理到代码实现,系统解析 SM2 的核心技术。
一、SM2 算法基础
1.1 算法概述
SM2 属于非对称加密算法,包含三个核心功能:
- 数字签名:基于椭圆曲线离散对数难题(ECDLP),保障数据来源认证与完整性
- 公钥加密:使用接收方公钥加密数据,私钥解密
- 密钥交换:通过 ECDH 协议生成共享密钥,用于后续对称加密
1.2 核心数学原理
SM2 的安全性依赖于椭圆曲线离散对数问题:已知椭圆曲线点 P 和 Q=kP,求 k 在计算上不可行。其数学基础包括:
- 有限域运算:素域 Fp 上的加法、乘法、逆运算
- 椭圆曲线方程:标准方程为 y^2 = x^3 + ax + b (mod p),推荐参数为 256 位素数域
- 点运算:点加(P+Q)、倍点(2P)和标量乘法(kP)构成核心运算
1.3 核心参数
国密推荐曲线参数如下(十六进制):
- 素数 p:
FFFFFFFE FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF 00000000 FFFFFFFF FFFFFFFF - 系数 a:
FFFFFFFE ... FFFFFFFC - 基点 G:(x, y) 坐标,阶 n 为
FFFFFFFE ... 39D54123
1.4 算法组件
SM2 包含四大核心算法模块:
- 密钥生成:随机数 d∈[1,n-1] 作为私钥,公钥 P=dG。根据上述密钥生成的流程,是先生成私钥 d,然后计算公钥 P,因此在 SM2 的密钥中,可以根据私钥计算出公钥。
- 数字签名:使用私钥对消息哈希值签名,生成 (r,s)
- 加密/解密:基于 KDF 生成会话密钥,结合椭圆曲线点运算
- 密钥协商:通过两次握手协议生成共享密钥
二、算法原理详解
2.1 数字签名流程
签名生成:
- 计算消息哈希值 e=HASH(Z_A || M),Z_A 为用户身份标识
- 生成随机数 k∈[1,n-1],计算点 (x1,y1)=kG
- r=(e + x1) mod n,若 r=0 则重新选 k
- s=((1+d_A)^-1 * (k - r*d_A)) mod n,输出签名 (r,s)
验签流程:
- 验证 r,s∈[1,n-1]
- 计算 t=(r+s) mod n,点 (x1,y1)=sG + tP_A
- 验证 r ≡ (e + x1) mod n
2.2 加密与解密流程
加密:
- 生成随机数 k,计算 C1=kG(椭圆曲线点)
- 计算 S=h*P_B(h 为余因子),若 S 为无穷远点则报错
- 计算 (x2,y2)=kP_B,通过 KDF 生成密钥 t
- 密文 C2=M⊕t,C3=HASH(x2||M||y2)
- 输出 C=C1||C3||C2
注:h 为余因子(通常为 1),KDF 为密钥派生函数。


