一、国密算法概述:SM2/SM3/SM4/SM9 算法原理、应用场景与合规要求
各位同学,咱们今天正式开讲。国密算法,说白了就是国家密码管理局发布的一套商用密码标准。很多人一听到「国密」就觉得是政治任务,其实不然。我在安全评估项目中遇到过不少企业,一开始只是为了合规才上国密,结果发现性能和安全其实都不差。
这一章,我会把 SM2、SM3、SM4、SM9 这四个核心算法的原理、应用场景和合规红线讲清楚。嗯,咱们不搞教科书式的罗列,我尽量用实战视角来拆解。
1.1 国密算法全景图
先看一张总图,把四个算法的定位搞清楚。
这张图我建议你存下来。四个算法各司其职: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 密码算法使用规范 | 现行 |
哪些场景必须用国密?我总结了几类:
- 等保三级及以上系统:密码产品必须采用国密算法
- 金融核心系统:网上银行、支付系统、证券交易
- 政务信息系统:电子政务、电子签章、公文流转
- 关键信息基础设施:能源、交通、医疗、通信
合规检查清单:
- 确认密码产品是否持有《商用密码产品认证证书》
- 确认算法实现是否通过国密局检测
- 确认密钥管理方案是否符合 GM/T 0054 要求
- 确认系统是否支持国密算法的平滑切换
嗯,这一章的内容就到这里。四个算法的原理、场景和合规要求,咱们都过了一遍。后面的章节,我会逐个深入分析每个算法的实现细节、常见漏洞和攻击手法。到时候咱们再细聊。