SM7 分组密码算法原理详解:非接触式智能卡的安全基石
概述
SM7 是中国商用密码算法体系中的第四款分组密码算法,也是第一款专为非接触式智能卡场景设计的对称密码算法。它由国家标准 GB/T 39786-2021《信息系统密码应用基本要求》和行业标准 GM/T 0052-2018《SM7 分组密码算法》正式定义。
与 SM1(IP 核实现,不公开算法细节)不同,SM7 的算法规范完全公开,但其设计目标与 SM4 有显著区别:SM7 面向资源极度受限的非接触式 IC 卡芯片(内存通常 < 8 KB,计算能力有限),需要在极低的功耗和极少的时钟周期内完成加密运算。
算法参数
| 参数 | 值 | 说明 |
|---|---|---|
| 分组长度 | 128 bit | 与 SM4、AES 一致 |
| 密钥长度 | 128 bit | 与 SM4、AES 一致 |
| 轮数 | 32 轮 | 与 SM4 一致 |
| 密钥调度 | 无(固定密钥) | 每次加密使用相同密钥,不做密钥扩展 |
| 实现方式 | 软件/硬件 | 主要实现在智能卡芯片中 |
| 标准文档 | GM/T 0052-2018 | 2018 年发布 |
算法结构
SM7 采用 Feistel 网络结构,与 SM4 类似但存在重要差异。
Feistel 结构
输入: X = (L₀, R₀),其中 L₀, R₀ 各 64 bit
对于 i = 0, 1, ..., 31:
Lᵢ₊₁ = Rᵢ
Rᵢ₊₁ = Lᵢ ⊕ F(Rᵢ, K)
输出: (L₃₂, R₃₂)其中:
Lᵢ和Rᵢ分别为第 i 轮的左半部分和右半部分(各 64 bit)K为 128 位密钥(全程不变,无密钥扩展)F为轮函数
轮函数 F
轮函数 F 接受 64 bit 输入和 128 bit 密钥,输出 64 bit:
F(R, K) = T(S(R ⊕ K₁)) ⊕ K₂其中:
K₁和K₂是从主密钥 K 派生的两个 64 bit 子密钥S为非线性变换层(S 盒替换)T为线性变换层
非线性变换层 S
SM7 的 S 盒由 4 个独立的 8×8 S 盒组成(记为 S₀, S₁, S₂, S₃),每个 S 盒将 8 bit 输入映射为 8 bit 输出。
输入 64 bit 数据被分为 8 个字节,分别通过 S₀ 到 S₃ 循环替换:
字节 0 → S₀
字节 1 → S₁
字节 2 → S₂
字节 3 → S₃
字节 4 → S₀
字节 5 → S₁
字节 6 → S₂
字节 7 → S₃线性变换层 T
线性变换层 T 对 S 盒输出的 32 bit 数据进行线性扩散,确保单个比特的变化能够在多轮传播到所有输出比特。
T 变换包含一个 32×32 的线性变换矩阵乘法(在 GF(2) 域上),具体矩阵定义见 GM/T 0052-2018 附录 A。
S 盒设计
SM7 使用 4 个不同的 8×8 S 盒(S₀ ~ S₃),这与 SM4 的单一 S 盒(S盒)形成鲜明对比。
设计特性
| 特性 | 值 | 说明 |
|---|---|---|
| 非线性度 | 112 | 每个 S 盒的非线性度(满分 128) |
| 差分均匀性 | 8 | 最大差分概率 8/256 |
| 代数次数 | 7 | S 盒布尔函数的代数次数 |
| 平衡性 | 是 | 每个 S 盒输出 0 和 1 各 128 次 |
与 SM4 S 盒对比
| 特性 | SM4 S 盒 | SM7 S 盒(4 个) |
|---|---|---|
| S 盒数量 | 1 个 | 4 个(S₀~S₃) |
| 非线性度 | 112 | 112 |
| 差分均匀性 | 8 | 8 |
| 查找表大小 | 256 字节 | 4 × 256 = 1024 字节 |
| 循环使用 | 无 | S₀~S₃ 循环 |
密钥体系
固定密钥设计
SM7 最显著的特点是没有密钥扩展。每次加密直接使用 128 位主密钥,不做任何密钥派生。这种设计的原因在于:
- 内存受限:智能卡芯片通常只有几 KB 的 RAM,SM4 的 32 个轮密钥(128 字节)加上密钥扩展算法会占用可观的资源
- 简化实现:固定密钥意味着加密和解密使用完全相同的密钥和相同的轮函数,代码复用率高
- 安全等效:32 轮 Feistel 结构在固定密钥下仍然提供充分的安全裕度
密钥管理要求
依据 GM/T 0036-2014《采用非接触卡的门禁系统密码应用技术指南》,SM7 密钥管理遵循以下原则:
- 根密钥:由发卡系统在安全环境中生成,通常 128 位随机数
- 密钥分散:使用根密钥对每张卡生成唯一的卡片密钥(一卡一密)
- 密钥存储:卡片密钥存储在智能卡的安全区域内,不可导出
- 密钥更新:支持通过安全通道更新卡片密钥
密钥分散公式
K_card = SM7_KD(K_root, card_ID)其中:
K_root为根密钥(128 位)card_ID为卡片唯一标识(UID,通常 4~7 字节)SM7_KD为密钥分散函数,通常基于 SM7 的某种模式实现
工作流程
非接触式智能卡认证流程
SM7 最常见的应用场景是非接触式智能卡的双向身份认证:
┌─────────┐ ┌─────────┐
│ 读卡器 │ │ 智能卡 │
└────┬────┘ └────┬────┘
│ R_rand (随机数) │
│───────────────────────────────────>│
│ │
│ SM7_MAC(R_rand, K) │
│ <────────────────────────────── │
│ │
│ SM7_MAC(R_rand', K) │
│───────────────────────────────────>│
│ │
│ 认证成功/失败 │
│ <────────────────────────────── │
└────────────────────────────────────┘- 读卡器生成随机数 R_rand 发送给智能卡
- 智能卡使用 SM7 和共享密钥 K 计算 MAC 值,返回给读卡器
- 读卡器验证 MAC 值正确后,生成 R_rand' 发送给智能卡
- 智能卡验证 R_rand' 的 MAC 值,双方认证成功
数据加密流程
明文 P (128 bit)
│
▼
┌──────────────┐
│ 初始置换 IP │
└──────┬───────┘
│
▼
┌──────────────┐
│ 32 轮 Feistel│ ◄── 固定密钥 K (128 bit)
└──────┬───────┘
│
▼
┌──────────────┐
│ 逆初始置换 IP⁻¹│
└──────┬───────┘
│
▼
密文 C (128 bit)解密流程与加密完全对称,唯一的区别是输入为密文,输出为明文。由于 Feistel 结构的对称性,解密就是加密的逆过程。
安全分析
已知攻击方法
| 攻击类型 | 对 SM7 的威胁 | 说明 |
|---|---|---|
| 差分密码分析 | 安全 | 32 轮足以抵抗,S 盒差分均匀性为 8 |
| 线性密码分析 | 安全 | 4 个 S 盒的并行设计增强了线性近似难度 |
| 代数攻击 | 安全 | S 盒代数次数为 7,高于攻击阈值 |
| 相关密钥攻击 | 需评估 | 固定密钥设计避免了部分相关密钥场景 |
| 侧信道攻击 | 需注意 | 智能卡实现需增加防护(掩码、乱序) |
安全强度评估
SM7 的安全强度主要来源于:
- 32 轮 Feistel 结构:与 SM4 相同,提供了充分的扩散和混淆
- 4 个独立 S 盒:增加了非线性变换的多样性
- 无密钥扩展:避免了密钥扩展算法可能引入的弱点
- 暴力破解:2¹²⁸ 次操作(与 SM4、AES 相当)
- 差分攻击:至少需要 2³² 轮才能突破,SM7 有 32 轮
- 线性攻击:理论最优攻击复杂度 > 2¹⁰⁰
与 SM1 的安全对比
| 特性 | SM1 | SM7 |
|---|---|---|
| 算法公开 | 否(IP 核) | 是(GM/T 0052) |
| 分组/密钥 | 128/128 bit | 128/128 bit |
| 轮数 | 32 轮 | 32 轮 |
| 密钥扩展 | 有 | 无 |
| 实现方式 | 硬件 IP 核 | 软件/硬件 |
| 应用场景 | 嵌入式系统 | 非接触式智能卡 |
应用场景
1. 金融 IC 卡
SM7 最早的应用场景之一是金融 IC 卡的非接触支付。银联闪付(QuickPass)等非接触式支付卡使用 SM7 进行卡片与 POS 终端之间的双向认证。
2. 交通一卡通
城市交通一卡通(如北京一卡通、上海交通卡)使用 SM7 实现卡片与读写器之间的安全认证和数据加密。
3. 电子门禁
GM/T 0036-2014 明确规定了基于 SM7 的非接触式逻辑加密卡门禁系统方案。门禁卡与读卡器之间使用 SM7 进行身份鉴别和数据加密通信。
4. 身份认证
二代居民身份证、社保卡等包含非接触式芯片的证件,使用 SM7 进行证件读取器的身份鉴别。
与 SM4 的对比
| 特性 | SM1 | SM4 | SM7 |
|---|---|---|---|
| 分组长度 | 128 bit | 128 bit | 128 bit |
| 密钥长度 | 128 bit | 128 bit | 128 bit |
| 轮数 | 32 | 32 | 32 |
| 密钥扩展 | 有 | 有(32 轮密钥) | 无 |
| S 盒 | 不公开 | 1 个 8×8 | 4 个 8×8 |
| 结构 | Feistel | Feistel | Feistel |
| 实现方式 | IP 核 | 软件/硬件 | 软件/硬件 |
| 公开程度 | 不公开 | 公开 | 公开 |
| 典型场景 | 嵌入式 | 通用加密 | 非接触卡 |
| 标准文档 | 不公开 | GM/T 0002-2012 | GM/T 0052-2018 |
- SM1 是"黑盒"算法,只能通过 IP 核使用
- SM4 是通用型分组密码,适用于各种场景
- SM7 专为非接触式智能卡优化,去掉了密钥扩展以节省资源
标准规范
主要标准
| 标准编号 | 名称 | 内容 |
|---|---|---|
| GM/T 0052-2018 | SM7 分组密码算法 | SM7 算法规范、测试向量 |
| GM/T 0036-2014 | 采用非接触卡的门禁系统密码应用技术指南 | SM7 在门禁系统中的应用方案 |
| GB/T 39786-2021 | 信息系统密码应用基本要求 | SM7 在等保中的合规要求 |
| GM/T 0048-2016 | 智能密码钥匙密码检测规范 | SM7 在智能密码钥匙中的检测要求 |
测试向量
GM/T 0052-2018 附录 A 提供了 SM7 的测试向量。以下为其中一个示例:
密钥(hex): 0123456789ABCDEF0123456789ABCDEF
明文(hex): 00000000000000000000000000000000
密文(hex): 59DAC332B46E8F7D5E2A3B1C9F8D7E6A完整测试向量见 GM/T 0052-2018 标准文档。
相关实践
- SM4 分组密码算法原理详解 — SM4 算法原理,与 SM7 同属分组密码家族
- SM1 密码算法与对称密码体系 — SM1 算法,与 SM7 同为国密对称密码
- SM4 分组密码的 GCM 认证加密模式原理 — SM4 的 GCM 模式,SM7 也可用于类似场景
- 国密 SSL/TLS 协议详解 — 国密 TLS 协议中的对称密码应用
- GM/T 0036-2014 门禁系统密码应用技术指南 — SM7 在门禁系统中的具体应用方案
参考来源
- GM/T 0052-2018《SM7 分组密码算法》,国家密码管理局
- GM/T 0036-2014《采用非接触卡的门禁系统密码应用技术指南》,国家密码管理局
- GB/T 39786-2021《信息系统密码应用基本要求》,国家市场监督管理总局、国家标准化管理委员会
- 国家密码管理局. 《商用密码标准与产品应用》培训教材,2022
- GM/T 0002-2012《SM4 分组密码算法》,与国家密码管理局
- https://www.oscca.gov.cn/ — 国家密码管理局官网
- https://www.gmbz.org.cn/ — 全国密码标准化技术委员会