国密算法概述:SM2、SM3、SM4 到底能干啥

好,咱们正式开始。

作为第一章,我想先聊聊“国密”到底是什么,以及它们为什么能在 KMS(密钥管理系统)里站稳脚跟。你可能听说过换密码标准是件大工程,甚至会觉得“不就是把 RSA 换成 SM2 嘛”,但其实没那么简单。

我个人最早接触国密是在一次政务云的合规改造项目里。客户甩过来一句:“年底前必须过国密局测评。”我一开始也头大,后来才发现,只要理解了这几套算法的设计初衷,上手其实挺快的。说白了,国密不是玄学,是一套很务实的标准。

国密算法在 KMS 中的三层架构 国密算法在KMS中的角色定位 SM2 非对称加密 密钥协商 / 数字签名 SM4 对称加密 数据加密 / 传输保护 SM3 密码杂凑 完整性校验 / 消息认证 KMS 密钥管理功能层 密钥生成 → 密钥存储 → 密钥轮换 → 密钥销毁 业务场景:电子签章 · 数据加密存储 · 安全传输 · 身份认证

什么叫“国密体系”

国密,全称是国家商用密码算法。它不是某一个算法,而是从非对称、对称到哈希的完整套件。你想想看,以前用国际标准做密钥管理系统,签名用 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 通常用来做“信封加密”:

  1. 客户端生成一把临时 SM4 密钥(DEK,数据加密密钥)。
  2. 用这把 DEK 加密真实业务数据。
  3. 再用 KMS 中的 SM2(或主密钥)加密 DEK。
  4. 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 中的具体代码实现。准备好了吗?