1、国密算法概述:SM2/SM3/SM4/SM9算法原理、标准规范与适用场景

国密算法,说白了就是咱们国家自己的密码算法标准。早些年很多系统用的都是国际算法,比如 RSA、AES 这些。但现在形势变了,等保 2.0 和密评都要求“优先采用国密算法”。所以我个人建议,做云上安全方案的朋友,最好早点把国密集成能力储备起来。

嗯,这里先给大家梳理一下核心的四类算法:

  • SM2:非对称密码算法(椭圆曲线公钥密码)
  • SM3:密码杂凑算法(哈希算法)
  • SM4:对称密码算法(分组密码)
  • SM9:基于标识的非对称密码算法(IBC)

我在项目中遇到过不止一次,很多人把 SM2 直接类比成 RSA,把 SM4 直接类比成 AES。其实这个思路大方向没错,但细节差异很大,特别是密钥管理和证书格式上。咱们一个一个看。

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

SM2 是国密体系里的“门面担当”。它基于椭圆曲线密码学(ECC),但和我们熟悉的 ECDSA 或 ECDH 不是同一套参数。为什么?因为它用的曲线参数是咱们国家自研的。

标准上,SM2 分两个部分:

  • 数字签名算法——对标 ECDSA
  • 密钥交换与加密算法——对标 ECDH + 加密

我记得最早接触 SM2 是在 2017 年做某政务云项目。当时厂商提供的 SDK 里,SM2 公钥长度是 64 字节,私钥 32 字节。这个长度在性能上比 RSA-2048 快很多,但在证书解析和跨平台兼容上踩了不少坑。

实用技巧:SM2 签名结果由两个 256 位整数 (r, s) 组成。在阿里云 KMS 中调用 SM2 签名时,返回的 raw 数据就是 r||s 的拼接,共 64 字节。别和 DER 编码搞混了。

1.2 SM3:密码杂凑算法

SM3 输出 256 位摘要,也就是 32 字节。它和 SHA-256 的对标关系非常直接。你想想看,SHA-256 在区块链和 TLS 里用得那么多,SM3 在国产化场景里就是它的“平替”。

标准编号是 GM/T 0004-2012。它的压缩函数结构和 SHA-256 有相似之处,但内部的置换和消息扩展做了特别设计。安全性上,SM3 的摘要长度和 SHA-256 一样,抗碰撞能力在理论上优于 MD5 当然没问题。

曾经在合规审查时,客户要求所有日志完整性校验必须用 SM3。我当时用的方案是 KMS 的 SM3 计算接口直接出摘要,不走本地实现,这样审计链路上更干净。

避坑指南:我曾经见过有人把 SM3 和 SM2 的密钥混淆。注意:SM3 是哈希算法,不需要密钥。它和 HMAC-SM3 是两回事,后者才需要密钥参与。

1.3 SM4:分组密码算法

SM4 是对称加密,分组长度 128 位,密钥长度 128 位。标准是 GM/T 0002-2012。它的加密轮数是 32 轮。我个人的评价是:SM4 的轮函数设计非常规整,软硬件实现都很友好。

在实际使用中,SM4 应用最广的是数据库加密和 VPN 加密。尤其是在阿里云 KMS 里,SM4 的密钥可以用作信封加密的数据密钥,也可以直接用于小包加密。

SM4 的操作模式我们常见的有:

  1. ECB 模式——基本不用,不安全
  2. CBC 模式——用得最多,需要 IV
  3. GCM 模式——同时加密和认证,我也推荐用

说句实在话,很多开发者刚接触 SM4 时,容易把密钥长度搞错。SM4 密钥是 16 字节,不是 32 字节。我之前在对接某个第三方网关时就遇到了这个问题,对方传了个 32 字节的密钥过来,SM4 直接解析失败。

1.4 SM9:基于标识的非对称密码算法

SM9 是最特殊的一个,也是我个人觉得未来潜力最大的。它不需要数字证书。私钥由密钥生成中心(KGC)根据用户标识(比如邮箱、手机号、身份证号)生成。

标准编号是 GM/T 0044-2016。SM9 的核心是双线性对运算,所以计算开销比 SM2 大不少。但它省去了证书管理和验证的复杂流程,特别适合 IoT 和车联网这种设备数量大、证书管理成本高的场景。

举个例子:我记得有个智能门锁的项目,设备端存储资源非常有限,没办法存储完整的 X.509 证书链。用 SM9 的话,只要预置 KGC 公参数,用户标识就是公钥,私钥在安全环境下生成后注入设备。这就解决了证书分发的大难题。

总结对比:SM9 是“去证书化”的密码体系,在降低管理复杂度的同时,对 KGC 的安全要求极高。在云环境里,KGC 建议放在 KMS 中托管,不要自建。

整体知识体系与适用场景

下面的 SVG 图把这四种算法在《阿里云KMS与国密集成实践》中的定位和关系画了出来。你可以看到,SM2 和 SM4 是最常用的,SM3 作为摘要算法贯穿其中,SM9 则专注于特定场景。

国密算法体系与KMS集成全景 国密算法 (GM/T 系列) SM2 公钥密码 签名/密钥交换/加密 SM3 杂凑算法 256位摘要/HMAC SM4 对称密码 128位分组/32轮 SM9 标识密码 双线性对/KGC 阿里云KMS 集成能力 数字签名 & 证书 SM2证书/CSR 数据完整性校验 SM3摘要/SM3-HMAC 数据加密 & 传输 SM4-CBC/GCM 去证书化身份认证 IoT/设备标识 政务云 / 金融云 / 医疗 / 车联网 / 区块链 说明:实线 —— 主要依赖关系;虚线 —— KMS 封装层;所有算法均可在阿里云 KMS 中创建和管理密钥。

四种算法的核心参数对比

下面这张表能帮助你快速区分这四个算法。在我做技术选型时,常常把它贴在墙上做参考。

算法 类型 密钥/摘要长度 标准编号 典型场景
SM2 非对称公钥 公钥 64B / 私钥 32B GM/T 0003-2012 数字签名、密钥协商、证书签发
SM3 杂凑 (Hash) 输出 32B (256bit) GM/T 0004-2012 完整性校验、数字签名配合
SM4 对称分组 密钥 16B / 分组 16B GM/T 0002-2012 数据加密、VPN、数据库加密
SM9 标识密码 (IBC) 用户标识可变 GM/T 0044-2016 IoT、无证书场景、邮件加密

总结与选型建议

如果你刚接触国密,我建议先从 SM2 + SM4 的组合入手。这个组合在阿里云 KMS 里支持得最成熟。SM3 作为底层工具函数,几乎每个签名和加密流程里都会用到它,算是“万金油”。

SM9 嘛,听起来很酷,但实际落地时对 KGC 的安全要求极高,而且密钥恢复流程相对复杂。我个人觉得它更适合在控制成本且设备量极大的场景下用。

一句话记住:用 SM2 做身份和签名,用 SM4 加密数据,用 SM3 验完整性,SM9 留给特殊场景。在 KMS 里管理这些密钥,合规且省心。