SM9 标识密码算法原理详解:从双线性对到身份基密码体系
概述
传统 PKI 体系中,通信双方的公钥需要通过数字证书进行绑定和验证——证书的签发、分发、吊销构成了复杂的基础设施。1984 年,Shamir 提出了基于身份的密码学(Identity-Based Cryptography, IBC)的革命性设想:能否直接用用户的身份标识(如邮箱、手机号、身份证号)作为公钥,彻底消除证书管理的负担?
2001 年,Boneh 和 Franklin 利用 Weil 配对构造了首个可证明安全的身份基加密方案(BF-IBE),使 Shamir 的设想成为现实。同年,Boneh、Lynn 和 Shacham 提出了 BLS 短签名方案,进一步展示了配对密码学的威力。
在此背景下,中国国家密码管理局于 2016 年发布了 GM/T 0044 系列标准,定义了 SM9 标识密码算法。SM9 包含四个子标准:
| 子标准 | 编号 | 功能 |
|---|---|---|
| 曲线参数 | GM/T 0044.1-2016 | 定义配对友好曲线及参数 |
| 数字签名 | GM/T 0044.2-2016 | SM9 签名算法(IBS) |
| 密钥交换 | GM/T 0044.3-2016 | SM9 密钥交换协议 |
| 加密算法 | GM/T 0044.4-2016 | SM9 加密算法(IBE) |
数学基础回顾
双线性对与配对友好曲线
SM9 的安全性完全建立在双线性配对(Bilinear Pairing)之上。与 SM2 使用的普通椭圆曲线不同,SM9 必须使用配对友好曲线(Pairing-Friendly Curve)——具有较低嵌入度的特殊椭圆曲线,使得配对运算可以在合理的时间内完成。
SM9 定义在 256 位素数域 $\mathbb{F}_p$ 上,曲线方程为:
$$y^2 = x^3 + b$$
其中 $b = 5$(一个极小的常数)。核心参数:
基域素数 p = 0xB640000002A3A6F1D603AB4FF58EC74521F2934B1A7AEEDBE56F9B27E351457D
子群阶 r = 0xB640000002A3A6F1D603AB4FF58EC74449F2934B18EA8BEEE56EE19CD69ECF25
嵌入度 k = 12
安全强度 ≈ 128 位嵌入度 $k = 12$ 意味着 $G_2$ 群定义在 $\mathbb{F}_{p^{12}}$ 扩域上。SM9 采用 R-ate 配对,这是 Ate 配对的一种优化变体,计算效率比原始 Tate 配对更高。
参数刚性(Rigidity)
SM9 的曲线参数通过确定性算法从刚性种子生成:
刚性种子 = 0x786279616C6C20736D3920637572766520706172616D657465727320722D323536
ASCII 解码 = "sm9 curve parameters r-256"刚性(Rigidity)是配对密码学中重要的安全原则:参数必须完全由确定性算法生成,无可信设置后门。这意味着任何人都可以独立验证曲线的生成过程,确保参数中没有被植入弱点。
KGC 架构与密钥体系
密钥生成中心(KGC)
SM9 系统的核心是密钥生成中心(KGC),它持有主密钥并为所有用户派生私钥。KGC 的架构如下:
┌─────────────────────────────────────────────┐
│ KGC (密钥生成中心) │
│ │
│ ┌─────────────┐ ┌──────────────────┐ │
│ │ 主密钥 s │────▶│ 私钥派生函数 │ │
│ │ (Master │ │ Derive(s, ID) │ │
│ │ Secret) │ │ │ │
│ └─────────────┘ └────────┬─────────┘ │
│ │ │
│ ┌─────────────┐ │ │
│ │ 公开参数 │ │ │
│ │ (params) │◀─────────────┘ │
│ │ · 曲线参数 │ │
│ │ · P₁, P₂ │ │
│ │ · H₁, H₂ │ │
│ └──────┬──────┘ │
└─────────┼───────────────────────────────────┘
│
┌─────┼──────┐
│ │ │
▼ ▼ ▼
用户A 用户B 用户C
ID_A ID_B ID_C
sk_A sk_B sk_C密钥层级
SM9 采用两级密钥体系:
- 主密钥(Master Secret):KGC 持有的根密钥,整个系统的安全根基。每个 KGC 层级有唯一的主密钥对 $(s_{P_1}, s_{P_2})$。
- 用户私钥(User Secret Key):由主密钥和用户身份通过确定性算法派生,每个用户对应唯一的私钥。
公开参数与主密钥
KGC 公开参数包括:
- 曲线 $E$ 的参数($p, a, b, n$)
- $G_1$ 的生成元 $P_1$
- $G_2$ 的生成元 $P_2$
- 哈希函数 $H_1: \{0,1\}^* \rightarrow \mathbb{Z}_r^*$ 和 $H_2: G_T \rightarrow \{0,1\}^n$
- 配对函数 $e: G_1 \times G_2 \rightarrow G_T$
私钥派生
用户 $U$ 的私钥通过以下步骤派生:
输入:主密钥 s,用户身份 ID_U
输出:用户私钥 d_U
1. 计算 h = H₁(ID_U) ∈ ℤ_r*
2. 若 h + s ≡ 0 (mod r),则 KGC 的主密钥必须更换(极罕见事件)
3. 计算 d_U = 1/(h + s) · P₁ ∈ G₁私钥派生的核心数学性质:$d_U$ 满足 $e(d_U, h \cdot P_2 + P_{pub}) = e(P_1, P_2)$,这是后续所有协议正确性的基础。
SM9 加密算法(IBE)
算法流程
SM9 加密方案允许发送方使用接收方的身份标识直接加密消息,无需事先获取接收方的公钥证书。
加密(Enc):
输入:接收方身份 ID_B,明文 M ∈ {0,1}^*
输出:密文 (C₁, C₂, C₃)
1. 计算 h = H₁(ID_B)
2. 计算 Q_B = h · P₂ + P_pub ∈ G₂ (接收方的"公钥")
3. 随机选择 r ∈ ℤ_r*
4. 计算 C₁ = r · P₂ ∈ G₂ (密文第一部分,G₂ 点)
5. 计算 g = e(Q_B, P_pub) ∈ G_T
6. 计算 w = g^r ∈ G_T (共享秘密)
7. C₂ = M ⊕ H₂(w || C₁) (密文第二部分,消息加密)
8. C₃ = H₄(M || w) (MAC 标签,消息认证)解密(Dec):
输入:密文 (C₁, C₂, C₃),接收方私钥 d_B
输出:明文 M 或 失败
1. 计算 w' = e(C₁, d_B) ∈ G_T
2. 计算 M' = C₂ ⊕ H₂(w' || C₁)
3. 验证 C₃ ?= H₄(M' || w')
4. 若验证通过,输出 M';否则输出失败正确性证明
解密正确性的关键在于配对的双线性性质:
$$w' = e(C_1, d_B) = e(r \cdot P_2, \frac{1}{h+s} \cdot P_1)$$
$$= e(P_2, P_1)^{\frac{r}{h+s}} = e(Q_B, P_{pub})^r = g^r = w$$
等式成立是由于:
- $Q_B = h \cdot P_2 + P_{pub} = (h + s) \cdot P_2$
- $d_B = \frac{1}{h+s} \cdot P_1$
- 因此 $e(C_1, d_B) = e(r \cdot P_2, \frac{1}{h+s} \cdot P_1) = e(P_2, P_1)^{\frac{r}{h+s}}$
- $e(Q_B, P_{pub}) = e((h+s) \cdot P_2, s \cdot P_2) = e(P_2, P_2)^{s(h+s)}$
- 注意 $e(Q_B, P_{pub})^r = e(P_2, P_2)^{rs(h+s)} = e(r \cdot P_2, (h+s) \cdot P_2)$...
SM9 数字签名算法(IBS)
算法流程
签名(Sign):
输入:签名者私钥 d_A,消息 M
输出:签名 (h, S)
1. 计算 g = e(P₁, P_pub) ∈ G_T
2. 随机选择 r ∈ ℤ_r*
3. 计算 w = g^r ∈ G_T
4. 计算 h = H₂(M || w) ∈ ℤ_r*
5. 计算 l = (r - h) · d_A mod r
6. 输出签名 σ = (h, l)注意:签名中 $l$ 是一个标量(而非群元素),这使得 SM9 签名的尺寸非常紧凑。
验证(Verify):
输入:签名者身份 ID_A,消息 M,签名 (h, S)
输出:接受 / 拒绝
1. 计算 h' = H₁(ID_A)
2. 计算 Q_A = h' · P₂ + P_pub ∈ G₂
3. 计算 g = e(P₁, P_pub)
4. 计算 w' = g^h · e(S · P₁, Q_A)^{-1} (利用配对性质重构 w)
5. 计算 h'' = H₂(M || w')
6. 接受当且仅当 h'' = h正确性
$$w' = g^h \cdot e(S \cdot P_1, Q_A)^{-1} = g^h \cdot e((r-h) \cdot d_A, Q_A)^{-1}$$
$$= g^h \cdot e(r \cdot d_A, Q_A)^{-1} \cdot e(h \cdot d_A, Q_A)^{-1}$$
由于 $d_A = \frac{1}{h'+s} \cdot P_1$,且 $Q_A = (h'+s) \cdot P_2$:
$$e(d_A, Q_A) = e(\frac{1}{h'+s} \cdot P_1, (h'+s) \cdot P_2) = e(P_1, P_2)$$
因此 $e(r \cdot d_A, Q_A) = e(P_1, P_2)^r = e(P_1, s \cdot P_2)^r = e(P_1, P_{pub})^r = g^r = w$,验证等式成立。
SM9 密钥交换协议
协议流程
SM9 密钥交换允许两个用户基于各自的身份协商共享密钥,无需数字证书:
发起方 A 响应方 B
│ │
│ 1. 选择随机 r_A ∈ ℤ_r* │
│ 2. 计算 R_A = r_A · P₂ │
│ │
│──────── R_A, ID_A ──────────────▶│
│ │ 3. 选择随机 r_B ∈ ℤ_r*
│ │ 4. 计算 R_B = r_B · P₂
│ │
│◀─────── R_B, ID_B ──────────────│
│ │
│ 5. 计算: │ 5. 计算:
│ g₁ = e(R_B, d_A) │ g₁ = e(R_A, d_B)
│ g₂ = e(P_pub, P₁)^{r_A·r_B} │ g₂ = e(P_pub, P₁)^{r_A·r_B}
│ │
│ 6. 计算共享密钥: │ 6. 计算共享密钥:
│ K = KDF(ID_A||ID_B||R_A||R_B │ K = KDF(ID_A||ID_B||R_A||R_B
│ ||g₁||g₂) │ ||g₁||g₂)
│ │共享秘密的正确性
双方计算出的 $g_1$ 和 $g_2$ 分别相等:
- $g_1 = e(R_B, d_A) = e(r_B \cdot P_2, d_A) = e(P_2, d_A)^{r_B}$,对 B 方同理
- $g_2 = e(P_{pub}, P_1)^{r_A \cdot r_B}$,双方计算方式相同
安全性分析
安全假设
SM9 的安全性基于以下计算困难问题:
双线性 Diffie-Hellman 问题(BDH):
给定 $(P_1, aP_1, bP_1, cP_1) \in G_1^4$ 和 $(P_2, aP_2, bP_2, cP_2) \in G_2^3$,计算 $e(P_1, P_2)^{abc}$ 是计算困难的。
判定性 BDH(DBDH):给定 $(P_1, aP_1, bP_1, cP_1, P_2, aP_2, bP_2, T)$,判定 $T = e(P_1, P_2)^{abc}$ 还是 $T = e(P_1, P_2)^d$(随机值)。
安全模型
SM9-IBE 在选择性身份攻击下的不可区分性(IND-ID-CPA)模型中可证明安全:
- 攻击者可以自适应地选择目标身份 $ID^*$ 进行挑战
- 攻击者可以查询除 $ID^*$ 外任意身份的私钥
- 在挑战阶段,攻击者提交两个明文 $M_0, M_1$,获得 $ID^*$ 对 $M_b$ 的加密结果
- 攻击者无法以不可忽略的优势猜测 $b$
KGC 信任模型与安全风险
SM9 的核心安全假设是 KGC 诚实且安全。由于 KGC 持有主密钥 $s$,它可以派生任何用户的私钥——这被称为密钥托管问题(Key Escrow Problem)。
安全层次:
1. KGC 安全 → 系统安全
2. KGC 被攻破 → 所有用户私钥泄露
3. KGC 主密钥轮换 → 需要重新分发所有用户私钥缓解措施:
- 分层 KGC:使用多个独立的 KGC,要求多数 KGC 联合才能派生用户私钥(门限密码学)
- 多因素身份:将用户身份与时间戳、应用标识绑定,限制私钥的使用范围
- KGC 隔离:KGC 部署在硬件安全模块(HSM)中,主密钥永不离开 HSM
SM9 与国外方案对比
| 维度 | SM9 (GM/T 0044) | BF-IBE (2001) | BLS 签名 |
|---|---|---|---|
| 算法类型 | IBE + IBS + IKE | IBE 仅 | 短签名 |
| 数学基础 | R-ate 配对 | Weil 配对 | Weil/Tate 配对 |
| 签名长度 | ~256 字节 | N/A | ~48 字节(BN254) |
| 加密尺寸 | G₂ 点 + MAC | G₂ 点 + MAC | N/A |
| 标准化 | GM/T 0044.1-4 | 学术论文 | 无正式标准 |
| 密钥托管 | 有(KGC 持有主密钥) | 有 | 无 |
| 身份绑定 | 强绑定身份 | 强绑定身份 | 传统公钥 |
SM9 vs SM2 对比
| 维度 | SM9(标识密码) | SM2(传统公钥密码) |
|---|---|---|
| 公钥来源 | 身份标识计算 | 密钥对生成 |
| 证书需求 | 不需要 | 需要 PKI/CA |
| 私钥生成 | KGC 派生 | 用户自行生成 |
| 适用场景 | 大规模 IoT、云计算 | 传统 PKI 场景 |
| 密钥托管 | 有 | 无 |
| 计算开销 | 较高(配对运算) | 较低(标量乘) |
SM9 的性能特征
SM9 的计算开销主要来自配对运算和扩域运算。在通用服务器上的典型性能参考:
| 操作 | 说明 | 大致耗时范围 |
|---|---|---|
| 私钥派生 | KGC 为用户生成私钥 | 取决于实现和硬件 |
| 加密 | 发送方加密消息 | 取决于实现和硬件 |
| 解密 | 接收方解密消息 | 取决于实现和硬件 |
| 签名 | 用户签名消息 | 取决于实现和硬件 |
| 验证 | 验证签名 | 取决于实现和硬件 |
- 配对优化:使用最优 Ate 配对替代 R-ate 配对
- 扩域运算优化:利用 $\mathbb{F}_{p^{12}}$ 的塔式结构减少乘法次数
- 预计算:缓存 $e(P_1, P_2)$ 等固定配对结果
- 硬件加速:FPGA 或专用密码芯片加速有限域运算
SM9 的适用场景
1. 大规模 IoT 设备通信
传统 PKI 在 IoT 场景面临证书管理瓶颈。SM9 允许传感器直接用设备 ID 作为公钥,无需证书存储和验证:
IoT 场景优势:
· 无需 CA 证书链 → 减少存储开销
· 设备 ID 即公钥 → 简化密钥分发
· KGC 集中管理 → 统一密钥生命周期2. 云环境多租户加密
云平台上,租户 ID 可直接作为 SM9 身份,实现租户数据的身份基加密:
租户隔离:
· 租户 A 数据用 ID_A 加密
· KGC 保证只有持有 sk_A 的租户 A 能解密
· 无需为每个租户管理证书3. 国密合规要求
GM/T 0054-2018《信息系统密码应用基本要求》中,对传输层加密和身份认证的合规方案包括基于标识的密码算法。SM9 作为国密标准算法,可用于满足密评合规要求。
参考来源
- GM/T 0044.1-2016 SM9 标识密码算法 第1部分:曲线参数
- GM/T 0044.2-2016 SM9 标识密码算法 第2部分:数字签名算法
- GM/T 0044.3-2016 SM9 标识密码算法 第3部分:密钥交换协议
- GM/T 0044.4-2016 SM9 标识密码算法 第4部分:加密算法
- Boneh, D., Franklin, M. (2001). *Identity-Based Encryption from the Weil Pairing*. CRYPTO 2001. DOI:10.1007/3-540-45682-3_32
- Boneh, D., Lynn, B., Shacham, H. (2001). *Short Signatures from the Weil Pairing*. ASIACRYPT 2001.
- 国家密码管理局. 国密标识密码算法介绍. OSCCA
相关实践
- 如需了解 SM9 在实际项目中的部署经验,请参阅《SM9 标识密码实战:无证书加密与身份认证部署》
- 如需了解配对密码学的更深入数学原理,请参阅《配对密码学:双线性对的数学原理、构造与应用》
- 如需了解双线性对在国际上的应用(BLS 签名),请参阅《BLS 签名算法原理:双线性配对、聚合签名与门限密码学》