一、国密算法概述:SM2/SM3/SM4/SM9 算法原理、应用场景与合规要求

各位同学,咱们今天正式开讲。国密算法,说白了就是国家密码管理局发布的一套商用密码标准。很多人一听到「国密」就觉得是政治任务,其实不然。我在安全评估项目中遇到过不少企业,一开始只是为了合规才上国密,结果发现性能和安全其实都不差。

这一章,我会把 SM2、SM3、SM4、SM9 这四个核心算法的原理、应用场景和合规红线讲清楚。嗯,咱们不搞教科书式的罗列,我尽量用实战视角来拆解。

1.1 国密算法全景图

先看一张总图,把四个算法的定位搞清楚。

国密算法全景图 国密算法体系 SM2 公钥密码 SM3 密码杂凑 SM4 对称密码 SM9 标识密码 加密 / 签名 / 密钥交换 数据完整性 / 摘要 分组加密 / 数据保护 基于标识的加密 / 签名 数字证书、电子签章 完整性校验、密码存储 VPN、数据库加密、磁盘加密 无证书 PKI、物联网

这张图我建议你存下来。四个算法各司其职:SM2 管公钥、SM3 管摘要、SM4 管对称加密、SM9 管标识密码。你想想看,一个典型的安全通信场景,往往需要它们配合使用。

1.2 SM2 算法:椭圆曲线公钥密码

SM2 是基于椭圆曲线密码学(ECC)的公钥算法。它支持加密、数字签名和密钥交换三种功能。我个人习惯把它看作是「国密版的 ECDSA + ECDH」,但曲线参数是国密局自己定义的。

核心参数:

  • 椭圆曲线:y² = x³ + ax + b,定义在素数域 Fp 上
  • 推荐曲线:p = 0xFFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FFFFFFFFFFFFFFFF
  • 密钥长度:256 位(公钥 64 字节,私钥 32 字节)
  • 签名长度:64 字节(r || s)

我记得有一次帮客户做 PKI 系统迁移,从 RSA 2048 换到 SM2。很多人担心性能下降,实测下来 SM2 签名速度比 RSA 快 3-5 倍,验签稍慢一点,但整体吞吐量反而提升了。说白了,椭圆曲线在同等安全强度下,密钥更短、计算更快。

避坑指南:我曾经见过一个项目,SM2 签名验签总是失败。排查了半天,发现是签名时没有使用标准的用户 ID(SM2 默认是 "1234567812345678"),导致杂凑值对不上。记住,SM2 签名时一定要带上用户 ID,否则验签必挂。

1.3 SM3 算法:密码杂凑函数

SM3 是国密标准的哈希算法,输出 256 位摘要。它的结构和 SHA-256 类似,但做了不少改进。我在做代码审计时发现,很多人直接把 SM3 当 SHA-256 用,其实两者在消息扩展和压缩函数上有差异。

SM3 的主要应用场景:

  • 完整性校验:文件校验、固件签名
  • 密码存储:配合盐值做密码哈希
  • 数字签名:SM2 签名前对消息做 SM3 摘要
  • 随机数生成:作为伪随机函数组件

注意:SM3 不是 SHA-256 的简单替换。我在一次等保测评中遇到过,某厂商把 SM3 的初始向量 IV 改成了自定义值,说是「增强安全性」。结果导致与其他系统互操作时全部失败。SM3 的 IV 是国标规定的,不能改。

1.4 SM4 算法:对称分组密码

SM4 是国密的对称加密算法,分组长度 128 位,密钥长度 128 位。它采用 32 轮非线性迭代结构。说实话,SM4 的设计非常简洁,硬件实现效率很高。

参数 SM4 AES-128
分组长度 128 位 128 位
密钥长度 128 位 128 位
轮数 32 轮 10 轮
结构 非线性迭代 SPN 结构
S 盒 固定 8×8 S 盒 固定 8×8 S 盒

SM4 的工作模式与 AES 完全兼容,支持 ECB、CBC、CTR、GCM 等。我个人建议,生产环境优先使用 GCM 模式,因为它同时提供加密和完整性校验,能避免很多 padding oracle 攻击。

实战经验:我在做金融系统改造时,SM4 的密钥派生是个坑。很多开发直接用 SM3 对密码做哈希当密钥用,这是不安全的。正确的做法是用 PBKDF2 或国密标准的 KDF 来派生密钥。

1.5 SM9 算法:基于标识的密码

SM9 是国密的标识密码算法,它最大的特点是「不需要证书」。用户的公钥就是他的标识,比如邮箱、手机号、身份证号。私钥由密钥生成中心(KGC)生成并分发。

SM9 的核心原理:

  • 基于双线性对(Weil 对 / Tate 对)
  • 支持加密和数字签名
  • 密钥长度:256 位
  • 签名长度:64 字节

说实话,SM9 在实际落地中遇到的最大问题是 KGC 的密钥管理。KGC 掌握所有用户的私钥,一旦 KGC 被攻破,整个系统的安全性就崩塌了。我在物联网项目中见过用 SM9 做设备身份认证的,效果不错,但 KGC 必须做硬件安全模块(HSM)保护。

安全红线:SM9 的 KGC 主密钥必须离线存储,绝对不能放在应用服务器上。我曾经审计过一个项目,KGC 主密钥直接写在配置文件里,明文存储。这等于把整个系统的钥匙挂在大门上。

1.6 合规要求与标准体系

国密算法的合规要求,说白了就是「该用国密的地方必须用国密」。目前主要的合规依据包括:

标准编号 名称 状态
GB/T 32918.1-2016 SM2 椭圆曲线公钥密码算法 第1部分:总则 现行
GB/T 32905-2016 SM3 密码杂凑算法 现行
GB/T 32907-2016 SM4 分组密码算法 现行
GB/T 38635.1-2020 SM9 标识密码算法 第1部分:总则 现行
GM/T 0009-2012 SM2 密码算法使用规范 现行

哪些场景必须用国密?我总结了几类:

  • 等保三级及以上系统:密码产品必须采用国密算法
  • 金融核心系统:网上银行、支付系统、证券交易
  • 政务信息系统:电子政务、电子签章、公文流转
  • 关键信息基础设施:能源、交通、医疗、通信

合规检查清单:

  1. 确认密码产品是否持有《商用密码产品认证证书》
  2. 确认算法实现是否通过国密局检测
  3. 确认密钥管理方案是否符合 GM/T 0054 要求
  4. 确认系统是否支持国密算法的平滑切换

嗯,这一章的内容就到这里。四个算法的原理、场景和合规要求,咱们都过了一遍。后面的章节,我会逐个深入分析每个算法的实现细节、常见漏洞和攻击手法。到时候咱们再细聊。