国密算法概述与标准体系归纳总结
各位好,我是这次课程的主讲。咱们第一讲,先把国密算法的底子打牢。说白了,就是搞清楚「国密是什么」「标准体系长什么样」。我在早年做密码应用合规项目时,就见过不少团队把 SM2 跟 SM3 搞混,甚至拿着开源库的 RSA 签名硬充国密——结果被测评机构打回重做。嗯,这一章我们就来一次彻底梳理。
国密算法是什么
国密算法,全称是国家密码管理局发布的商用密码算法标准。它包含对称密码、公钥密码、杂凑密码三大类。我个人的理解是:你把它们当成「中国版的 AES+RSA+SHA」组合就行,但细节上差异不小。
目前主流的国密算法有这几个:
- SM1 —— 对称加密,硬件实现,不公开算法细节,常用于智能IC卡、加密机
- SM2 —— 椭圆曲线公钥密码(包括加密、签名、密钥交换),对标 ECDSA/ECIES
- SM3 —— 密码杂凑算法,输出256位摘要,对标 SHA-256
- SM4 —— 分组对称加密,密钥长度128位,对标 AES-128
- SM9 —— 基于标识的密码(IBC),不需要数字证书分发公钥
- ZUC(祖冲之算法)—— 流密码,主要用于移动通信加密
一个小提示:你在 Secrets Manager 里最常打交道的是 SM2(用于密钥封装和数字签名)、SM3(完整性校验与派生)、SM4(数据加密存储)。SM9 也有应用场景,但当前支持度不如前三个那么普遍。
标准体系是如何组织的
国密的标准化工作由国家密码管理局主导,归口到密码行业标准(GM/T 系列)。我刚开始接触时,看着一堆标准号挺头疼——GM/T 0003、GM/T 0004、GM/T 0009……后来总结了一个规律,你把它们按功能分层就清晰了。
| 层次 | 标准举例 | 说明 |
|---|---|---|
| 算法层 | GM/T 0003(SM2) GM/T 0004(SM3) GM/T 0002(SM4) GM/T 0081(SM9) |
定义具体数学运算、参数、接口 |
| 协议层 | GM/T 0024(SSL VPN 国密) GM/T 0054(IPsec 国密) GM/T 0016(智能密码钥匙) |
规定算法在通信协议中的使用方式 |
| 应用层 | GM/T 0028(密码模块安全) GM/T 0051(电子签章) GM/T 0091(密钥管理系统) |
面向具体业务场景的规范要求 |
你在做 Secrets Manager 集成时,最需要盯紧的是 GM/T 0091 和 GM/T 0051——前者管密钥全生命周期,后者涉及数字签名在凭证分发中的法律效力。我记得有一次对接某政务云,对方要求密钥存储必须符合 GM/T 0091 三级要求,我们临时补了密钥备份和审计日志模块,折腾了好几天。
国密与国际算法的对比
你想想看,既然已经有了 AES/SHA/RSA,为什么还要用国密?核心原因就两点:合规要求与自主可控。但具体到性能、安全性上,它们之间有什么实质差异?我整理了一个表,方便你快速对照。
| 对比维度 | 国密 | 国际算法 |
|---|---|---|
| 对称加密 | SM4(128位密钥) | AES(128/192/256位) |
| 公钥加密 | SM2(256位素域椭圆曲线) | RSA(2048位以上)/ ECDSA |
| 杂凑 | SM3(256位摘要) | SHA-256 |
| 性能特点 | SM2 签名较快,加密稍慢 SM3 接近 SHA-256 SM4 软件实现略慢于 AES-NI |
AES-NI 指令集加速明显 RSA 签名慢但验签可优化 ECDSA 在相同安全强度下密钥短 |
| 合规要求 | 国内等保、密评必考 | 常见于国际标准,国内可选 |
注意:SM2 的曲线参数是固定的(不同于 ECDSA 可以选多条曲线),所以你在实现密钥对生成时,必须使用标准指定的曲线。我曾经看到有人从 Bouncy Castle 里随便拉了一条 secp256r1 当 SM2 用,结果签名验签死活对不上——曲线方程完全不一样。
国密标准体系全景图
下面这张图概括了从算法到应用的整体层级关系。你在设计 Secrets Manager 的密码方案时,可以把它当路线图用——先选好算法层的 SM2/SM3/SM4,然后看协议层是否有现成的 TLS 国密套件,最后对照应用层的 GM/T 0091 检查密钥存储方式。
算法选型思路
在 Secrets Manager 的实际开发中,你怎么选算法?我个人的习惯是三步走:
- 看业务场景:是不是需要数字签名?如果需要,SM2 签名叫得响。如果只是数据加密,SM4 就够了。
- 看硬件支持:国产 CPU(如飞腾、鲲鹏、龙芯)都在逐步提供 SM3/SM4 的指令集加速。如果你的机器支持国密指令,我建议优先用硬件加速,性能差距可能达到 3~5 倍。
- 看合规等级:等保三级以上必须使用国密算法。如果只是内部测试环境,可以先用国际算法做功能验证,上线前切为国密。
一个小经验:当你需要把 SM4 密钥交给另一个系统时,别忘了用 SM2 公钥加密传输。直接明文传 SM4 密钥,在密评里会被判定为高风险项。我在一个金融项目中见过这样的问题,后来在密钥分发环节加了 SM2 的加密信封才通过测评。
常见误区
说几个我踩过的坑:
- SM2 签名结果不是固定长度:它包含 r 和 s 两个大整数,标准编码为 DER 格式(长度通常 70~72 字节)。别用固定长度去截取。
- SM3 输出是 32 字节,不是 64 字节:跟 SHA-256 一样。有人把 SM3 理解成 64 字节,导致签名摘要环节出错。
- SM4 在 CBC 模式下需要随机 IV:很多人图省事用了固定 IV,这是 AES 时代就强调过的问题。国密标准里同样要求 IV 必须每次随机生成。