1. SM2算法概述:国密标准背景、椭圆曲线密码基础、SM2与ECDSA/RSA的对比
1.1 国密标准背景——为什么要有自己的密码算法?
说起SM2,得先聊聊国密标准的来龙去脉。我最早接触国密是2012年,那时候很多金融系统还在用RSA 1024。说实话,当时觉得RSA挺成熟的,干嘛要折腾一套新算法?后来参与了一个政务云项目,才真正理解——密码算法这东西,不能全指望别人。
国密标准,全称是“国家商用密码算法标准”。SM2是其中的公钥密码算法部分,2010年发布,2012年成为国家标准(GB/T 32918)。你想想看,如果所有关键系统都用国外的RSA或ECDSA,万一哪天人家不给你更新了,或者留个后门,那麻烦就大了。
核心要点:SM2不是凭空造出来的,它基于椭圆曲线密码(ECC),但做了很多针对中国国情的优化。说白了,就是要有自己的“密码主权”。
我记得有一次给银行做安全审计,发现他们核心交易系统还在用RSA 1024。我跟他们解释:RSA 1024的安全强度现在也就相当于80位对称密钥,而SM2能达到128位。他们当场就决定升级。嗯,这就是国密的价值所在。
1.2 椭圆曲线密码基础——SM2的数学根基
椭圆曲线密码,英文叫Elliptic Curve Cryptography,简称ECC。它不是什么高深莫测的东西,其实就是利用椭圆曲线上的点构成一个群,然后在这个群上做离散对数运算。
一条椭圆曲线的标准方程长这样:
y² = x³ + ax + b (其中4a³ + 27b² ≠ 0)
SM2选用的曲线参数是固定的,由国家密码管理局指定。我习惯把这条曲线叫做“SM2标准曲线”,它的参数包括p、a、b、G、n、h。其中G是基点,n是阶,h是余因子。
避坑指南:我曾经在移植SM2到ARM Cortex-M4时,发现曲线参数写错了——把p的字节序搞反了。结果签名验证一直失败,查了两天才找到问题。所以,曲线参数一定要逐字节核对,别偷懒。
椭圆曲线密码的核心优势是什么?密钥短、速度快、安全性高。举个例子:
| 安全强度(对称密钥等价) | RSA密钥长度 | ECC/SM2密钥长度 |
|---|---|---|
| 80位 | 1024位 | 160位 |
| 112位 | 2048位 | 224位 |
| 128位 | 3072位 | 256位 |
| 256位 | 15360位 | 512位 |
看到没?SM2用256位密钥就能达到RSA 3072位的安全强度。这在嵌入式设备上简直是天大的优势——存储空间省了,传输带宽省了,计算量也小了。
1.3 SM2与ECDSA/RSA的对比——谁更适合你的场景?
很多刚接触国密的人会问:SM2和ECDSA到底有什么区别?说白了,SM2就是中国版的ECDSA,但细节上有很多不同。
我整理了一个对比表,方便你快速理解:
| 对比维度 | SM2 | ECDSA | RSA |
|---|---|---|---|
| 数学基础 | 椭圆曲线 | 椭圆曲线 | 大整数分解 |
| 密钥长度(推荐) | 256位 | 256位 | 3072位 |
| 签名速度 | 快 | 快 | 慢 |
| 验签速度 | 快 | 快 | 较快 |
| 加密速度 | 快 | N/A | 慢 |
| 解密速度 | 快 | N/A | 慢 |
| 标准制定者 | 中国国密局 | ANSI/NIST | RSA实验室 |
| 国内合规性 | 强制要求 | 不推荐 | 不推荐 |
这里有个关键点:SM2的签名算法和ECDSA虽然都基于椭圆曲线,但签名生成过程不一样。SM2的签名值是一个(r, s)对,但r的计算方式、s的生成公式都和ECDSA有差异。我曾经在项目中遇到过把SM2签名直接当ECDSA签名用的坑——验签当然过不了。
注意:SM2和ECDSA的密钥格式也不一样。SM2的公钥是64字节(未压缩),而ECDSA的公钥通常是65字节(带前缀)。如果你在做密钥格式转换,一定要搞清楚对方用的是哪种标准。
再说说RSA。RSA的优势在于实现简单,理解门槛低。但它的劣势也很明显:密钥太长,计算太慢。尤其是在嵌入式设备上,RSA 3072的签名操作可能要几百毫秒,而SM2只需要几十毫秒。你想想看,如果是一个需要频繁签名的物联网设备,这个差距就很要命了。
1.4 SM2的知识体系结构
为了让你对SM2有个整体认识,我画了一张结构图。它展示了SM2算法的核心组成和它们之间的关系。
从这张图你能看到,SM2不是孤立的算法。它包含数字签名、密钥交换、公钥加密三大功能。底层依赖椭圆曲线参数、有限域运算、点乘点加这些数学基础。再往下,就是性能优化的关键——大数运算、预计算、硬件加速。最后落地到各种应用场景。
我个人习惯把SM2的学习路径分成三步:先理解数学原理,再掌握标准接口,最后才是性能优化。很多工程师一上来就扎进优化细节,结果连签名验签流程都没搞清楚,反而走了弯路。
我的建议:如果你是第一次接触SM2,先别急着看优化。把椭圆曲线的基本概念搞懂,把SM2的签名和验签流程走一遍,用OpenSSL或GmSSL跑几个例子。等你有感觉了,再来看后面的性能优化章节。