一、国密算法概述:SM2/SM3/SM4/SM9 算法原理、应用场景与合规要求
各位同学,咱们今天聊国密。说实话,我刚入行那会儿,对国密的印象就是「SM 开头的几个算法,跟国际算法长得差不多」。直到有一次在金融项目里,因为 SM2 签名长度没算对,导致报文被网关直接丢弃……嗯,从那以后我再也不敢小看这些细节了。
国密算法,全称是中国商用密码算法。它不是一个算法,而是一套体系。你想想看,从非对称加密、对称加密到哈希,再到标识密码,国密都给你配齐了。今天这一章,咱们就把 SM2、SM3、SM4、SM9 这四个核心算法掰开揉碎讲清楚。
1.1 SM2:椭圆曲线公钥密码算法
SM2 是国密体系里的非对称加密算法,对标的是国际上的 ECDSA 和 ECDH。它基于椭圆曲线上的离散对数难题,密钥长度 256 位,安全强度与 RSA-3072 相当,但计算效率更高。
我个人习惯把 SM2 拆成三个功能来看:
- 加密/解密:使用 SM2 公钥加密,私钥解密。适合小数据量的加密场景,比如传输对称密钥。
- 数字签名:私钥签名,公钥验签。这是 SM2 最常用的场景,比如身份认证、数据完整性保护。
- 密钥交换:双方通过 SM2 协商出一个共享密钥,用于后续对称加密。
我在项目中遇到过一个问题:SM2 签名结果是一个 64 字节的结构体(r || s),但有些开发者把它当成 65 字节的 DER 编码来解析,结果验签一直失败。避坑指南:SM2 签名原始格式就是 64 字节,别多解析。
| 功能 | 密钥长度 | 签名/密文长度 | 典型场景 |
|---|---|---|---|
| 加密 | 256 位 | 密文比明文多 96 字节 | 数字信封、密钥传输 |
| 签名 | 256 位 | 64 字节 | 身份认证、电子签章 |
| 密钥交换 | 256 位 | 协商数据约 128 字节 | TLS 握手、VPN |
1.2 SM3:密码杂凑算法
SM3 是国密里的哈希算法,输出 256 位(32 字节)的摘要值。它跟 SHA-256 在结构上很像,但细节上有差异——比如消息扩展的轮数、压缩函数的置换逻辑。
说白了,SM3 就是给数据「算指纹」的。你传一个文件,我算一下 SM3 值,对比一下就知道文件有没有被篡改。
我曾经在日志审计系统里踩过一个坑:SM3 的初始值 IV 是固定的 8 个 32 位字,但有些开源库实现时把 IV 顺序搞反了,导致同一个数据在不同库算出来的摘要不一样。嗯,遇到这种情况,先检查 IV 的字节序。
1.3 SM4:分组密码算法
SM4 是国密里的对称加密算法,分组长度 128 位,密钥长度 128 位。它跟 AES 一样,都是分组密码,但 SM4 用的是 Feistel 结构,而 AES 用的是 SPN 结构。
SM4 支持五种工作模式,我列个表给你看:
| 模式 | 特点 | 适用场景 |
|---|---|---|
| ECB | 简单,但相同明文得到相同密文 | 不推荐,除非数据量极小 |
| CBC | 需要 IV,密文有扩散性 | 文件加密、数据库加密 |
| CFB | 流式加密,适合实时数据 | 网络流加密 |
| OFB | 流式,错误不传播 | 卫星通信、低误码容忍场景 |
| CTR | 可并行,性能高 | 高性能加密、磁盘加密 |
我个人习惯在项目中优先用 SM4-CBC 或 SM4-CTR。CBC 模式要注意 IV 必须是随机生成的,而且每次加密都要换 IV。我曾经见过一个项目,IV 写死在代码里,结果密文模式被破解,数据全泄露了。
1.4 SM9:标识密码算法
SM9 是国密体系里比较「新」的算法,它基于双线性对(Pairing)技术,最大的特点是不需要数字证书。你想想看,传统的 PKI 体系需要 CA、证书链、CRL,管理起来很麻烦。SM9 直接用用户的标识(比如邮箱、手机号、身份证号)作为公钥,私钥由密钥生成中心(KGC)颁发。
SM9 的核心优势:
- 无需证书:公钥就是标识,省去了证书管理和验证的开销。
- 密钥托管:KGC 可以生成用户的私钥,适合企业内部管控。
- 加密与签名:SM9 同时支持加密和数字签名。
我在物联网项目里用过 SM9。设备端只需要知道服务器的标识(比如 server@company.com),就能加密数据,不需要预置证书。但要注意,KGC 是单点风险,一旦 KGC 被攻破,所有用户的私钥都可能泄露。
1.5 国密算法全景图
下面这张图,是我自己整理的国密算法知识体系。你可以把它当成一个「地图」,后续章节都会围绕这张图展开。
1.6 合规要求速览
说到合规,这是国密绕不开的话题。我参与过好几个密评项目,总结下来,核心要求就三条:
- 算法合规:必须使用国家密码管理局批准的算法实现,不能自己写一个「类 SM4」的算法。
- 实现合规:算法实现必须通过国密局检测,拿到《商用密码产品认证证书》。
- 应用合规:在等保 2.0 三级及以上系统中,网络通信、数据存储、身份认证必须使用国密算法。
我曾经见过一个项目,开发团队自己用 OpenSSL 的 ECDSA 改了个 SM2 接口,结果密评时直接被判定为「不合规」。为什么?因为 OpenSSL 的 SM2 实现没有通过国密局检测,不能用于合规场景。