国密算法概述与标准体系
说起国密算法,很多刚入行的朋友第一反应就是:“哦,就是那套跟国际算法不一样的国产密码标准。”这话没错,但太笼统了。我个人习惯把国密算法看作一套完整的密码武器库——从椭圆曲线到对称分组,从哈希函数到随机数生成,每个算法都有它自己的定位和脾气。你只有理解了这套体系的骨架,后面讲密钥分层架构时才不会头晕。
国密算法家族谱
国密算法主要由国家密码管理局发布,目前咱们最常打交道的核心算法有这几个:
- SM2:基于椭圆曲线密码(ECC)的非对称算法,取代 RSA。
- SM3:密码杂凑算法,输出 256 位哈希值,对标 SHA-256。
- SM4:对称分组密码算法,分组长度 128 位,密钥长度也是 128 位。
- SM9:基于标识的密码算法,不需要数字证书。
- ZUC(祖冲之算法):流密码算法,主要用于移动通信。
嗯,这里要注意,很多人容易把 SM1 和 SM4 搞混。SM1 是早期的不公开算法,商用场景基本靠硬件加密卡实现;SM4 才是咱们软件层最常用的对称加密算法。我在项目里见过有人拿着 SM1 的文档去对接 SM4 的接口,结果死磕了两天…… 后来发现是算法选错了。
标准体系的三层结构
国密标准体系,说白了,不是一堆标准文件胡乱堆在一起的。它有一套清晰的层级逻辑。我把它总结成三层结构:
| 层级 | 标准编号示例 | 定位 |
|---|---|---|
| 基础密码算法标准 | GB/T 32918(SM2),GB/T 32905(SM3),GB/T 32907(SM4) | 定义算法本身的数学原理、接口和数据格式 |
| 密码协议与接口标准 | GM/T 0009(SM2 密码机),GM/T 0010(SM3 密码机) | 规定怎么用算法,比如密钥交换、数字信封的流程 |
| 应用与产品标准 | GM/T 0028(密码模块安全),GM/T 0060(安全芯片) | 面向具体行业和产品的约束,比如金融、政务设备 |
你发现没有?标准体系中,基础层管“能不能用”,协议层管“怎么用”,应用层管“用在哪”。密钥分层架构的规范主要集中在协议层和应用层,因为密钥的分发、派生和生命周期管理都跟这两层紧密相关。
主流国密算法速览
为了后面讲密钥分层时不跑偏,咱们先快速过一遍每个算法的密钥结构。这是基本功,我建议你花点时间记住这张表:
| 算法 | 密钥类型 | 密钥长度(位) | 典型用途 |
|---|---|---|---|
| SM2 | 公钥/私钥对 | 私钥 256,公钥 512(含2个坐标分量) | 签名、密钥交换、数字信封 |
| SM3 | 无密钥(杂凑) | 输出 256 | 消息摘要、完整性校验 |
| SM4 | 对称密钥 | 128 | 数据加密、通信链路加密 |
| SM9 | 用户私钥/系统主密钥 | 主密钥 256,用户私钥可变 | 无证书的签名与加密 |
| ZUC | 流密钥 | 128 | 无线通信的实时加密 |
我的小经验:SM2 的私钥长度虽然也是 256 位,但它的安全强度对标的是 3072 位 RSA。为什么呢?因为椭圆曲线离散对数问题比大整数分解难得多。你想想看,同样安全级别,256 位和 3072 位,传输成本和存储开销差了多少——这也就是为什么国密体系里,SM2 成了签名和密钥交换的首选。
密钥分层架构的底层逻辑
密钥分层架构,说人话就是:不要把所有的鸡蛋都放在同一个篮子里。如果系统里只有一把主密钥加密所有数据,那这把密钥一旦泄露,整个系统就跟没穿衣服一样。
我看过不少早期国密改造的项目,它们犯的最典型错误是:所有密钥都从同一个种子派生,但种子保护得极其草率。我曾经处理过一个银行网银系统的案例,厂商把所有 SM4 密钥直接硬编码在配置文件中,里面还写着注释放的是什么——嗯,我到现在想起来都觉得后背发凉。
所以,密钥分层的核心思路是:
- 根密钥:最高级别的密钥,物理隔离,仅供上层密钥派生。
- 主密钥:从根密钥派生,保护次级密钥和元数据。
- 工作密钥:直接从主密钥派生,用于实际的加解密操作。
- 会话密钥:最底层的临时密钥,一次一密,用完即丢。
这个层级之间靠密钥派生函数(KDF)串联,通常用 SM3 或 SM4 的 CMAC 模式来实现。说白了,每一层只能通过 KDF 访问下一层,不能跨层操作。
核心原则:根密钥永不落地,主密钥只在启动时加载,工作密钥到期自动轮换,会话密钥随通信会话销毁。这就是密钥分层的安全边界。
SVG:国密算法全景总览
这张图我故意画成了分类+关系的结构。上面是国家密码管理局的标准顶层,下面展开成三大块:非对称算法、对称算法、杂凑算法。箭头表示“可配合使用”。记住这个总览图,后面章节的每次密钥分层都与这张图上的算法线直接挂钩。
标准体系中的关键文件
做国密改造时,有几份标准你得手边常备。我给你列一个“必读清单”:
- GM/T 0018-2012:密码设备应用接口规范,定义了 SM2/SM3/SM4 的统一调用接口。我建议你把它当作入门第一份文档。
- GB/T 32918.1-2016:SM2 椭圆曲线公钥密码算法,第一部分总则。里面画出了密钥对生成的流程,后面讲密钥分层时离不开。
- GB/T 32907-2016:SM4 分组密码算法,附录 B 有密钥扩展算法的伪代码,可以自己动手实现一遍。
- GM/T 0028-2014:密码模块安全要求,这是密钥生命周期管理的“宪法”。里面规定了密钥生成、分发、存储、使用、归档和销毁的全流程要求。
我曾经踩过的坑:千万别只读算法标准不看协议标准。我见过一个项目团队按照 SM4 的国标实现了加密模块,结果对接系统时发现,对方用的是 SM4-GCM 模式,但国标里只定义了 ECB 和 CBC。最后他们连夜赶工加了 GCM 的完整实现才没延期。所以,看标准要把 GB/T(基础算法)和 GM/T(应用协议)配套着看。
密码算法合规性要点
搞国密,最怕的是“实现了一个算法,但没通过认证”。这里面的合规要求其实挺细的:
- 算法实现:SM2 的椭圆曲线参数必须使用标准推荐的曲线,不能自己另起炉灶。
- 密钥长度:各类算法都有规定的密钥长度,不能为了“更安全”随意加长——比如 SM4 就是 128 位,变不了。
- 随机数质量:SM2 签名和密钥生成都需要随机数,必须使用国密标准中规定的随机数发生器算法。
- 密码模块等级:根据 GM/T 0028,密码模块分 4 个安全等级。如果产品要过等保三级,至少得达到安全等级 2。
你想想看,如果这些点没摸清,等到送检的时候被退回来,那返工成本可不是小数目。我建议你在项目初期就拉一张合规检查表,逐条对照标准审查。后面我们讲密钥分层架构时,也会结合这些合规要求来设计案例。