【国密算法标准】国产(商用)密码算法之间的区别以及基本理解
一、为什么需要一套”自己的”密码算法体系?
密码算法是信息安全的基石。
长期以来,全球商用密码领域由美国主导的 RSA、DSA、AES、SHA 系列算法占据绝对主导地位。然而,随着国际形势的变化和自主可控需求的提升,中国自 1990 年代起逐步构建起一套完整的商用密码算法体系——国密算法(简称 GM/T 系列)。
国密算法由国家密码管理局(简称”国密局”)认定和发布,覆盖了对称加密、非对称加密、哈希摘要、数字签名、身份认证等多种密码学原语,形成了从底层算法到上层协议的完整技术栈。
以下将从算法原理、安全强度、性能特征、应用场景四个维度,系统梳理 SM1、SM2、SM3、SM4、SM7、SM9 及祖冲之(ZUC)算法之间的核心差异与用途区别。
二、国密算法总览与分类
在深入各算法之前,我们先建立一个宏观分类框架:
| 算法 | 类型 | 公开程度 | 核心用途 |
|---|---|---|---|
| SM1 | 对称加密 | 不公开(硬件实现) | 高安全等级加密 |
| SM2 | 非对称加密(椭圆曲线) | 公开 | 密钥交换、数字签名、公钥加密 |
| SM3 | 哈希/摘要 | 公开 | 数据完整性校验、数字签名 |
| SM4 | 对称加密(分组密码) | 公开 | 通用数据加密 |
| SM7 | 对称加密 | 不公开 | 特定行业加密 |
| SM9 | 标识密码(IBC) | 公开 | 基于身份的加密与签名 |
| ZUC | 流密码 | 公开 | 移动通信加密(4G/5G) |
可以看到,国密算法体系并非简单复制国际标准,而是根据实际应用场景进行了差异化设计,尤其在标识密码(SM9)和流密码(ZUC)方面体现了独特的技术路线。
三、SM1 算法:硬件专属的对称加密
3.1 算法概述
SM1 是一种对称分组密码算法,分组长度和密钥长度均为 128 位。其最大的特点是:算法细节不对外公开,仅以 IP 核或芯片形式提供,必须通过硬件实现。
这意味着你无法在软件中直接调用 SM1 算法——它被设计为一种”黑盒”加密方案,所有加解密操作都在安全芯片内部完成。
3.2 技术特征
- 分组长度:128 bit
- 密钥长度:128 bit
- 实现方式:仅支持硬件(芯片、加密卡、加密机)
- 轮数:未公开(推测与 SM4 类似的多轮迭代结构)
- 安全等级:与 SM4 相当,但由于硬件隔离,抗侧信道攻击能力更强
3.3 设计哲学
SM1 的设计思路源于”物理安全优于算法安全”的理念。在金融、政务等高安全场景中,密钥管理和算法保护往往比算法本身的数学强度更为关键。通过将算法固化在硬件中,可以有效防止算法被逆向分析、密钥被软件层面窃取。
3.4 典型应用场景
- 金融 IC 卡(银行卡芯片)
- 政务内网加密通信
- 高安全等级的加密机/加密卡
- 需要硬件级密钥保护的场景
3.5 与 SM4 的核心区别
SM1 与 SM4 同属对称加密,但 SM1 强调硬件绑定和物理安全,SM4 则强调软件兼容性和开放标准。在实际部署中,SM1 通常用于对安全等级要求极高的场景,而 SM4 用于通用数据加密。
四、SM2 算法:基于椭圆曲线的非对称加密
4.1 算法概述
SM2 是基于椭圆曲线密码学(ECC)的非对称加密算法,于 2010 年发布。它整合了数字签名、密钥交换和公钥加密三种功能,对标的是国际上的 ECDSA(签名)、ECDH(密钥交换)和 ECIES(加密)。
4.2 数学基础
SM2 定义在一条特定的 256 位素数域椭圆曲线上,曲线方程为:
1 | y² = x³ + ax + b (mod p) |
其中曲线参数 a、b、基点 G、阶 n 等均由国密局统一指定。安全强度基于椭圆曲线离散对数问题(ECDLP)的计算困难性。
4.3 三大功能模块
4.3.1 SM2 数字签名
签名过程:
- 计算消息的 SM3 哈希值
- 生成随机数 k,计算椭圆曲线点 (x₁, y₁) = kG
- 计算签名分量 r、s
- 输出签名 (r, s)
验证过程:
- 使用公钥和签名值恢复椭圆曲线点
- 验证 r 值是否匹配
4.3.2 SM2 密钥交换
SM2 密钥交换协议允许两方在不安全的信道上协商出一个共享密钥,过程类似 ECDH,但增加了身份认证步骤,防止中间人攻击。
4.3.3 SM2 公钥加密
使用接收方的公钥加密数据,只有持有对应私钥的接收方才能解密。加密过程中引入了随机数,确保同一明文每次加密结果不同(语义安全)。
4.4 性能特征
- 密钥长度:256 bit(等效于 RSA-3072 的安全强度)
- 签名速度:较快(ECC 的优势)
- 加密速度:较慢(相比对称加密)
- 密文膨胀:较大(密文比明文长约 96 字节以上)
4.5 典型应用场景
- 电子签名与电子证照
- SSL/TLS 证书(国密 SSL)
- 区块链数字签名(部分国产链)
- 政务系统身份认证
- 安全邮件(SMIME 国密版)
4.6 与 RSA 的对比
| 维度 | SM2 (ECC) | RSA |
|---|---|---|
| 密钥长度 | 256 bit | 2048+ bit |
| 签名速度 | 快 | 慢 |
| 验证速度 | 略慢 | 快 |
| 存储开销 | 小 | 大 |
| 数学基础 | 椭圆曲线离散对数 | 大整数分解 |
五、SM3 算法:256 位安全哈希
5.1 算法概述
SM3 是国密体系中的密码杂凑算法(Hash),输出 256 位摘要值。其设计思路借鉴了 SHA-256 的 Merkle-Damgård 结构,但在消息扩展和压缩函数上进行了显著改动,以抵御已知的碰撞攻击。
5.2 技术细节
- 输入:任意长度消息
- 输出:256 bit(32 字节)固定长度摘要
- 分组长度:512 bit
- 轮数:64 轮压缩
- 结构:Merkle-Damgård 迭代结构
5.3 与 SHA-256 的差异
虽然 SM3 和 SHA-256 输出长度相同,但内部结构有本质区别:
- 消息扩展:SM3 使用了两组不同的扩展消息 W 和 W’,而 SHA-256 只有一组
- 常量设计:SM3 使用了两组不同的常量 T₀ 和 T₁(前 16 轮和后 48 轮不同)
- 置换函数:SM3 引入了 P₀ 和 P₁ 两个置换函数,增强了扩散性
- 循环左移位数:与 SHA-256 完全不同
这些差异使得 SM3 并非 SHA-256 的简单翻版,而是具有独立安全性的哈希算法。
5.4 安全强度
- 抗碰撞性:2¹²⁸(生日攻击边界)
- 抗原像性:2²⁵⁶
- 抗第二原像性:2²⁵⁶
截至目前,SM3 未发现有效的密码分析攻击。
5.5 典型应用场景
- 数字签名的消息摘要(配合 SM2 使用)
- 文件完整性校验
- 消息认证码(HMAC-SM3)
- 密钥派生函数(KDF)
- 区块链交易哈希
- 口令存储与验证
六、SM4 算法:对标 AES 的分组密码
6.1 算法概述
SM4 是国密体系中最广泛使用的对称加密算法,于 2012 年正式发布为国家标准(GM/T 0002-2012),后成为 ISO/IEC 国际标准。其前身是用于无线局域网的 SMS4 算法。
6.2 技术规格
- 分组长度:128 bit(16 字节)
- 密钥长度:128 bit(16 字节)
- 轮数:32 轮
- 结构:广义 Feistel 网络(实际为 SPN 变体)
- S 盒:基于有限域 GF(2⁸) 上的非线性变换
6.3 加密流程
- 将 128 位明文分为 4 个 32 位字 (X₀, X₁, X₂, X₃)
- 进行 32 轮迭代变换,每轮使用一个轮密钥 rkᵢ
- 每轮变换:Xᵢ₊₄ = Xᵢ ⊕ T(Xᵢ₊₁ ⊕ Xᵢ₊₂ ⊕ Xᵢ₊₃ ⊕ rkᵢ)
- 最后进行反序变换输出密文
其中 T 变换由非线性变换 τ(S 盒替换)和线性变换 L 组成。
6.4 工作模式
SM4 作为分组密码,需要配合工作模式使用:
- ECB:电子密码本模式(不推荐,安全性低)
- CBC:密码块链接模式(常用)
- CFB:密文反馈模式
- OFB:输出反馈模式
- CTR:计数器模式(支持并行)
- GCM:伽罗瓦计数器模式(认证加密)
6.5 性能特征
- 软件实现效率高,适合各种平台
- 硬件实现面积小,适合嵌入式设备
- 32 轮迭代提供充足的安全余量
- 支持位切片等优化技术,在 x86/ARM 上可达 GB/s 级吞吐
6.6 典型应用场景
- 数据库字段加密
- 文件加密
- VPN/隧道加密
- 移动支付通信加密
- 物联网设备数据加密
- 云存储加密
6.7 与 AES-128 的对比
| 维度 | SM4 | AES-128 |
|---|---|---|
| 分组长度 | 128 bit | 128 bit |
| 密钥长度 | 128 bit | 128 bit |
| 轮数 | 32 轮 | 10 轮 |
| 结构 | 类 Feistel | SPN |
| 安全强度 | 相当 | 相当 |
| 标准化 | 国标 + ISO | 全球广泛采用 |
七、SM7 算法:面向特定行业的对称加密
7.1 算法概述
SM7 是一种对称加密算法,与 SM1 类似,其算法细节不对外公开。它主要面向特定行业应用,尤其在以下领域有明确定位:
- 智能电表/水表/气表等公用事业
- 门禁系统与智能卡
- 特定行业的数据保护
7.2 技术特征
- 类型:对称分组密码
- 公开程度:不公开
- 实现方式:主要通过芯片/硬件模块实现
- 安全等级:满足行业特定安全需求
7.3 与 SM1 的区别
虽然 SM1 和 SM7 都是不公开的对称加密算法,但它们面向的应用领域不同:
- SM1 更偏向金融、政务等高安全通用场景
- SM7 更偏向物联网终端、智能卡等资源受限场景
SM7 的设计可能在计算复杂度和资源消耗上做了更多优化,以适应低功耗设备。
7.4 典型应用场景
- 智能电表数据加密
- 门禁卡认证
- 工业控制系统通信保护
- 特定行业的密钥管理
八、SM9 算法:基于标识的密码体系
8.1 算法概述
SM9 是国密体系中最具创新性的算法之一,它基于标识密码(Identity-Based Cryptography, IBC)理论,于 2016 年发布。SM9 的最大特点是:用户的公钥就是其身份标识(如邮箱、手机号、身份证号),无需传统的数字证书和 PKI 基础设施。
SM9 于 2018 年成为 ISO/IEC 国际标准(ISO/IEC 14888-3),是中国首个成为国际标准的标识密码算法。
8.2 数学基础
SM9 基于椭圆曲线上的双线性对(Bilinear Pairing)运算,具体使用 BN 曲线(Barreto-Naehrig 曲线)。双线性对是一种特殊的数学映射:
1 | e: G₁ × G₂ → Gₜ |
满足双线性性质:e(aP, bQ) = e(P, Q)^(ab)
8.3 四大功能
8.3.1 SM9 数字签名
- 签名者使用私钥(由 KGC 根据身份标识生成)对消息签名
- 验证者使用签名者的身份标识和系统公钥验证签名
- 无需证书,验证过程直接绑定身份
8.3.2 SM9 公钥加密
- 加密方使用接收方的身份标识作为公钥加密数据
- 接收方使用 KGC 分配的私钥解密
- 无需事先获取对方证书
8.3.3 SM9 密钥交换
- 双方基于各自身份标识协商共享密钥
- 具有前向安全性
- 无需证书认证
8.3.4 SM9 密钥封装
- 用于安全传输对称密钥
- 基于身份标识进行密钥封装和解封装
8.4 与 SM2 的核心区别
| 维度 | SM2 | SM9 |
|---|---|---|
| 公钥形式 | 椭圆曲线点(64+字节) | 身份标识(字符串) |
| 证书需求 | 需要 PKI 证书 | 无需证书 |
| 密钥管理 | 用户自行管理密钥对 | KGC 统一生成私钥 |
| 数学基础 | ECDLP | 双线性对 |
| 适用场景 | 通用非对称加密 | 大规模身份认证 |
| 部署复杂度 | 需要 CA 体系 | 需要 KGC |
8.5 典型应用场景
- 大规模物联网设备认证(海量设备无需管理证书)
- 电子邮件加密(用邮箱地址直接加密)
- 视频会议/即时通讯端到端加密
- 政务系统跨域身份认证
- 车联网设备身份管理
8.6 SM9 的优势与挑战
优势:
- 消除了证书管理的复杂性
- 天然适合大规模部署
- 公钥即身份,简化了密钥分发
挑战:
- 依赖可信的密钥生成中心(KGC),存在密钥托管问题
- 双线性对运算开销较大
- 生态支持不如 SM2 成熟
九、祖冲之(ZUC)算法:面向移动通信的流密码
9.1 算法概述
ZUC(祖冲之算法)是国密体系中唯一的流密码算法,于 2011 年被 3GPP 采纳为 4G LTE 的国际加密标准(128-EEA3 和 128-EIA3),这是中国密码算法首次成为国际通信标准。
9.2 技术架构
ZUC 算法由三个核心组件构成:
9.2.1 线性反馈移位寄存器(LFSR)
- 16 个 31 位的寄存器
- 提供长周期的伪随机序列
- 采用模 2³¹-1 运算
9.2.2 比特重组(BR)
- 从 LFSR 中提取数据
- 进行比特级别的重排
- 输出 128 位数据给非线性函数
9.2.3 非线性函数 F
- 包含 4 个 S 盒(与 AES S 盒不同)
- 进行非线性混淆运算
- 输出 32 位密钥流字
9.3 工作流程
- 初始化:加载 128 位密钥和 128 位初始向量(IV)
- 预热:运行若干轮但不输出密钥流
- 工作阶段:每轮输出 32 位密钥流字
- 加密:明文与密钥流逐比特异或
9.4 技术规格
- 密钥长度:128 bit
- IV 长度:128 bit(在 LTE 中为 32 bit)
- 输出:32 bit/轮的密钥流
- 安全强度:128 位
9.5 与分组密码的区别
流密码与分组密码的根本区别在于:
- 分组密码(如 SM4):将数据分成固定长度的块,逐块加密
- 流密码(如 ZUC):生成连续的密钥流,与明文逐比特异或
流密码的优势:
- 无需填充(适合变长数据)
- 硬件实现简单高效
- 延迟低(逐比特处理)
- 适合实时通信场景
9.6 在 4G/5G 中的应用
在 3GPP 标准中,ZUC 被用于:
- 128-EEA3:用户面数据加密(保护通话内容、上网数据)
- 128-EIA3:控制面完整性保护(防止信令篡改)
这意味着全球数十亿 4G 手机在使用 ZUC 算法保护通信安全。
9.7 典型应用场景
- 4G/5G 移动通信加密
- 卫星通信加密
- 无线传感器网络
- 实时音视频加密
- 低延迟要求的加密场景
十、横向对比:七大算法的核心差异
10.1 按密码类型分类
对称加密(共享密钥)
- SM1、SM4、SM7
- 加解密使用同一密钥
- 速度快,适合大数据量加密
- 密钥分发是主要挑战
非对称加密(公钥密码)
- SM2、SM9
- 使用公钥/私钥对
- 速度慢,适合密钥交换和签名
- SM2 需要证书,SM9 不需要
哈希算法
- SM3
- 单向不可逆
- 用于完整性校验和签名
流密码
- ZUC
- 生成密钥流逐比特加密
- 适合实时通信
10.2 安全强度对比
| 算法 | 安全强度 | 等效 RSA 强度 |
|---|---|---|
| SM1 | 128 bit | ~3072 bit |
| SM2 | 128 bit | ~3072 bit |
| SM3 | 128 bit(抗碰撞) | — |
| SM4 | 128 bit | ~3072 bit |
| SM7 | 未公开 | 未公开 |
| SM9 | 128 bit | ~3072 bit |
| ZUC | 128 bit | ~3072 bit |
所有国密算法的安全强度均达到 128 位,这是当前商用密码的推荐安全等级。
10.3 性能特征对比
| 算法 | 加密速度 | 实现复杂度 | 适用平台 |
|---|---|---|---|
| SM1 | 快(硬件) | 高(仅硬件) | 加密芯片 |
| SM2 | 慢 | 中 | 通用 |
| SM3 | 快 | 低 | 通用 |
| SM4 | 快 | 低 | 通用 |
| SM7 | 快(硬件) | 高(仅硬件) | 特定芯片 |
| SM9 | 很慢 | 高 | 服务器端 |
| ZUC | 极快 | 低 | 通用/硬件 |
十一、场景选型指南:如何选择合适的国密算法
11.1 数据存储加密
推荐:SM4(CBC/GCM 模式)
理由:数据量大,需要高效的对称加密;SM4 软件实现成熟,支持各种工作模式。
11.2 数字签名与身份认证
推荐:SM2(传统 PKI 场景)或 SM9(大规模无证书场景)
理由:SM2 适合已有 CA 体系的场景;SM9 适合设备数量巨大、证书管理困难的物联网场景。
11.3 通信链路加密
推荐:ZUC(移动通信)或 SM4-GCM(通用网络通信)
理由:ZUC 在 4G/5G 中有原生支持;SM4-GCM 提供认证加密,适合 IP
十二、相关代码应用参考
一、JavaScript 版本
推荐使用 sm-crypto-v2,基于 noble-curves 重构,性能优异,支持 ESM/CJS 双格式。
安装:
1 | npm install --save sm-crypto-v2 |
SM2 签名验签:
1 | import { sm2 } from 'sm-crypto-v2' |
SM4 加解密(CBC 模式):
1 | import { sm4 } from 'sm-crypto-v2' |
SM4 GCM 模式(认证加密):
1 | import { sm4 } from 'sm-crypto-v2' |
二、Python 版本
推荐使用 easy-gmssl(基于北京大学 GmSSL 团队优化),安装时自动编译底层 C 库,接口友好。
安装:
1 | pip install easy-gmssl |
SM2 签名验签:
1 | from easy_gmssl import EasySM2SignKey, EasySM2VerifyKey, SignatureMode |
SM4 加解密(CBC 模式):
1 | from easy_gmssl import EasySm4CBC |
SM4 GCM 模式(认证加密):
1 | from easy_gmssl import EasySm4GCM |
三、Golang 版本
推荐使用 github.com/tjfoc/gmsm,API 清晰,社区使用广泛,遵循 GM/T 系列标准。
安装:
1 | go get github.com/tjfoc/gmsm |
SM2 签名验签:
1 | package main |
SM4 加解密(ECB 模式):
1 | package main |
SM3 哈希计算(常配合 SM2 签名使用):
1 | package main |
四、工程化避坑要点
| 要点 | 说明 |
|---|---|
| SM2 密文格式 | 存在 C1C3C2(新标准)和 C1C2C3(旧标准)两种排列顺序,跨系统对接时必须统一约定 |
| SM2 签名 userId | 国标默认 userId 为 "1234567812345678",签名和验签双方必须使用相同的 userId |
| SM4 工作模式 | 生产环境推荐使用 CBC 或 GCM 模式,ECB 模式因相同明文块产生相同密文,存在数据模式泄露风险 |
| 密钥管理 | 私钥切勿硬编码,生产环境应使用 KMS、HSM 或安全文件系统存储 |
| 跨语言互通 | 不同语言的库对密钥/密文的编码格式(hex/base64/DER)可能不同,联调时需明确约定 |
以上代码均可直接复制运行,如需进一步了解 SM9(标识密码)或 ZUC(流密码)的集成示例,供参考。
【国密算法标准】国产(商用)密码算法之间的区别以及基本理解



