SM9 加密算法原理:从 GM/T 0044.4 到身份基加密的工程实践

标准规范 · 2026-08-23

概述

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 在线查询网络中断时信任链断裂
以 5G 场景为例,单小区可能同时连接数万 IoT 设备,每个设备的证书存储与管理成本呈指数级增长。

IBE 的信任模型变革

IBE 的核心创新在于:公钥可由身份标识直接计算,无需证书。其数学原理如下:

CODE
公钥 P_id = H1(ID || hid, N) · P1
私钥 d_id = s · P_id

其中:

  • H1 为哈希到椭圆曲线群 G1 的函数
  • P1 为生成元
  • s 为 KGC(密钥生成中心)的主密钥
  • N 为曲线阶
KGC 持有主密钥 s,可为任意用户派生私钥。用户公钥由身份标识直接计算,消除了证书分发需求。

密钥托管困境

IBE 的优势伴随一个核心风险:KGC 持有所有用户的完整私钥。这导致:

  • 隐私风险:KGC 可解密任意用户通信
  • 信任集中:单一故障点影响全局安全
  • 法律风险:KGC 可能被强制披露密钥
2003 年,Al-Riyami 和 Paterson 提出无证书公钥密码学(CL-PKC),将私钥拆分为两部分:KGC 持有"部分私钥",用户独立选择"秘密值",二者组合成完整私钥。这一范式解决了密钥托管问题,GM/T 0130-2023 正是基于此范式制定的。


SM9 加密算法的数学原理

基础参数与曲线定义

SM9 加密算法基于配对友好椭圆曲线,定义在有限域 F_p 上。根据 GM/T 0044-2016,SM9 使用两条素数域上的椭圆曲线:

主曲线 E/F_p:

CODE
y² = x³ + ax + b (mod p)

其中:

  • p = 0xB640000002A3A6F1D603AB4FF58EC74521F2934B1A7AEEDBE56F9B27E351457D(64 字节素数)
  • a = 0x4e
  • b = 0x01
辅助曲线 E'/F_p: SM9 使用同类曲线(supersingular curve)进行配对运算,辅助曲线参数由主曲线派生。

群结构与双线性对

定义两个素数阶循环群:

  • G1 = :E(F_p) 上的点群
  • G2 = :E'(F_p) 上的点群
阶均为 N(64 字节素数)。

双线性对 e: G1 × G2 → GT 满足:

CODE
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

CODE
H1(ID || hid, N) → 随机点 P_id ∈ G1

其中 hid 为标识符类型后缀:

  • hid = 0x01:签名私钥标识
  • hid = 0x02:加密私钥标识
  • hid = 0x03:密钥交换私钥标识
实现方式(GM/T 0044 附录 A):

H2: G1 → {0,1}^n

CODE
H2(R) → n 位比特串
输出长度与密文块长度一致,用于提取密钥流。

KGC 主密钥生成

CODE
步骤 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 申请私钥时:

CODE
步骤 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)
算法步骤:

CODE
步骤 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) → 校验值

最终密文:

CODE
C = (C1, C2, C3)

数据流示意图:

CODE
明文 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 或错误
算法步骤:

CODE
步骤 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

关键数学等价性:

CODE
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 作为完整性校验值,防止密文被篡改:

CODE
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] 在计算上是不可行的。

形式化定义:

CODE
BDH 假设:对任意多项式时间敌手 A,有
Pr[A(P, [a]P, [b]P, [c]P) = e(P,P)^[abc]] ≤ ε(n)
其中 ε(n) 为可忽略函数

安全性证明思路

BF-IBE 方案在随机预言机模型下被证明为 IND-ID-CCA2 安全(身份选取下的强选择明文攻击安全)。SM9 继承这一证明框架:

CODE
定理:若 BDH 假设成立,则 SM9 加密方案在随机预言机模型下是 IND-ID-CCA2 安全的。

证明思路:
1. 将敌手挑战密文与 BDH 实例关联
2. 若敌手可区分挑战密文,则可解 BDH 问题
3. 与 BDH 假设矛盾,故方案安全

已知攻击与防御

攻击类型威胁级别防御措施
密钥提取攻击高KGC 主密钥必须硬件保护(HSM)
选择性开放攻击中限制私钥派生次数,引入权限控制
配对碰撞攻击低使用安全的配对实现(防缓存定时攻击)
小群攻击低确保曲线参数满足安全边界

与相关方案的对比

SM9 vs BF-IBE

维度SM9BF-IBE
标准化状态GM/T 0044-2016 国家标准学术论文(2001)
曲线要求MNT 曲线 / 超奇异曲线配对友好曲线
哈希函数自定义 H1, H2随机预言机
安全性证明IND-ID-CCA2IND-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 无法单独解密)
性能较快(单次配对)稍慢(两次配对运算)
适用场景企业内部通信开放网络环境
GM/T 0130-2023 制定的无证书与隐式证书方案正是为了在开放网络环境中解决 IBE 的密钥托管问题。


工程实现要点

密钥管理要求

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核心瓶颈操作
注:性能数据基于 Tongsuo 库在 Intel Xeon Gold 6248R 上的测试,实际性能因实现和优化而异。

常见实现陷阱

陷阱 1:配对计算溢出

PYTHON
# ❌ 错误:未检查配对结果是否在 GT 中
result = pairing(C1, d_id)

# ✅ 正确:验证配对结果
result = pairing(C1, d_id)
assert result in GT  # 群成员验证

陷阱 2:H1 哈希失败死循环

PYTHON
# ❌ 错误:未设置迭代上限
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 可控环境)
  • 物联网设备身份绑定(消除证书管理)
  • 移动应用安全通道建立
  • 数据加密存储(身份即密钥)
不适合使用 SM9 的场景:
  • 开放互联网环境(密钥托管风险)
  • 多方协作且互不信任(需无证书方案)
  • 长期历史数据加密(KGC 解散后无法恢复)

与国密 TLS 协议结合

GM/T 0128-2023《数据报传输层密码协议》(DTLCP)支持 SM9 密钥协商,适用于 UDP 环境下的身份基安全通信。典型部署架构:

CODE
客户端 ←→ 服务端
    ↓         ↓
 SM9私钥   SM9私钥
    ↓         ↓
 DTLCP握手  DTLCP握手
    ↓         ↓
 共享密钥   共享密钥


相关实践链接


总结

SM9 加密算法作为国密标准体系的重要组成部分,为身份基加密提供了标准化的工程实现。其核心价值在于消除证书管理开销,适用于 KGC 可控的企业内部场景。

在实际部署中,需重点关注:

  • KGC 主密钥的安全管理(HSM 保护、分片存储)
  • 双线性对的实现安全性(防侧信道攻击)
  • 与现有国密协议的集成(DTLCP、CMS)
对于开放网络环境,建议考虑 GM/T 0130-2023 定义的无证书方案,以消除密钥托管风险。


参考文献

  • 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 算法的无证书及隐式证书公钥机制》