国密算法概述:SM2、SM3、SM4 到底能干啥
好,咱们正式开始。
作为第一章,我想先聊聊“国密”到底是什么,以及它们为什么能在 KMS(密钥管理系统)里站稳脚跟。你可能听说过换密码标准是件大工程,甚至会觉得“不就是把 RSA 换成 SM2 嘛”,但其实没那么简单。
我个人最早接触国密是在一次政务云的合规改造项目里。客户甩过来一句:“年底前必须过国密局测评。”我一开始也头大,后来才发现,只要理解了这几套算法的设计初衷,上手其实挺快的。说白了,国密不是玄学,是一套很务实的标准。
什么叫“国密体系”
国密,全称是国家商用密码算法。它不是某一个算法,而是从非对称、对称到哈希的完整套件。你想想看,以前用国际标准做密钥管理系统,签名用 ECDSA,加密用 AES,哈希用 SHA-256,混在一起容易出兼容性问题。国密的意义就是把这一套统一起来。
具体来说,核心三件套是:
| 算法 | 类型 | 密钥长度 | 设计对标 | 主要用途 |
|---|---|---|---|---|
| SM2 | 非对称(椭圆曲线) | 256 位 | RSA / ECDSA | 密钥交换、数字签名、密钥协商 |
| SM4 | 对称(分组密码) | 128 位 | AES-128 | 数据加密、传输加密 |
| SM3 | 密码杂凑 | 256 位摘要 | SHA-256 | 完整性校验、数字指纹 |
嗯,这里要注意:SM2 不是 SM1 的升级版。SM1 是硬件级对称算法,基本不暴露接口,你很难直接调它。而 SM2、SM3、SM4 都是公开标准,GMT 0003-2012、GMT 0004-2012 这些文档在网上一搜就有。
SM2:非对称加密的国产主力
SM2 用的是 256 位素域上的椭圆曲线。我记得第一次看标准曲线参数时觉得特别繁琐,后来发现直接调现成的密码库(比如 GmSSL、PolarSSL、PyCryptodome 的国密分支)就好。你不需要自己实现点加和倍点运算,除非你在给芯片写固件。
它在 KMS 里的核心场景有两个:
- 密钥协商:客户端和 KMS 各拿自己的 SM2 密钥对,通过 ECDH 派生出一把临时会话密钥。我用这种方法做过跨机房的加密通道,握手效率比 RSA 2048 快了不少。
- 数字签名:对 API 请求参数取 SM3 哈希后用 SM2 签名,服务端验签。这个模式我现在几乎每个项目中都用,完全替代了 HMAC。
避坑指南:我曾经遇到过 SM2 签名结果编码不一致的问题。标准签名输出是 DER 编码的 ASN.1 结构,但有些厂商直接打包成原始 r||s 字节。对接前一定先确认编码格式,不然验签稳挂。
SM4:对称加密的主力担当
SM4 是 128 位块大小的分组密码,轮数 32 轮,结构类似 AES,但 S 盒和密钥扩展算法是自主设计的。说实话,它的运算速度在软件实现上跟 AES-128 基本持平。我做过压测,单核纯软件 SM4 的吞吐量能达到 300 MB/s 以上。
在 KMS 的架构里,SM4 通常用来做“信封加密”:
- 客户端生成一把临时 SM4 密钥(DEK,数据加密密钥)。
- 用这把 DEK 加密真实业务数据。
- 再用 KMS 中的 SM2(或主密钥)加密 DEK。
- KMS 只存储加密后的 DEK,数据安全性和管理效率都兼顾了。
我个人的习惯:SM4 的 ECB 模式基本不用,哪怕数据长度对齐。CBC 或 GCM 模式更有安全感。特别是有完整性保护需求的场景,SM4-GCM 在国家标准 GM/T 0054-2018 里已经有明确定义,强烈推荐。
SM3:密钥管理的“体检报告”
SM3 的输出是 256 位哈希值,压缩函数跟 SHA-256 很像,但轮常数和消息扩展方式不同。其实做 KMS 的人很少直接拿 SM3 去对用户数据做哈希,SM3 的主要用途是:
| 用途 | 说 明 |
|---|---|
| 消息认证 | SM3 + 密钥散列成 HMAC,确保 API 请求不被篡改。 |
| 密钥派生 | 比如用 SM3 对主密钥和 counter 做 KDF,生成子密钥。 |
| 完整性校验 | 对加密后的密文取 SM3 摘要,防止存储或传输时的数据损坏。 |
你想想看,如果每次从 KMS 取回的加密密钥都带上 SM3 校验值,即使有人偷偷改过密文也能马上发现。我在写审计日志时也会把每条日志的 SM3 一并记进去,事后对账省了很多力气。
三者在 KMS 中的协作模型
一个典型的国密 KMS 流程大概是这样的:
- 客户端发起“生成加密密钥”请求。
- KMS 使用 SM4 生成 DEK 并返回。
- 请求和响应都用 SM2 签名 + SM3 哈希校验。
- 所有敏感操作的日志都记录 SM3 指纹。
这套组合能在满足国密合规的前提下,把性能压得跟国际标准差不多的水平。我记得有个政务系统迁移后,整体响应时间只多了不到 5%,合规却一步到位了。
注意:国密算法的实现必须使用经过国家密码管理局认证的密码模块(比如经检测的 HSMs 或软件密码库)。直接拿开源实现商用有合规风险。我建议在选型阶段就把这块问清楚,否则上线前测评被卡住就很痛苦了。
好了,第一章的核心就是给这三兄弟画个像。后面我们会深入到 SM2 签名验签、SM4 加解密、SM3 校验在 KMS 中的具体代码实现。准备好了吗?