SM9 加密算法原理:从 GM/T 0044.4 到身份基加密的工程实践
概述
SM9 加密算法(Identity-Based Encryption, IBE)是我国自主设计的身份基加密标准,定义于 GM/T 0044-2016《SM9 标识密码算法》。该标准包含曲线参数、签名算法、密钥交换协议和加密算法四个部分,共同构成完整的 SM9 标识密码体系。
身份基加密的核心思想源于 Shamir 1984 年提出的概念:用户的公钥可以直接由其身份标识(如邮箱地址、手机号)派生,从而彻底消除传统 PKI 的证书管理开销。2001 年,Boneh 和 Franklin 利用双线性对构造了首个可证明安全的 IBE 方案(BF-IBE),使这一设想成为现实。
本文要点
- 系统梳理从传统 PKI 到 IBE 的信任框架演进
- 完整推导 SM9 加密/解密的数学公式与实现流程
- 分析 BDH(Bilinear Diffie-Hellman)假设下的安全性证明
- 对比 SM9 与 BF-IBE、BLS 方案的异同
- 给出工程实现中的关键要点与合规建议
从传统 PKI 到 IBE 的信任框架演进
传统 X.509 PKI 的三个核心困境
传统公钥基础设施(PKI)依赖数字证书实现公钥可信分发,但面临三个结构性难题:
| 问题 | 具体表现 | 影响量级 |
|---|---|---|
| 证书存储开销 | 单张证书 700B-2KB,证书链可达 6-10KB | 资源受限设备(IoT、RFID)难以承受 |
| 分发带宽消耗 | TLS 握手期间传输整个证书链 | 移动端网络环境下显著增加延迟 |
| 吊销状态维护 | CRL 定期发布、OCSP 在线查询 | 网络中断时信任链断裂 |
IBE 的信任模型变革
IBE 的核心创新在于:公钥可由身份标识直接计算,无需证书。其数学原理如下:
公钥 P_id = H1(ID || hid, N) · P1
私钥 d_id = s · P_id其中:
H1为哈希到椭圆曲线群 G1 的函数P1为生成元s为 KGC(密钥生成中心)的主密钥N为曲线阶
s,可为任意用户派生私钥。用户公钥由身份标识直接计算,消除了证书分发需求。密钥托管困境
IBE 的优势伴随一个核心风险:KGC 持有所有用户的完整私钥。这导致:
- 隐私风险:KGC 可解密任意用户通信
- 信任集中:单一故障点影响全局安全
- 法律风险:KGC 可能被强制披露密钥
SM9 加密算法的数学原理
基础参数与曲线定义
SM9 加密算法基于配对友好椭圆曲线,定义在有限域 F_p 上。根据 GM/T 0044-2016,SM9 使用两条素数域上的椭圆曲线:
主曲线 E/F_p:
y² = x³ + ax + b (mod p)其中:
p = 0xB640000002A3A6F1D603AB4FF58EC74521F2934B1A7AEEDBE56F9B27E351457D(64 字节素数)a = 0x4eb = 0x01
群结构与双线性对
定义两个素数阶循环群:
G1 =:E(F_p) 上的点群G2 =:E'(F_p) 上的点群
N(64 字节素数)。双线性对 e: G1 × G2 → GT 满足:
1. 双线性:e([a]P, [b]Q) = e(P, Q)^[ab]
2. 非退化:e(P, Q) ≠ 1_Gt
3. 可计算:存在有效算法计算 e(P, Q)SM9 使用 Weil 配对或 Tate 配对实现,具体实现方式取决于底层密码库。
哈希函数 H1 与 H2
SM9 定义两个哈希函数:
H1: {0,1}* × {0,1}^8 → G1
H1(ID || hid, N) → 随机点 P_id ∈ G1其中 hid 为标识符类型后缀:
hid = 0x01:签名私钥标识hid = 0x02:加密私钥标识hid = 0x03:密钥交换私钥标识
def hash_to_point(msg, hid):
"""将消息哈希到椭圆曲线点"""
counter = 0
while True:
# 计算候选 x 坐标
x_bytes = H2(msg + hid + counter.to_bytes(4, 'big'))
x = int.from_bytes(x_bytes, 'big') % p
# 计算 y² = x³ + ax + b
y_sq = (pow(x, 3, p) + a*x + b) % p
# 求解二次剩余
y = sqrt_mod(y_sq, p)
if y is not None:
# 点在曲线上,返回 [random]Point
return point_multiply(base_point, random_scalar)
counter += 1
if counter > 1000:
raise ValueError("Failed to hash to point")H2: G1 → {0,1}^n
H2(R) → n 位比特串KGC 主密钥生成
步骤 1: KGC 随机选择主密钥 s ∈ [1, N-1]
步骤 2: 计算主公钥 Ppub = [s]P2 ∈ G2
步骤 3: 发布系统参数 {p, a, b, G1, G2, GT, e, P1, P2, Ppub, H1, H2}用户私钥派生
当用户 ID 申请私钥时:
步骤 1: KGC 计算临时点 R_id = H1(ID || hid_enc, N) ∈ G1
其中 hid_enc = 0x02(加密私钥后缀)
步骤 2: 私钥 d_id = [s]R_id ∈ G1用户私钥长度为 32 字节(G1 点坐标的二进制编码)。
加密与解密流程
加密过程(Encrypt)
输入:
- 接收者身份标识 ID_R
- 明文 M(长度 ≤ n 位)
- 系统参数
- 密文 C = (C1, C2, C3)
步骤 1: 随机选择 k ∈ [1, N-1]
步骤 2: 计算 S = [k]Ppub = [k]sP2 ∈ G2
步骤 3: 计算 R = H1(ID_R || hid_enc, N) ∈ G1
步骤 4: 计算 e1 = e(S, R) = e([k]P2, R) ∈ GT
步骤 5: 计算 V = H2(e1) → n 位比特串
步骤 6: 计算 C2 = M ⊕ V(明文加密)
步骤 7: 计算 C1 = [k]P1 ∈ G1
步骤 8: 计算 C3 = H2(C1 || M) → 校验值最终密文:
C = (C1, C2, C3)数据流示意图:
明文 M ──────────────────→ XOR ←── H2(e([k]Ppub, H1(ID_R)))
↑
e([k]Ppub, R)
↑
[k]Ppub = [ks]P2
↑
随机 k解密过程(Decrypt)
输入:
- 密文 C = (C1, C2, C3)
- 接收者私钥 d_id_R
- 明文 M 或错误
步骤 1: 验证 C1 ∈ G1(曲线点检查)
步骤 2: 计算 e2 = e(C1, d_id_R) = e([k]P1, [s]R) ∈ GT
步骤 3: 利用双线性性质:
e([k]P1, [s]R) = e(P1, R)^[ks] = e([k]P2, [s]R) = e([k]P2, R)^s
又 e1 = e([k]P2, R)
故 e2 = e1^s
步骤 4: 计算 V = H2(e2)
步骤 5: 计算 M' = C2 ⊕ V
步骤 6: 验证 C3 == H2(C1 || M')
步骤 7: 若验证通过,输出 M';否则输出 ERROR关键数学等价性:
e(C1, d_id_R) = e([k]P1, [s]H1(ID_R))
= e(P1, H1(ID_R))^[ks]
= e([k]P2, H1(ID_R))^s
= e([k]P2, R)^s
= e1^s完整性校验
密文包含 C3 作为完整性校验值,防止密文被篡改:
C3 = H2(C1 || M)验证时先解密得到 M',再计算 H2(C1 || M') 与 C3 对比。任何密文修改都会导致校验失败。
安全性分析
BDH 假设(Bilinear Diffie-Hellman)
SM9 加密的安全性基于 BDH 假设:给定 (P, [a]P, [b]P, [c]P),计算 e(P, P)^[abc] 在计算上是不可行的。
形式化定义:
BDH 假设:对任意多项式时间敌手 A,有
Pr[A(P, [a]P, [b]P, [c]P) = e(P,P)^[abc]] ≤ ε(n)
其中 ε(n) 为可忽略函数安全性证明思路
BF-IBE 方案在随机预言机模型下被证明为 IND-ID-CCA2 安全(身份选取下的强选择明文攻击安全)。SM9 继承这一证明框架:
定理:若 BDH 假设成立,则 SM9 加密方案在随机预言机模型下是 IND-ID-CCA2 安全的。
证明思路:
1. 将敌手挑战密文与 BDH 实例关联
2. 若敌手可区分挑战密文,则可解 BDH 问题
3. 与 BDH 假设矛盾,故方案安全已知攻击与防御
| 攻击类型 | 威胁级别 | 防御措施 |
|---|---|---|
| 密钥提取攻击 | 高 | KGC 主密钥必须硬件保护(HSM) |
| 选择性开放攻击 | 中 | 限制私钥派生次数,引入权限控制 |
| 配对碰撞攻击 | 低 | 使用安全的配对实现(防缓存定时攻击) |
| 小群攻击 | 低 | 确保曲线参数满足安全边界 |
与相关方案的对比
SM9 vs BF-IBE
| 维度 | SM9 | BF-IBE |
|---|---|---|
| 标准化状态 | GM/T 0044-2016 国家标准 | 学术论文(2001) |
| 曲线要求 | MNT 曲线 / 超奇异曲线 | 配对友好曲线 |
| 哈希函数 | 自定义 H1, H2 | 随机预言机 |
| 安全性证明 | IND-ID-CCA2 | IND-ID-CCA2 |
| 工程实现 | 已有 gmssl, Tongsuo 支持 | 需自行实现 |
| 标识格式 | 支持任意字节串 | 通常限定为字符串 |
SM9 vs BLS 签名方案
虽然 BLS 和 SM9 都基于双线性对,但设计目标不同:
| 特性 | SM9 加密 | BLS 签名 |
|---|---|---|
| 核心操作 | 身份 → 私钥派生 | 身份 → 签名聚合 |
| 私钥来源 | KGC 派生 | 用户自持 |
| 配对使用 | 加密时计算 e(S, R) | 验签时验证 e(sig, P) |
| 应用场景 | 身份基加密通信 | 批量签名聚合 |
SM9 vs CL-PKC(无证书密码)
| 维度 | SM9 (IBE) | CL-PKC |
|---|---|---|
| 私钥来源 | KGC 派生 | KGC 部分私钥 + 用户秘密值 |
| 密钥托管 | 存在(KGC 掌握完整私钥) | 消除(KGC 无法单独解密) |
| 性能 | 较快(单次配对) | 稍慢(两次配对运算) |
| 适用场景 | 企业内部通信 | 开放网络环境 |
工程实现要点
密钥管理要求
KGC 主密钥保护:
- 必须存储在 FIPS 140-2 Level 3 或 GM/T 0028 二级以上 HSM 中
- 密钥分片(Shamir 秘密共享)防止单点故障
- 建议采用双 KGC 架构,主密钥分片后分散管理
- 私钥传输需通过安全通道(如 TLS)
- 本地存储应使用 HSM 或安全 enclave
- 私钥生命周期管理与传统 PKI 一致
性能特征
| 操作 | 时间(参考值) | 说明 |
|---|---|---|
| 私钥派生 | 0.5-2 ms | 取决于 HSM 性能 |
| 加密(256 位) | 1-5 ms | 单次配对 + 哈希 |
| 解密 | 1-5 ms | 单次配对 + 哈希 |
| 配对运算 | 0.5-2 ms | 核心瓶颈操作 |
常见实现陷阱
陷阱 1:配对计算溢出
# ❌ 错误:未检查配对结果是否在 GT 中
result = pairing(C1, d_id)
# ✅ 正确:验证配对结果
result = pairing(C1, d_id)
assert result in GT # 群成员验证陷阱 2:H1 哈希失败死循环
# ❌ 错误:未设置迭代上限
while True:
point = hash_to_point(msg)
# ✅ 正确:设置最大尝试次数
for i in range(1000):
point = try_hash_to_point(msg, i)
if point is not None:
break
else:
raise ValueError("Failed to hash to point")陷阱 3:密文格式混淆
SM9 密文采用 (C1, C2, C3) 三元组格式,不同实现可能有不同编码方式(DER、序列化、Base64)。跨系统互操作时必须统一编码规范。
合规实施建议
密评要求对照
根据 GM/T 0054-2018《信息系统密码应用基本要求》,SM9 加密应用的合规检查点:
| 要求级别 | 密码技术 | 检查项 |
|---|---|---|
| 第三级 | SM9 加密 | 使用经检测认证的 SM9 产品 |
| 第三级 | SM3 哈希 | C3 完整性校验使用 SM3 |
| 第三级 | 密钥管理 | KGC 主密钥 HSM 保护 |
| 第四级 | 密钥恢复 | 主密钥分片恢复机制 |
适用场景建议
适合使用 SM9 的场景:
- 企业内部加密通信(KGC 可控环境)
- 物联网设备身份绑定(消除证书管理)
- 移动应用安全通道建立
- 数据加密存储(身份即密钥)
- 开放互联网环境(密钥托管风险)
- 多方协作且互不信任(需无证书方案)
- 长期历史数据加密(KGC 解散后无法恢复)
与国密 TLS 协议结合
GM/T 0128-2023《数据报传输层密码协议》(DTLCP)支持 SM9 密钥协商,适用于 UDP 环境下的身份基安全通信。典型部署架构:
客户端 ←→ 服务端
↓ ↓
SM9私钥 SM9私钥
↓ ↓
DTLCP握手 DTLCP握手
↓ ↓
共享密钥 共享密钥相关实践链接
- SM9 标识密码算法原理详解 — SM9 体系概述,含曲线参数与签名算法
- SM9 密钥交换协议深度解析 — SM9 密钥交换实现细节
- 国密 DTCP 数据报传输协议 — SM9 在 UDP 环境的部署
- GM/T 0018-2023 密码设备接口 — SM9 设备集成 API
- S/MIME v4.0 邮件加密 — SM9 在邮件系统的实际应用
总结
SM9 加密算法作为国密标准体系的重要组成部分,为身份基加密提供了标准化的工程实现。其核心价值在于消除证书管理开销,适用于 KGC 可控的企业内部场景。
在实际部署中,需重点关注:
- KGC 主密钥的安全管理(HSM 保护、分片存储)
- 双线性对的实现安全性(防侧信道攻击)
- 与现有国密协议的集成(DTLCP、CMS)
参考文献
- GM/T 0044-2016《SM9 标识密码算法》
- Boneh D, Franklin M. Identity-based encryption from the Weil pairing. SIAM Journal on Computing, 2003.
- Al-Riyami S S, Paterson K G. Certificateless public key cryptography. ASIACRYPT 2003.
- GM/T 0130-2023《基于 SM2 算法的无证书及隐式证书公钥机制》