1、SM2算法概述:国密标准背景、椭圆曲线密码算法原理、SM2与RSA/ECC的对比分析
1.1 国密标准背景:为什么要有自己的密码算法?
说起国密,很多人第一反应是「合规」。但我在实际项目中体会更深——这其实是国家在数字主权上的战略布局。你想想看,如果所有核心系统都用国外的RSA、ECC,一旦出现供应链风险,后果不堪设想。
国家密码管理局从2010年开始陆续发布SM系列算法,其中SM2是公钥密码体系的核心。我记得2018年做政务云项目时,客户明确要求所有敏感数据必须使用国密算法加密。那时候我才真正意识到,SM2不是可选项,而是必选项。
目前SM2已经纳入国际标准ISO/IEC 14888-3,说白了就是国际上也认可这套算法。国内金融、政务、电力、医疗等行业,都在逐步推进国密改造。
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三部分)。
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生成密钥对几乎瞬间完成。
1.3.3 密钥长度与存储
密钥长度直接影响存储和传输开销。SM2的公钥只有32字节(未压缩格式),私钥32字节。RSA-2048的公钥是256字节,私钥更大(约1024字节)。
在安全存储场景中,密钥长度意味着:
- 存储空间:SM2密钥只占RSA的1/8
- 传输带宽:SM2证书更小,握手更快
- 硬件成本:SM2适合集成到安全芯片中
1.4 SM2算法体系结构图
下面这张图展示了SM2在整个国密体系中的位置,以及它内部的功能模块。我画这张图时特意把「密钥管理」放在中间,因为在实际项目中,密钥管理往往是最大的坑。
1.5 选型建议
说了这么多,到底什么时候用SM2?我根据自己的项目经验,给出几点建议:
- 国密合规场景: 必须用SM2,没得选。金融、政务、关键基础设施都是硬性要求。
- 性能敏感场景: SM2比RSA快,适合高并发签名、物联网设备。
- 存储受限场景: SM2密钥短,适合安全芯片、智能卡、嵌入式系统。
- 国际互通场景: 如果必须和国外系统对接,可能需要同时支持SM2和ECC。