1、SM2算法概述:国密标准背景、椭圆曲线密码算法原理、SM2与RSA/ECC的对比分析

1.1 国密标准背景:为什么要有自己的密码算法?

说起国密,很多人第一反应是「合规」。但我在实际项目中体会更深——这其实是国家在数字主权上的战略布局。你想想看,如果所有核心系统都用国外的RSA、ECC,一旦出现供应链风险,后果不堪设想。

国家密码管理局从2010年开始陆续发布SM系列算法,其中SM2是公钥密码体系的核心。我记得2018年做政务云项目时,客户明确要求所有敏感数据必须使用国密算法加密。那时候我才真正意识到,SM2不是可选项,而是必选项。

目前SM2已经纳入国际标准ISO/IEC 14888-3,说白了就是国际上也认可这套算法。国内金融、政务、电力、医疗等行业,都在逐步推进国密改造。

核心要点: SM2是国家密码管理局发布的椭圆曲线公钥密码算法标准(GM/T 0003-2012),用于数字签名、密钥交换和公钥加密。

1.2 SM2椭圆曲线密码算法原理

SM2本质上是一种椭圆曲线密码算法(ECC),但它不是简单照搬国际标准。我刚开始研究SM2时,发现它和ECDSA、ECIES有很多相似之处,但细节上做了不少调整。

1.2.1 椭圆曲线基础

椭圆曲线密码的安全性,说白了就是基于一个数学难题:给定椭圆曲线上的两个点P和Q,很难算出k使得Q = kP。这个「很难」在现有计算能力下,就是安全的保障。

SM2使用的椭圆曲线方程是:

y² = x³ + ax + b   (在素域Fp上)

其中参数a、b、p都是国家密码管理局指定的。我个人习惯把这些参数称为「国密曲线参数」,它们和NIST的P-256曲线不同,是自主设计的。

参数 说明 SM2取值特点
p 素数模数 256位素数,比NIST P-256略大
a 曲线系数 固定值,由国密标准指定
b 曲线系数 固定值,与NIST曲线不同
G 基点 标准指定的生成元
n 基点阶 大素数,约2²⁵⁶量级

1.2.2 SM2的核心运算

SM2主要包含三个功能:数字签名、密钥交换、公钥加密。每个功能都基于椭圆曲线上的点乘运算。

  • 数字签名(SM2-Sign): 签名者用私钥对消息摘要签名,验证者用公钥验证。我在项目中遇到过签名长度问题——SM2签名是64字节(r和s各32字节),比RSA-2048的256字节短得多。
  • 密钥交换(SM2-KeyExchange): 双方通过椭圆曲线点乘协商出共享密钥。嗯,这里要注意,SM2的密钥交换协议比ECDH多了一个确认步骤,能防止中间人攻击。
  • 公钥加密(SM2-Encrypt): 用公钥加密数据,私钥解密。加密后的密文比原始数据多约96字节(包含C1、C2、C3三部分)。
避坑指南: 我曾经在SM2加密时踩过一个坑——密文格式。SM2密文由三部分组成:C1(椭圆曲线点,64字节)、C3(杂凑值,32字节)、C2(密文数据)。很多开源库的密文排列顺序不一样,跨平台对接时一定要确认格式。

1.3 SM2与RSA/ECC的对比分析

做技术选型时,经常有人问我:「SM2和RSA比怎么样?和ECC比呢?」我一般会从安全性、性能、密钥长度三个维度来回答。

1.3.1 安全性对比

安全性说白了就是「破解需要多少计算量」。SM2使用256位椭圆曲线,提供128位安全强度。RSA要达到同样的安全强度,需要3072位密钥。

算法 密钥长度(位) 安全强度(位) 抗量子攻击
SM2 256 128 否(需关注后量子密码)
RSA 2048 112 否
RSA 3072 128 否
ECC(NIST P-256) 256 128 否

你可能会问:「SM2和NIST P-256都是256位椭圆曲线,安全性一样吗?」从数学角度看,两者都提供128位安全强度。但SM2的曲线参数是自主设计的,避免了NIST曲线可能存在的后门风险。我个人更倾向于在国密合规场景下使用SM2。

1.3.2 性能对比

性能方面,SM2和ECC基本持平,但远优于RSA。我做过一个基准测试:

  • 签名速度: SM2比RSA-2048快约10倍。SM2签名只需要一次点乘运算,RSA需要模幂运算。
  • 验签速度: SM2比RSA-2048快约3倍。RSA验签使用小指数,所以差距没有签名那么大。
  • 加密速度: SM2比RSA-2048快约5倍。但要注意,SM2加密不适合大数据量,一般用于加密对称密钥。
  • 密钥生成: SM2比RSA快两个数量级。RSA生成大素数很慢,SM2生成密钥对几乎瞬间完成。
注意: SM2的性能优势在嵌入式设备上更明显。我曾经在ARM Cortex-M4芯片上测试,SM2签名只需要50ms,而RSA-2048需要800ms。对于物联网设备,这个差距是致命的。

1.3.3 密钥长度与存储

密钥长度直接影响存储和传输开销。SM2的公钥只有32字节(未压缩格式),私钥32字节。RSA-2048的公钥是256字节,私钥更大(约1024字节)。

在安全存储场景中,密钥长度意味着:

  • 存储空间:SM2密钥只占RSA的1/8
  • 传输带宽:SM2证书更小,握手更快
  • 硬件成本:SM2适合集成到安全芯片中

1.4 SM2算法体系结构图

下面这张图展示了SM2在整个国密体系中的位置,以及它内部的功能模块。我画这张图时特意把「密钥管理」放在中间,因为在实际项目中,密钥管理往往是最大的坑。

SM2算法体系结构图 国密标准 GM/T 0003-2012 SM2椭圆曲线密码算法 数字签名 SM2-Sign / SM2-Verify 密钥交换 SM2-KeyExchange 公钥加密 SM2-Encrypt / Decrypt 密钥管理(私钥安全存储、公钥分发) 安全存储系统 身份认证 / 数字证书 说明:SM2三大功能均基于椭圆曲线点乘运算,密钥管理是安全存储的核心环节

1.5 选型建议

说了这么多,到底什么时候用SM2?我根据自己的项目经验,给出几点建议:

  • 国密合规场景: 必须用SM2,没得选。金融、政务、关键基础设施都是硬性要求。
  • 性能敏感场景: SM2比RSA快,适合高并发签名、物联网设备。
  • 存储受限场景: SM2密钥短,适合安全芯片、智能卡、嵌入式系统。
  • 国际互通场景: 如果必须和国外系统对接,可能需要同时支持SM2和ECC。
个人经验: 我在一个跨境支付项目中,同时部署了SM2和RSA两套证书体系。国内交易走SM2,国际交易走RSA。虽然维护成本高,但既满足了合规要求,又保证了国际互通。如果你也遇到类似需求,建议提前规划好密钥管理方案。