4、国密算法基础(下):SM2签名验签流程详解、SM9标识密码算法简介、国密算法与国际算法对比分析

好,我们接着往下聊。上一节我们把SM2加密和密钥交换讲透了,这一节重点落在SM2签名验签上。另外,SM9标识密码我也会带你快速过一遍,最后再做个国密与国际算法的横向对比。这部分内容在实际落地中踩坑最多,我建议你打起精神。

4.1 SM2签名验签:流程与避坑

SM2签名验签,说白了就是「用私钥签名,用公钥验签」。跟ECDSA很像,但细节上多了个用户标识ZA的计算。嗯,这里要注意,ZA是把用户ID、椭圆曲线参数、公钥一起哈希了再参与签名。为什么要这么干?为了防止签名被嫁接到其他用户或曲线上。

核心流程(签名方):

  1. 计算ZA = H256(ENTLA || IDA || a || b || xG || yG || xA || yA)
  2. 计算M' = ZA || M,做一次哈希得到e
  3. 生成随机数k,计算椭圆曲线点(x1, y1) = k * G
  4. 计算r = (e + x1) mod n,若r=0或r+k=n则重来
  5. 计算s = ((1 + dA)-1 * (k - r * dA)) mod n,若s=0则重来
  6. 输出签名(r, s)

验签方拿到(r, s)后,先算ZA和e,再算t = (r + s) mod n,然后算椭圆曲线点(x1', y1') = s * G + t * PA,最后判断r是否等于(e + x1') mod n。相等就通过,不相等就拒绝。

我曾经在项目中遇到过一个坑:ZA计算时用户ID的长度编码ENTLA是2字节大端,很多人写成1字节,导致签名验签在跨平台时对不上。还有,随机数k必须真随机,不能用固定种子,否则私钥会被算出来。SM2签名对随机数的质量要求比ECDSA还高,因为一旦k泄露,dA = (s - k) / (r - s) mod n,私钥就没了。

4.2 SM9标识密码算法简介

SM9是个很有意思的算法。它不需要证书,直接用用户标识(比如邮箱、手机号)作为公钥。你想想看,这省掉了PKI体系里证书签发、验证、吊销那一大套东西。我个人习惯在IoT场景里优先考虑SM9,因为设备量太大,证书管理成本扛不住。

SM9基于双线性对(也叫配对运算),核心是e(ga, gb) = e(g, g)ab。密钥生成中心(KGC)掌握主密钥,用户标识经过哈希映射到椭圆曲线上的点,再结合主密钥生成用户私钥。

功能 SM9对应算法 说明
加密 SM9-IBE 用接收方标识加密,无需预分发公钥
签名 SM9-IBAS 用标识私钥签名,验签方只需标识和系统参数
密钥交换 SM9-IBKA 双方标识参与,协商出会话密钥

我建议你在TEE里实现SM9时注意:双线性对运算非常重,比SM2的标量乘慢一个数量级。如果设备性能有限,可以把KGC放在TEE外部,用户私钥生成后安全注入TEE内部存储。另外,SM9的主密钥一旦泄露,所有用户私钥都得重发,所以主密钥必须放在硬件安全模块或TEE的密封存储区。

4.3 国密与国际算法对比分析

做落地选型时,经常有人问我:「国密到底比国际算法好在哪?」我一般会从安全性、性能、合规性三个维度来拆解。下面这张表是我自己整理的,你可以直接拿去用。

对比维度 SM2 RSA ECDSA
密钥长度 256位 2048位起 256位
签名速度 快(约2ms) 慢(约10ms) 快(约2ms)
验签速度 快(约3ms) 快(约0.5ms) 快(约3ms)
安全性基础 ECDLP 大整数分解 ECDLP
抗量子攻击 弱 弱 弱
国内合规 强制 不推荐 不推荐

哈希算法这块,SM3输出256位,跟SHA256长度一样,但SM3的结构更接近SHA256的变种,抗碰撞能力经过国内密码分析界的充分验证。我记得有一次做等保测评,对方指定必须用SM3,SHA256直接不给过。

对称加密方面,SM4是128位分组密码,跟AES-128对标。SM4的S盒设计比AES简单,但轮数多(32轮 vs AES的10轮),实际吞吐量在软件实现上略低于AES,硬件实现差距不大。

我的选型建议:

  • 国内合规场景(等保、密评、政务、金融核心):全栈国密,没得选。
  • 海外互通场景:国密+国际算法双栈,TEE内部做算法适配层。
  • 性能敏感场景:SM2签名优于RSA,SM4与AES相当,SM3与SHA256相当。
  • 标识密码场景:SM9是唯一选择,国际上的IBE方案(如BF-IBE)专利壁垒高,国内不推荐。
国密算法体系与国际算法对比框架 国密算法 SM2(椭圆曲线公钥密码) 签名/验签 · 加密 · 密钥交换 SM3(密码杂凑算法) 输出256位 · 抗碰撞 SM4(分组对称密码) 128位分组 · 32轮迭代 SM9(标识密码) 基于双线性对 · 无证书 国内合规 · 自主可控 国际算法 RSA / ECDSA RSA-2048 / ECDSA-P256 SHA-256 输出256位 · 广泛使用 AES-128 128位分组 · 10轮迭代 IBE(BF/BB方案) 专利壁垒高 · 国内少用 全球通用 · 生态成熟 选型建议:国内合规场景全栈国密,海外互通场景双栈适配

最后说一句实在的:国密算法在TEE里落地,最大的挑战不是算法本身,而是生态成熟度。国际算法有OpenSSL、mbedTLS这些现成库,国密虽然也有GmSSL、OpenEuler等支持,但TEE里的TA(可信应用)开发环境往往更封闭,你得自己把SM2/SM3/SM4/SM9的TEE移植版写好、测好。我建议你从SM4和SM3入手,这两个相对简单,跑通了再啃SM2和SM9。