SM9 标识密码算法原理详解:从双线性对到身份基密码体系

算法原理 · 2026-05-31

概述

传统 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-2016SM9 签名算法(IBS)
密钥交换GM/T 0044.3-2016SM9 密钥交换协议
加密算法GM/T 0044.4-2016SM9 加密算法(IBE)
SM9 的核心设计哲学是:用身份取代证书。用户的公钥直接由其身份标识计算得出,私钥则由可信的密钥生成中心(Key Generation Center, KGC)通过主密钥和用户身份派生。这一架构在保持安全性的同时,大幅简化了密钥管理的复杂度。

数学基础回顾

双线性对与配对友好曲线

SM9 的安全性完全建立在双线性配对(Bilinear Pairing)之上。与 SM2 使用的普通椭圆曲线不同,SM9 必须使用配对友好曲线(Pairing-Friendly Curve)——具有较低嵌入度的特殊椭圆曲线,使得配对运算可以在合理的时间内完成。

SM9 定义在 256 位素数域 $\mathbb{F}_p$ 上,曲线方程为:

$$y^2 = x^3 + b$$

其中 $b = 5$(一个极小的常数)。核心参数:

CODE
基域素数 p = 0xB640000002A3A6F1D603AB4FF58EC74521F2934B1A7AEEDBE56F9B27E351457D
子群阶 r = 0xB640000002A3A6F1D603AB4FF58EC74449F2934B18EA8BEEE56EE19CD69ECF25
嵌入度 k = 12
安全强度 ≈ 128 位

嵌入度 $k = 12$ 意味着 $G_2$ 群定义在 $\mathbb{F}_{p^{12}}$ 扩域上。SM9 采用 R-ate 配对,这是 Ate 配对的一种优化变体,计算效率比原始 Tate 配对更高。

参数刚性(Rigidity)

SM9 的曲线参数通过确定性算法从刚性种子生成:

CODE
刚性种子 = 0x786279616C6C20736D3920637572766520706172616D657465727320722D323536
ASCII 解码 = "sm9 curve parameters r-256"

刚性(Rigidity)是配对密码学中重要的安全原则:参数必须完全由确定性算法生成,无可信设置后门。这意味着任何人都可以独立验证曲线的生成过程,确保参数中没有被植入弱点。

KGC 架构与密钥体系

密钥生成中心(KGC)

SM9 系统的核心是密钥生成中心(KGC),它持有主密钥并为所有用户派生私钥。KGC 的架构如下:

密钥层级

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$
KGC 保留的主密钥为标量 $s \in \mathbb{Z}_r^*$,并公开主公钥 $P_{pub} = s \cdot P_2 \in G_2$。

私钥派生

用户 $U$ 的私钥通过以下步骤派生:

CODE
输入:主密钥 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)

CODE
输入:接收方身份 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)

CODE
输入:密文 (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)$...
这里利用双线性对的对称性 $e(aP, bQ) = e(P, abQ) = e(bP, aQ)$,确保加密方和解密方计算出相同的共享秘密 $w$。

SM9 数字签名算法(IBS)

算法流程

签名(Sign)

CODE
输入:签名者私钥 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)

CODE
输入:签名者身份 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 密钥交换允许两个用户基于各自的身份协商共享密钥,无需数字证书:

共享秘密的正确性

双方计算出的 $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}$,双方计算方式相同
共享密钥 $K$ 由身份标识、交换的随机点和配对结果共同派生,确保前向安全性(即使长期私钥泄露,过去的会话密钥仍然安全)。

安全性分析

安全假设

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$
安全性归约:任何有效的 IND-ID-CMA 攻击者可以转化为 BDH 问题的求解器。

KGC 信任模型与安全风险

SM9 的核心安全假设是 KGC 诚实且安全。由于 KGC 持有主密钥 $s$,它可以派生任何用户的私钥——这被称为密钥托管问题(Key Escrow Problem)。

CODE
安全层次:

1. KGC 安全 → 系统安全
2. KGC 被攻破 → 所有用户私钥泄露
3. KGC 主密钥轮换 → 需要重新分发所有用户私钥

缓解措施

  • 分层 KGC:使用多个独立的 KGC,要求多数 KGC 联合才能派生用户私钥(门限密码学)
  • 多因素身份:将用户身份与时间戳、应用标识绑定,限制私钥的使用范围
  • KGC 隔离:KGC 部署在硬件安全模块(HSM)中,主密钥永不离开 HSM

SM9 与国外方案对比

维度SM9 (GM/T 0044)BF-IBE (2001)BLS 签名
算法类型IBE + IBS + IKEIBE 仅短签名
数学基础R-ate 配对Weil 配对Weil/Tate 配对
签名长度~256 字节N/A~48 字节(BN254)
加密尺寸G₂ 点 + MACG₂ 点 + MACN/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 作为公钥,无需证书存储和验证:

CODE
IoT 场景优势:
  · 无需 CA 证书链 → 减少存储开销
  · 设备 ID 即公钥 → 简化密钥分发
  · KGC 集中管理 → 统一密钥生命周期

2. 云环境多租户加密

云平台上,租户 ID 可直接作为 SM9 身份,实现租户数据的身份基加密:

CODE
租户隔离:
  · 租户 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

相关实践