1. 国密算法概述:SM2/SM3/SM4 算法原理、国密与国际算法对比、国密证书体系架构
各位同学,咱们今天正式进入国密证书配置的第一章。说实话,我最早接触国密是在一个政务云项目里,客户要求必须用国密证书,我当时连 SM2 和 SM3 都分不清。后来踩了不少坑,才慢慢摸清楚这套体系的来龙去脉。今天我就把这几年的经验揉碎了讲给你听。
1.1 国密算法家族:SM2、SM3、SM4 到底在干什么?
国密算法不是单个算法,而是一整套密码工具包。你可以把它想象成工具箱:SM2 是扳手(非对称加密 + 签名),SM3 是尺子(哈希摘要),SM4 是螺丝刀(对称加密)。各司其职,缺一不可。
SM2:椭圆曲线公钥密码算法
SM2 是国密体系里的核心,它同时支持加密和数字签名。底层基于椭圆曲线离散对数难题,说白了就是:已知椭圆曲线上的点 P 和 kP,想反推出 k 几乎不可能。我习惯把 SM2 比作「带锁的邮箱」—— 公钥是邮箱地址,私钥是邮箱钥匙。
SM2 关键参数(256 位椭圆曲线):
- 曲线方程:y² = x³ + ax + b(在素数域 Fp 上)
- 密钥长度:私钥 256 位,公钥 512 位(未压缩)
- 签名长度:约 512 位(r, s 各 256 位)
- 安全强度:与 3072 位 RSA 相当
我在项目中遇到过一个问题:SM2 签名结果不是固定长度的。因为 r 和 s 是大整数,高位可能为 0,所以实际签名长度在 64~72 字节之间浮动。如果你写解析代码时硬编码了长度,很容易出 bug。
SM3:密码杂凑算法
SM3 就是国标版的 SHA-256。它把任意长度的输入压缩成 256 位(32 字节)的摘要。SM3 的设计借鉴了 SHA-256 的 Merkle-Damgård 结构,但做了不少改进,比如消息扩展的轮数更多、压缩函数的非线性更强。
我个人的经验:SM3 在软件实现上比 SHA-256 慢大约 10%~15%,但在硬件加速下差距几乎可以忽略。如果你在嵌入式设备上跑国密,建议优先用硬件 SM3 模块。
SM4:分组对称密码算法
SM4 是国标的 AES 替代品。它采用 128 位分组、128 位密钥,轮数 32 轮。结构上属于 Feistel 网络,加解密流程完全对称——这一点和 AES 不同,AES 是 SPN 结构,加解密不完全对称。
嗯,这里要注意:SM4 的密钥扩展算法和加解密算法是分开的。我见过有人把密钥扩展结果直接当轮密钥用,结果解密死活不对。正确的做法是:先通过密钥扩展生成 32 个轮密钥,再按顺序(加密用 k0~k31,解密用 k31~k0)送入轮函数。
1.2 国密 vs 国际算法:一张表说清楚
很多同学问我:「国密到底比国际算法强在哪?」其实不能简单说谁强谁弱,而是设计理念和适用场景不同。我整理了一张对比表,你一看就明白:
| 对比维度 | 国密算法 | 国际算法 |
|---|---|---|
| 非对称加密 | SM2(256 位椭圆曲线) | RSA(2048/3072 位)、ECDSA(256 位) |
| 哈希算法 | SM3(256 位输出) | SHA-256(256 位输出) |
| 对称加密 | SM4(128 位分组,128 位密钥) | AES(128 位分组,128/192/256 位密钥) |
| 密钥长度 | SM2 私钥 256 位,公钥 512 位 | RSA 私钥 2048~4096 位 |
| 签名速度 | SM2 签名快(约 2000 次/秒) | RSA 签名慢(约 200 次/秒) |
| 安全强度 | SM2 ≈ 3072 位 RSA | ECDSA 256 位 ≈ 3072 位 RSA |
| 标准化组织 | 中国国家密码管理局(GMT 系列) | NIST、ISO/IEC |
| 合规要求 | 国内等保、密评强制要求 | 国际通用,国内部分场景不认可 |
我曾经踩过的坑:在某个项目中,我们同时使用了 SM2 和 ECDSA 的证书,结果在证书链验证时,OpenSSL 默认只认国际算法,SM2 证书链验证失败。后来才发现需要加载国密引擎(GmSSL 或 Tongsuo)才能正确验证。所以,不要以为装了国密证书就能直接用 OpenSSL 验证,工具链必须配套。
1.3 国密证书体系架构:从根证书到终端实体
国密证书体系的结构和国际 PKI 体系基本一致,都是树形信任链。但有几个关键差异点,我画了一张图帮你理解:
从这张图你能看到,国密证书体系的核心特点:
- 根 CA 必须使用 SM2 算法,密钥长度 256 位,证书格式遵循 GMT 0015-2012 标准。
- 二级 CA 可以交叉认证,既可以是国密根 CA 签发,也可以是国际根 CA 签发(但签名算法必须用 SM2)。
- 终端实体证书包括 SSL 服务器证书、客户端证书(UKey)、代码签名证书等,全部使用 SM2 密钥对。
- 证书扩展字段使用国密专属 OID,比如 SM2 签名算法 OID 是 1.2.156.10197.1.501,SM3WithSM2 签名 OID 是 1.2.156.10197.1.501.2。
我建议你记住这个 OID:1.2.156.10197.1.501。在配置 Nginx 或 Apache 的国密证书时,你需要手动指定签名算法 OID,否则 OpenSSL 会报「unknown algorithm」错误。这个坑我至少帮三个团队排查过。
1.4 国密证书 vs 国际证书:核心差异
你可能会问:「国密证书和普通 X.509 证书到底差在哪?」我直接给你列几个关键点:
| 对比项 | 国密证书 | 国际证书(RSA/ECDSA) |
|---|---|---|
| 签名算法 | SM3WithSM2(OID: 1.2.156.10197.1.501.2) | sha256WithRSAEncryption / ecdsa-with-SHA256 |
| 公钥算法 | SM2(OID: 1.2.156.10197.1.301) | rsaEncryption / id-ecPublicKey |
| 证书格式 | X.509 v3,扩展字段使用国密 OID | X.509 v3,标准扩展字段 |
| 密钥用法 | digitalSignature, keyEncipherment(SM2 同时支持) | digitalSignature(签名)、keyEncipherment(加密)分开 |
| 证书链验证 | 需要国密引擎(GmSSL / Tongsuo) | OpenSSL 原生支持 |
| 合规场景 | 等保三级以上、密评、政务云、金融核心 | 通用互联网、非强制合规场景 |
特别注意:国密证书的密钥用法字段和 RSA 证书不同。SM2 证书的密钥用法可以同时包含 digitalSignature 和 keyEncipherment,因为 SM2 算法本身同时支持签名和加密。但有些 CA 签发时只写了一个,导致 SSL 握手时报错。我建议你在申请证书时,明确要求 CA 在密钥用法里写上 digitalSignature, keyEncipherment 两个值。
1.5 国密算法的实际应用场景
说了这么多理论,咱们看看实际中怎么用。我归纳了三个最常见的场景:
- SSL/TLS 国密套件:使用 SM2 证书 + SM4 对称加密 + SM3 消息认证,实现国密 HTTPS。典型套件是
ECC-SM2-SM4-SM3。 - 国密数字签名:在电子合同、电子发票、政务审批中,使用 SM2 签名 + SM3 摘要,替代 RSA 签名。
- 国密加密存储:使用 SM4 加密数据库敏感字段,SM3 做完整性校验,替代 AES + SHA-256。
我个人最常遇到的是第一个场景。很多客户说「我配了国密证书,但浏览器还是报不安全」,其实就是因为浏览器不支持国密套件。你需要用国密浏览器(如 360 国密版、红莲花浏览器)或者通过国密网关做协议转换。