一、国密算法概述:SM2/SM3/SM4/SM9 算法原理、应用场景与合规要求

各位同学,咱们今天聊国密。说实话,我刚入行那会儿,对国密的印象就是「SM 开头的几个算法,跟国际算法长得差不多」。直到有一次在金融项目里,因为 SM2 签名长度没算对,导致报文被网关直接丢弃……嗯,从那以后我再也不敢小看这些细节了。

国密算法,全称是中国商用密码算法。它不是一个算法,而是一套体系。你想想看,从非对称加密、对称加密到哈希,再到标识密码,国密都给你配齐了。今天这一章,咱们就把 SM2、SM3、SM4、SM9 这四个核心算法掰开揉碎讲清楚。

核心认知: 国密不是「替代品」,而是「自主可控的密码体系」。在等保 2.0、密评、关键信息基础设施保护中,国密合规是硬门槛。

1.1 SM2:椭圆曲线公钥密码算法

SM2 是国密体系里的非对称加密算法,对标的是国际上的 ECDSA 和 ECDH。它基于椭圆曲线上的离散对数难题,密钥长度 256 位,安全强度与 RSA-3072 相当,但计算效率更高。

我个人习惯把 SM2 拆成三个功能来看:

  • 加密/解密:使用 SM2 公钥加密,私钥解密。适合小数据量的加密场景,比如传输对称密钥。
  • 数字签名:私钥签名,公钥验签。这是 SM2 最常用的场景,比如身份认证、数据完整性保护。
  • 密钥交换:双方通过 SM2 协商出一个共享密钥,用于后续对称加密。

我在项目中遇到过一个问题:SM2 签名结果是一个 64 字节的结构体(r || s),但有些开发者把它当成 65 字节的 DER 编码来解析,结果验签一直失败。避坑指南:SM2 签名原始格式就是 64 字节,别多解析。

功能 密钥长度 签名/密文长度 典型场景
加密 256 位 密文比明文多 96 字节 数字信封、密钥传输
签名 256 位 64 字节 身份认证、电子签章
密钥交换 256 位 协商数据约 128 字节 TLS 握手、VPN

1.2 SM3:密码杂凑算法

SM3 是国密里的哈希算法,输出 256 位(32 字节)的摘要值。它跟 SHA-256 在结构上很像,但细节上有差异——比如消息扩展的轮数、压缩函数的置换逻辑。

说白了,SM3 就是给数据「算指纹」的。你传一个文件,我算一下 SM3 值,对比一下就知道文件有没有被篡改。

我曾经在日志审计系统里踩过一个坑:SM3 的初始值 IV 是固定的 8 个 32 位字,但有些开源库实现时把 IV 顺序搞反了,导致同一个数据在不同库算出来的摘要不一样。嗯,遇到这种情况,先检查 IV 的字节序。

小提示: SM3 的摘要长度是 32 字节,不是 64 字节。很多人在做国密改造时,习惯性地把 SM3 当成 SHA-256 来用,但要注意 SM3 的填充规则和 SHA-256 不完全一致。

1.3 SM4:分组密码算法

SM4 是国密里的对称加密算法,分组长度 128 位,密钥长度 128 位。它跟 AES 一样,都是分组密码,但 SM4 用的是 Feistel 结构,而 AES 用的是 SPN 结构。

SM4 支持五种工作模式,我列个表给你看:

模式 特点 适用场景
ECB 简单,但相同明文得到相同密文 不推荐,除非数据量极小
CBC 需要 IV,密文有扩散性 文件加密、数据库加密
CFB 流式加密,适合实时数据 网络流加密
OFB 流式,错误不传播 卫星通信、低误码容忍场景
CTR 可并行,性能高 高性能加密、磁盘加密

我个人习惯在项目中优先用 SM4-CBC 或 SM4-CTR。CBC 模式要注意 IV 必须是随机生成的,而且每次加密都要换 IV。我曾经见过一个项目,IV 写死在代码里,结果密文模式被破解,数据全泄露了。

警告: SM4 的密钥长度只有 128 位,虽然目前足够安全,但在量子计算面前可能不够看。如果你的系统需要长期保护(10 年以上),建议考虑 SM2 加密或 SM9 标识加密。

1.4 SM9:标识密码算法

SM9 是国密体系里比较「新」的算法,它基于双线性对(Pairing)技术,最大的特点是不需要数字证书。你想想看,传统的 PKI 体系需要 CA、证书链、CRL,管理起来很麻烦。SM9 直接用用户的标识(比如邮箱、手机号、身份证号)作为公钥,私钥由密钥生成中心(KGC)颁发。

SM9 的核心优势:

  • 无需证书:公钥就是标识,省去了证书管理和验证的开销。
  • 密钥托管:KGC 可以生成用户的私钥,适合企业内部管控。
  • 加密与签名:SM9 同时支持加密和数字签名。

我在物联网项目里用过 SM9。设备端只需要知道服务器的标识(比如 server@company.com),就能加密数据,不需要预置证书。但要注意,KGC 是单点风险,一旦 KGC 被攻破,所有用户的私钥都可能泄露。

合规要点: SM9 在《GM/T 0044-2016 标识密码算法》中有明确定义。如果你的系统需要满足密评要求,SM9 是可以替代 SM2 的,但前提是 KGC 必须部署在安全环境中。

1.5 国密算法全景图

下面这张图,是我自己整理的国密算法知识体系。你可以把它当成一个「地图」,后续章节都会围绕这张图展开。

国密算法全景图 国密算法全景图 中国商用密码算法体系 SM2 公钥密码 SM3 密码杂凑 SM4 分组密码 SM9 标识密码 加密/解密 数字签名 数据摘要 CBC/CTR ECB/CFB 合规要求:等保 2.0 三级及以上、密评、关基保护均要求使用国密算法 SM2/SM3/SM4 为强制要求,SM9 为可选但推荐

1.6 合规要求速览

说到合规,这是国密绕不开的话题。我参与过好几个密评项目,总结下来,核心要求就三条:

  1. 算法合规:必须使用国家密码管理局批准的算法实现,不能自己写一个「类 SM4」的算法。
  2. 实现合规:算法实现必须通过国密局检测,拿到《商用密码产品认证证书》。
  3. 应用合规:在等保 2.0 三级及以上系统中,网络通信、数据存储、身份认证必须使用国密算法。

我曾经见过一个项目,开发团队自己用 OpenSSL 的 ECDSA 改了个 SM2 接口,结果密评时直接被判定为「不合规」。为什么?因为 OpenSSL 的 SM2 实现没有通过国密局检测,不能用于合规场景。

实战建议: 如果你的项目需要过密评,直接用国密局认证的硬件密码模块(如 PCI-E 密码卡、USB Key)或软件密码库(如 GmSSL、SDF 接口库)。别自己造轮子,合规成本太高。