第4章 国密算法概述:SM2/SM3/SM4/SM9 标准介绍

做安全接口的人,迟早要跟国密算法打交道。我最早接触国密是在一个政务云项目里,甲方明确要求“必须使用国密SM系列算法”。当时我连SM2是椭圆曲线还是哈希都没分清楚……踩过坑之后,才老老实实把几个核心标准啃了一遍。

国密算法不是一套随意的密码集合,而是由国家密码管理局发布的商用密码标准。目前最常用的是SM2、SM3、SM4、SM9这四个。你想想看,它们覆盖了非对称加密、哈希、对称加密和基于身份的加密,基本就是一个完整的密码工具箱。

核心认识:国密算法并不“神秘”,它们对标的是国际标准算法(如RSA、ECDSA、SHA-256、AES),但在曲线参数、分组长度、轮函数等细节上有自主设计。合规要求才是驱动它们落地的最大动力。

4.1 SM2 椭圆曲线公钥密码算法

SM2 是国密体系里最重要的非对称算法。它包括加密、签名和密钥交换三种功能。我习惯拿它跟 ECDSA 对比:SM2 签名机制比 ECDSA 多了一个公钥恢复验证步骤,安全性反而更高一些。

特性 SM2 国际对标
曲线 256位素域椭圆曲线(p=2^256-2^224-2^96+2^64-1) P-256(secp256r1)
签名长度 64字节(r || s) ECDSA / 64字节
加密开销 与点乘次数相关,约1.5倍ECDSA —
标准号 GB/T 32918.1-2016 —

个人经验:在gRPC接口里签SM2数据时,记得把原始签名转换成DER格式再塞进protobuf的bytes字段。我曾经直接塞了原始r||s,结果对方验签库解析不了——两边ASN.1编码习惯不一样。

4.2 SM3 密码杂凑算法

SM3 是国密哈希算法,输出256位(32字节)摘要。性能上跟SHA-256差不多,但它的压缩函数结构更像SHA-256的改进版。我在做消息完整性校验时,优先用SM3而不是SHA-256——因为合规审计时,哈希也必须用国密。

有一点值得留意:SM3的初始值IV和迭代轮数(64轮)与SHA-256(64轮)相同,但消息扩展方式和压缩函数不一样。嗯,具体细节可以查标准GB/T 32905-2016,我在这里只说一个坑:SM3不支持流式更新?不对,它支持,但因为状态是256位,有些第三方库实现有bug,分段更新时结果对不上。我建议在gRPC拦截器里一次性加载整个消息体再算hash,避免麻烦。

4.3 SM4 分组密码算法

SM4 是对称加密算法,分组长度128位,密钥长度128位,加密轮数32轮。对标的是AES-128。它的S盒是8×8的,跟AES的S盒设计思路不同,但非线性强度够用。

对比项 SM4 AES-128
分组大小 128位 128位
密钥长度 128位 128位
轮数 32 10
加解密结构 Feistel网络 SP网络
标准 GB/T 32907-2016 FIPS 197

SM4 在国密生态里用得最多,比如加密传输层数据、存储字段加密。我个人推荐用CBC或GCM模式,但要注意:GCM模式需要一次性提供完整的附加认证数据(AAD),否则解密会失败。

避坑提示:我曾经在gRPC双向流里用SM4-CBC加密每一条消息,结果忘了重置IV,导致相同明文产生相同密文,被审计工具扫描出“IV重用”漏洞。切记:每个消息都要随机生成IV,或者用计数器模式。

4.4 SM9 标识密码算法

SM9 是基于双线性对的标识加密算法。它不需要数字证书,直接用用户标识(比如邮箱、手机号)作为公钥。这玩意对接口集成的吸引力很大——省掉了证书管理、CRL、OCSP这些基础设施。我在一个物联网项目中尝试过SM9做设备身份认证,减少了约30%的运维成本。

SM9 的标准号是GB/T 38635-2020,包括加密部分和数字签名部分。不过要注意:SM9 的密钥生成需要密钥生成中心(KGC),这引入了“密钥托管”风险——KGC掌握所有私钥。你在合规审计时,必须把KGC的物理隔离和密钥销毁策略写清楚。

4.5 国密应用场景与合规要求

说了这么多算法,实际项目里怎么用?我总结了一个场景矩阵:

  • 身份认证:SM2签名/验签,或者SM9标识签名。在gRPC中放在metadata里传递签名值。
  • 数据传输加密:SM4加密gRPC message的payload,或者使用国密TLS(GMTLS)替代标准TLS。
  • 数据完整性:SM3计算哈希,用于校验传输是否被篡改。
  • 密钥交换:SM2密钥协商或SM9密钥封装。

合规层面,主要依据《密码法》和《商用密码管理条例》。关键要求是:

  1. 涉及国家秘密的信息系统必须使用国密算法(SM系列)。
  2. 等保2.0三级及以上要求密码产品通过国密局商用密码检测。
  3. 电子政务、金融、关键信息基础设施等场景,优先/强制采用国密。
  4. 企业自研系统若需通过国密合规审计,必须使用国家认证的加密模块(如GM/T 0002-2012等配套规范)。

下面这张图概括了SM2/SM3/SM4/SM9在gRPC国密集成中的定位:

国密算法在 gRPC 集成中的体系结构 gRPC 接口层 SM2 非对称 签名 / 加密 / 密钥交换 SM3 哈希 完整性校验 SM4 对称 数据加密 SM9 标识密码 无证书认证 身份认证 数据加密传输 完整性校验 密钥协商 合规要求:等保2.0 / 密码法 / 商密检测

说实话,刚开始做国密集成时,最头疼的不是算法本身,而是不同厂商的加密硬件和软件库互操作性。比如SM2的签名格式,有的库输出DER编码,有的输出原始r||s。我建议你在gRPC接口定义里强制约定一种格式,并且在单元测试里跑通国密算法的互操作测试——不要等到联调才暴露。

小技巧:用Python做原型时,可以使用 gmssl 或 pysmx 库(开源国密实现)。但生产环境务必替换为通过国密局检测的硬件加密机或经过安全审计的软件模块。我个人习惯把国密操作封装成一个独立的gRPC拦截器,在客户端和服务端各加一层——这样业务代码不用改,就能满足国密合规。

好了,这章主要理清了SM2/SM3/SM4/SM9各自是什么、用在哪儿、以及合规红线在哪。接下来你就可以在gRPC接口里对症下药,选对算法、避开常见坑。