国密算法 SM2 / SM3 / SM4 简介
国密算法,说白了就是国家密码管理局发布的一套商用密码标准。我刚接触时也觉得「不就是个国产版 RSA 加 SHA256 嘛」,后来做 KMS 集成才发现——它们的设计细节跟国际算法有不少差异,坑还挺多。
这一节我带你快速过一遍 SM2、SM3、SM4 的核心要点。你不用背参数,但要知道它们各自干什么、长什么样、集成时容易在哪翻车。
SM2 —— 椭圆曲线公钥密码算法
SM2 是一套公钥密码体系。它覆盖了三个功能:数字签名、密钥交换、公钥加密。你想想看,RSA 一个算法就把签名和加密都干了,但 SM2 是基于椭圆曲线(ECC)的,安全性更高,密钥更短。
我记得在第一次对接国密证书时,对方给了一个 SM2 签名的原始字节流,我直接拿 ASN.1 解,结果怎么都对不上。后来才发现,SM2 签名结果的默认编码格式和 ECDSA 不一样——它用的是 (r, s) 原始串,不是 DER 编码。嗯,这个坑希望大家别踩。
| 特性 | SM2 | RSA (对比) |
|---|---|---|
| 密钥长度 | 256 位 | 2048 位起 |
| 签名性能 | 快(约 2~5ms) | 慢(约 10~20ms) |
| 加密数据长度 | 有限(推荐对称密钥包装) | 有限 |
| 标准规范 | GM/T 0003 | PKCS#1 |
| 签名编码坑 | 原始 r||s(64 字节) | DER 编码 |
r || s,不是 ASN.1 结构。如果第三方库要求 DER 格式,你必须自己拼 SEQUENCE { INTEGER r, INTEGER s }。反过来,也要能解。
SM3 —— 密码杂凑算法
SM3 输出 256 位摘要,类似 SHA-256。我最初觉得这俩差不多,替换起来应该很平滑。但实际做数据迁移时发现,SM3 的初始向量 IV 和填充方式跟 SHA-256 不一样,导致同一条原文算出来的摘要完全不同。所以千万别在同一个系统里混用两种哈希。
SM3 的安全性略高于 SHA-256,至少在设计上是有意加强抗碰撞能力。我在项目中测试过,100M 文件的 SM3 算力大约比 SHA-256 慢 10%~15%,但在 KMS 里通常是毫秒级,完全可接受。
| 特性 | SM3 | SHA-256 |
|---|---|---|
| 输出长度 | 256 位 | 256 位 |
| 分组大小 | 512 位 | 512 位 |
| IV | 0x7380166F ... | 0x6A09E667 ... |
| 性能 | 略慢于 SHA-256 | 较快 |
| 国标 | GM/T 0004 | FIPS 180-4 |
SM4 —— 分组密码算法
SM4 是对称加密,128 位分组,128 位密钥。跟 AES 比,它的设计更简单——轮数 32 轮,S 盒固定。但简单不代表弱,目前公开分析没有本质漏洞。
我在国密改造项目中,最头疼的是 SM4 的补位方式。很多开发以为默认就是 PKCS7,但 SM4 标准里推荐的是 CMS-Padding(跟 PKCS7 几乎一样,只是补位值定义稍有歧义)。我建议统一用 PKCS7 风格补位,然后在两端确认一致。
SM4 支持 ECB、CBC、CTR、GCM 等模式。我个人习惯在 KMS 里优先用 GCM 模式——既有加密又有认证,省去额外算 HMAC。不过要注意,SM4-GCM 不是所有硬件加速卡都支持,选型时务必跟厂商确认。
| 特性 | SM4 | AES-128 |
|---|---|---|
| 分组大小 | 128 位 | 128 位 |
| 密钥长度 | 128 位 | 128 / 192 / 256 位 |
| 轮数 | 32 | 10 |
| 硬件加速 | 部分国产芯片支持 | 广泛 |
| 补位标准 | PKCS7 / CMS-Padding | PKCS7 |
三种算法在 KMS 中的协作关系
光知道单个算法没用——在 KMS 里它们是怎么配合的?我用一张图来总结。
从图上你能看出来,KMS 的角色是统一调度器。上层业务不用关心密钥是存在 HSM 还是软件文件,也不用管摘要用的是 SM3 还是 SHA-256——只要配置好算法标识,KMS 会自动路由到底层实现。
在 KMS 里,它们通过统一的密钥生命周期管理串在一起。
我个人建议,做集成测试时不要只测单个算法功能,要测混合场景——比如先用 SM4 加密数据,再用 SM3 对密文做摘要,最后用 SM2 对摘要签名。这个链路走通了,你的系统才算真的支持国密。