第二章 国密算法与密钥体系概述:SM2/SM3/SM4/SM9 原理与标准归纳
说实话,刚接触国密那会儿,我第一反应是:这不就是换了层皮吗?后来真正在项目中把 SM2 跟 RSA 对调,才发现坑多得很。这章咱们把 SM2、SM3、SM4、SM9 的核心原理和标准掰开揉碎讲。记住一个原则:算法是骨架,密钥是血液,边界是皮肤。
2.1 国密算法家族全景
国密算法目前公开的商用密码算法里,四个主力:SM2(椭圆曲线公钥密码)、SM3(密码杂凑)、SM4(分组对称密码)、SM9(标识密码)。我个人习惯把它们分成三组:
- 对称加密:SM4,类似 AES,但轮函数不一样。
- 公钥体系:SM2(基于 ECC)和 SM9(基于双线性对)。
- 哈希算法:SM3,输出 256 位,SHA-256 的国产替代。
你想想看,一个完整的密钥生命周期,从生成到销毁,这四兄弟缺哪个都会出问题。我记得有个项目只用 SM4 做传输加密,签名用的 RSA,结果审计直接不通过——国密要求链路全栈。
下面这张图概括了它们之间的关系:
2.2 SM2 椭圆曲线公钥密码算法
SM2 用的是标准 256 位素域椭圆曲线,参数是固定的,跟国际 ECC 不一样。我曾经在一个边缘网关项目里把 SM2 签名换成 secp256k1 加速,结果验签时发现椭圆曲线参数里的 b 系数差了一点点——嗯,从那以后我再也不敢随便改曲线。
核心原理:基于椭圆曲线上的离散对数困难问题。注意 SM2 签名算法跟 ECDSA 有个关键区别:它用了额外的一次哈希,而且签名的 r、s 顺序与 ECDSA 相反。项目里常见坑:
- 验签不通过?先检查哈希是否用了 SM3,不是 SHA-256。
- 密钥对生成时,私钥 d 的取值范围是 [1, n-2],n 是基点阶。
- 公钥 Q = d * G,G 是给定的基点。
实战建议:SM2 密钥对生成速度比 RSA 快不少,但签名验证速度慢一点。如果你做大量高频签名(比如每秒 10 万次),可以考虑预生成密钥对存 HSM 里。
2.3 SM3 密码杂凑算法
SM3 输出 256 位,消息分组长度 512 位。结构上类似 SHA-256,但它的消息扩展和压缩函数细节不同。我记的有个客户坚持用 SM3+SM2 做签名链,结果跨平台验签怎么都过不去——最后发现字节序是大端还是小端问题。标准里明确讲的是大端序。
SM3 的计算过程:填充 → 分组 → 迭代压缩。64 轮迭代,每轮用 16 个消息字扩展成 68 个字。这里不细推公式,你只需要记住:不要自己实现 SM3,直接用经过认证的 SDK。我曾经见过有人用纯 Python 写的 SM3,速度慢到每秒钟只能算 200 次哈希。
注意:SM3 的初始值 IV 是固定 8 个 32 位字(0x7380166f, 0x4914b2b9, ...)。很多国产密码机出厂自带的 SM3 引擎如果固件版本不对,算出来的值会差几个字节。做算法兼容性测试时,一定要用标准测试向量。
2.4 SM4 分组密码算法
SM4 是 128 位分组、128 位密钥的对称密码。轮数 32 轮,比 AES 多一倍。但实际运算速度并不慢,因为它的轮函数结构简单。我在一个银行加密卡项目里做过对比:用 SM4 CBC 模式加密 1MB 数据,时间只比 AES-128 多 15% 左右。
SM4 的密钥拓展也是轮密钥加,但它的 S 盒是固定的 16×16 查找表。我建议你把 S 盒存成预计算的数组,不要每次查表都跑一遍循环。
标准支持的工作模式与 AES 几乎一样:ECB、CBC、CFB、OFB、CTR。注意:国密标准里没有 GCM 模式。如果你需要认证加密,目前 SM4 的 GCM 是行业扩展方案,还没过国密局审查。我个人习惯用 SM4-CTR + SM3 HMAC 来模拟。
| 模式 | 使用场景 | 注意事项 |
|---|---|---|
| ECB | 单块密钥加密 | 不要用于大数据,模式重复 |
| CBC | 文件加密 | IV 必须随机且不可预测 |
| CTR | 流式通信 | 计数器不能复用,否则密钥泄露 |
| CFB/OFB | 较少用 | 慎用 CFB-1 位模式 |
2.5 SM9 标识密码算法
SM9 是个有意思的东西。它不需要证书,直接用用户的标识(比如邮箱、电话号码)作为公钥。私钥由密钥生成中心 KGC 计算。原理是双线性对 e: G1 × G2 → GT。
为什么会有人用 SM9?说白了,省去了 PKI 证书管理的成本。我在一个物联网平台项目里用过 SM9,每个设备只要烧录一个标识,后台 KGC 在线下发私钥就行。但要注意:KGC 知道所有用户的私钥,所以 KGC 本身要做成硬件安全模块,且必须物理隔离。
SM9 的标准包括三个部分:签名、密钥交换、加密。其中签名长度比 SM2 短,只有 128 字节左右。但验证速度慢很多,因为双线性对计算量大。实际项目中建议 SM9 只用于密钥协商,不用于高频签名。
核心概念对比
| 算法 | 密钥对 | 摘要/分组 | 主要用途 |
|---|---|---|---|
| SM2 | ECC 256位 | — | 签名、密钥交换 |
| SM3 | — | 512→256位 | 哈希、KDF |
| SM4 | 128位对称密钥 | 128位分组 | 数据加密 |
| SM9 | 标识 + KGC | — | 无证书签名/加密 |
2.6 标准体系与合规要求
国密标准目前由 GM/T 系列给出。你如果做等保三级以上的系统,一般要求 SM2/SM3/SM4 全栈。SM9 因为属于较新的标准(GM/T 0078-2018),一些老系统还没支持。
我个人习惯在投标前先跟客户确认:你们持卡终端支持 SM4 CBC 吗?HSM 里有没有 SM2 密钥对生成接口?我记得有次项目验收,对方拿出一个很老的 USB Key,固件只支持 SM1(非公开),结果只能换硬件。
下面列出常用国密标准号,建议收藏作为参考:
- GM/T 0003-2012 SM2 椭圆曲线公钥密码算法
- GM/T 0004-2012 SM3 密码杂凑算法
- GM/T 0002-2012 SM4 分组密码算法
- GM/T 0078-2018 SM9 标识密码算法
嗯,这章就到这儿。搞懂了这四个算法的原理和适用边界,后面讲密钥生命周期管理的时候才能说得清每条策略为什么要这么定。