SM9 标识密码(IBC)

SM9 是中国商用密码系列里的标识密码成员:任意字符串 —— 一个邮箱地址、一个手机号、一台设备的序列号 —— 都可以直接当公钥用,而由密钥生成中心(KGC)签发 与之配套的私钥。本页是只读的讲解页: IBE 与 IBS 的分步流程、标识密码与 PKI 证书的对比, 以及官方曲线参数。
计算器开发中。浏览器端的 SM9 计算器已列入密码学系列的路线图 —— 双线性对所依赖的那套 machinery(Fp12 扩域塔、Miller 循环、最终幂运算)本身就是一个独立内核。 在此之前,姊妹页已经在你的浏览器里完整计算 SM2、 SM3 和 SM4。
什么是 SM9?
一句话:SM9 是中国的标识密码国家标准 (GB/T 38635.1/.2-2020,承接 GM/T 0044-2016 系列):公钥就是 bob@example.com 这样的标识字符串,与之对应的私钥由可信的 密钥生成中心(KGC)签发,而支撑这一切的数学是 256 位 BN 曲线上的双线性对。

传统公钥密码(RSA、SM2、ECC)用证书来回答 “这真的是 Bob 的密钥吗?”:由 CA 层级担保某个看起来随机的密钥数据块属于 Bob。标识密码 把这个逻辑倒了过来:名字本身就是密钥材料。任何知道 Bob 邮箱地址的人都能给他加密或验证他的签名,不需要 抓取任何东西 —— 没有证书目录,也没有信任链校验。 代价是要有一个能推导出所有私钥的可信第三方,以及沉重得多的数学运算。SM9 就是这一取舍的中国标准化实现。

角色一览:谁持有什么
角色是什么
标识(ID)任意字节串,例如 bob@example.com,直接作为公钥使用。它必须是规范化的:逐字节完全一致,同一个人不能有两种写法。
KGC密钥生成中心(Key Generation Centre):持有主私钥,核验某个标识确实属于某人,并签发与之匹配的用户私钥。
主密钥对两对相互独立的密钥:签名主密钥(私钥 ks,公钥 Ppub-s = [ks]P2)与加密主密钥(私钥 ke,公钥 Ppub-e = [ke]P1)。注意这里刻意的不对称:一个主公钥落在 G2,另一个落在 G1。
用户私钥曲线上的一个点,由 KGC 从标识派生出来。签名私钥 dsA 位于 G1;解密私钥 deB 位于 G2。
hid一个一字节的函数标识符,混入每一次密钥派生,因此同一个标识能为签名、加密和密钥交换派生出密码学上相互独立的密钥。
H1、H2、KDF基于 SM3 的辅助函数(GB/T 32905):哈希到整数的映射,以及密钥派生函数。
双线性对 e定义在下文那条 256 位 BN 曲线上的 R-ate 双线性对 e: G1 × G2 → GT。整个方案的代数引擎。
SM9 标识加密(IBE)如何工作

Alice 想给 bob@example.com 发送一份秘密 —— 甚至可能在 Bob 还从未在 KGC 注册过的时候:

1. Alice 自己推导出 Bob 的公钥: QB = [H1(IDB ‖ hid, N)]P1 + Ppub-e。 不需要查目录,不需要取证书 —— 她只需要这个标识字符串和公开的主密钥。
2. 临时随机数:随机取 r;计算点 C1 = [r]QB。
3. 配对:g = e(Ppub-e, P2),然后 w = gr。
4. 密钥:K = KDF(C1 ‖ w ‖ IDB, klen)(基于 SM3),拆成 K1(包装密钥)和 K2(MAC 密钥)。
5. 掩蔽:C2 = 消息与 K1 异或(或在其下加密)的结果;C3 = MAC(K2, C2)。密文由 C1、C3 和 C2 组成。
6. Bob 何时注册都可以:KGC 核验他确实是 bob@example.com 之后签发 deB = [ke·(H1(IDB ‖ hid, N) + ke)-1]P2。 随后他计算 w′ = e(C1, deB),重建出同一个 K,校验 MAC 并解出消息。

为什么能成立:由双线性, e(C1, deB) = e([r(H1+ke)]P1, [ke/(H1+ke)]P2) = e(P1, P2)r·ke = w —— 正是 Alice 折进 KDF 的那个值。最精妙的是第 6 步:加密不需要对方预先注册。 Alice 今天就能把消息封起来;Bob 只有在向 KGC 证明身份之后才能打开。 延迟的密钥生成,正是 IBE 的标志性特性。

SM9 标识签名(IBS)如何工作

Alice 用她的签名私钥 dsA 对消息 M 签名:

1. g = e(P1, Ppub-s);随机 r;w = gr。
2. h = H2(M ‖ w, N);l = (r − h) mod N(若 l = 0,换一个新的 r 重试)。
3. S = [l]dsA。签名就是二元组 (h, S)。

任何知道 Alice 标识的人都能验证签名,不需要任何证书:

4. P = [H1(IDA ‖ hid, N)]P2 + Ppub-s;u = e(S, P);w′ = u · gh。
5. 签名有效当且仅当 H2(M ‖ w′, N) = h。

双线性再次闭合了这个环路:u = e(P1,P2)l·ks, gh = e(P1,P2)ks·h,于是 w′ = e(P1,P2)ks·(l+h) = e(P1,P2)ks·r = w。

标识密码 vs 证书密码(IBE vs PKI)

这才是选择 SM9 时真正要紧的取舍。两种体系都能给你公钥加密和签名, 区别在于信任放在哪里:

对比维度PKI / 证书体系(SM2、RSA 世界)标识密码(SM9)
bob@… 的公钥证书里一段 65 字节以上的数据块,需要从目录服务或接收者本人处获取就是 bob@example.com 这个字符串本身;验证方由它自己算出公钥
信任根一套 CA 层级;每条证书链都要一路验证到根整个域共用一个 KGC 主公钥
能在接收者拿到密钥之前就加密吗?不能 —— 你得先有他那张有效证书能 —— 现在就加密,他以后注册再解密
私钥由谁生成用户自己的机器或设备(通常永不离开本机)由 KGC 依据标识集中生成
密钥托管按设计不存在天然存在:KGC 能推导出每个用户的私钥
吊销按证书查询 CRL / OCSP没有对应机制;通常做法是把有效期写进标识本身(例如 bob@example.com|2026),让密钥结构上自带过期时间
单次运算开销普通 ECC 运算 —— 很快一次双线性对运算 —— 比一次标量乘慢几个数量级
标准X.509 / RFC 5280;SM2 见 GB/T 32918GB/T 38635.1/.2-2020(前身 GM/T 0044-2016)
典型适用场景开放互联网:TLS、代码签名、通用 PKI封闭生态:某一家银行的内部消息、某一个机关的邮件、车队 / 设备身份 —— 这些场景里中心化权威是可接受的,而免注册的加密很划算

经验法则:SM9 用密钥托管和更慢的运算,换来免证书的密钥管理。 如果你无法接受存在一个能读一切、能冒充任何人的第三方,就继续用 SM2 证书; 如果你的目标是在一个组织内部做到免注册加密,SM9 正是对路的工具。

SM9 系统参数(官方 256 位 BN 曲线)

以下参数集取自 GB/T 38635.1-2020(GM/T 0044.5-2017 中同样给出)。 这些是只读的参考值 —— 下面的自检会把本页每一个常量都与独立核验过的值 重新比对一遍:

项目取值
曲线Barreto–Naehrig(BN)曲线 E: y2 = x3 + b,定义于 Fp,b = 05
曲线参数 t60000000 0058F98A
域素数 pB6400000 02A3A6F1 D603AB4F F58EC745 21F2934B 1A7AEEDB E56F9B27 E351457D
群阶 NB6400000 02A3A6F1 D603AB4F F58EC744 49F2934B 18EA8BEE E56EE19C D69ECF25
参数化形式p = 36t4 + 36t3 + 24t2 + 6t + 1; N = 36t4 + 36t3 + 18t2 + 6t + 1
余因子1
嵌入次数 k12(域塔 Fp → Fp2 → Fp4 → Fp12)
双线性对R-ate 双线性对 e: G1 × G2 → GT,三个群的阶都是 N
G1 生成元 P1(在 E 上)x = 93DE051D 62BF718F F5ED0704 487D01D6 E1E40869 09DC3280 E8C4E481 7C66DDDD
y = 21FE8DDA 4F21E607 63106512 5C395BBC 1C1C00CB FA602435 0C464CD7 0A3EA616
G2 生成元 P2(在扭曲线 E′: y2 = x3 + 5·u 上,定义于 Fp2,u2 = −2)xc0 = 37227552 92130B08 D2AAB97F D34EC120 EE265948 D19C17AB F9B7213B AF82D65B
xc1 = 85AEF3D0 78640C98 597B6027 B441A01F F1DD2C19 0F5E93C4 54806C11 D8806141
yc0 = A7CF28D5 19BE3DA6 5F317015 3D278FF2 47EFBA98 A71A0811 6215BBA5 C999A7C7
yc1 = 17509B09 2E845C12 66BA0D26 2CBEE6ED 0736A96F A347C8BD 856DC76B 84EBEB96
(Fp2 元素写作 c0 + c1·u)
哈希 / KDFH1、H2 与 KDF 都基于 SM3(GB/T 32905-2016)构造;hid 是由 KGC 选定的一字节函数标识符
SM9 在 SM 系列中的位置
  • SM9(本页)—— 密钥管理的颠覆者:用标识替代证书,用 KGC 替代 CA 层级。
  • SM3 —— 哈希算法;SM9 的 H1/H2/KDF 都由它构造。可在 SM3 页面计算摘要。
  • SM4 —— 分组密码;通常用 SM9 的 KDF 产出的密钥来加密 bulk 数据。可在 SM4 页面试用。
  • SM2 —— 证书世界的对应者:同样做签名和加密,但用普通 ECC 加一套 PKI。完整计算器见 SM2 页面。
合规提示:SM9 是面向中国合规部署的一项“算法自主 + 密钥管理方式”选择, 强度与其他 ~128 位系统相当。生产环境上线时必须把 KGC 主密钥当作皇冠上的宝石来守护 —— 通常存放在 HSM 中、拆分给多位受托人共同持有,或两者兼施。
常见误解
  • “标识就是公钥,那任何人都能解密我的邮件。”不是 —— 任何人都能向这个标识加密、能验证来自它的签名;只有持有 KGC 签发的私钥的人才能解密或签名。在交出 deB 之前,KGC 会先核实 Bob 到底是谁。
  • 忽视密钥托管。KGC 主密钥一旦泄露,攻击者就能悄悄推导出每一个用户的私钥 —— 整个域的通信被全部解密、身份被全部冒充。这是设计使然(标识密码本就如此),不是可以打补丁修掉的缺陷。只能在运维上缓解:HSM、跨机构的门限 KGC、严格的签发审计日志。
  • 以为标识字符串可以随意写。它是逐字节精确哈希的:Bob@Example.COM、bob@example.com 和 " bob@example.com" 是三个不同的公钥,对应三个不同的私钥。部署前先冻结一种规范格式 —— 并考虑追加一段有效期以便吊销。
  • “256 位曲线,那就是 256 位安全性。”基于配对的密码并不按普通 ECC 的方式缩放:攻击发生在巨大的 Fp12/Fp6 域里,那里适用指数积分(亚指数)算法。已发表的分析把 256 位 BN 曲线放在 ~100–128 位安全等级,也有研究者为 SM9 提出了更大的 BN 参数(如 2019 年的《Searching BN Curves for SM9》)。把 SM9 当作大致 AES-128 级别看待 —— 足够扎实,但不是 256 位的堡垒。
  • 指望 OpenSSL 里有它。OpenSSL 实现了 SM2/SM3/SM4,但没有 SM9。可用的开源实现包括 GmSSL 和 Bouncy Castle。
常见问题

SM9 是中国人的发明吗?理念不是:Shamir 在 1984 年提出了标识密码,Boneh–Franklin(2001)构造了第一个实用的基于配对的 IBE。SM9(GM/T 0044-2016,其后 GB/T 38635.1/.2-2020)是这一脉络的中国国家标准实例化。

为什么本页没有 SM9 计算器?与 SM2/SM3/SM4 不同,SM9 需要双线性对:一个 Fp12 扩域塔、一个 Miller 循环和一次最终幂运算 —— 数千行需要小心处理的大数运算代码。它已在系列路线图上;在那之前,本页负责讲清算法,姊妹页负责在浏览器里计算系列的其余部分。

SM9 能取代 SM2、SM3 和 SM4 吗?不能 —— 它们解决的是不同的问题。SM9 取代的是证书基础设施,而不是这些基础算法:它内部依赖 SM3 做哈希和密钥派生,而包装出来的 bulk 密钥通常驱动 SM4。当需要证书式的可追责、且不接受密钥托管时,答案仍然是 SM2。

hid 到底是什么?一个一字节的函数标识符(由 KGC 选定并公开),会混入每一次 H1 哈希。因为签名密钥、加密密钥和密钥交换密钥是用不同的 hid 值把标识一起哈希的,所以某一个用户密钥泄露只危及那一个功能。

标识怎么吊销?SM9 内部没有 CRL 机制。标准做法:把过期时间写进标识本身(bob@example.com|2026-Q4),让密钥必须定期重新签发;同时让 KGC 对已吊销的标识停止签发。

SM9 实际用在哪里?在中国的受监管行业 —— 银行、政务和行业消息系统 —— 通常是封闭生态,那里单一权威是可接受的,而“今天就能往一个邮箱地址加密、明天再让用户注册”这件事值得付出配对运算的代价。

自检
本页是只读页,所以自检校验的是页面自身:上面显示的每一个曲线 常量都会与独立核验过的值重新比对(由 BN 参数化形式重算素数 p 与阶 N, 两个生成元都校验在曲线上且阶为 N),此外还检查标准编号、模板不变量 (无 DOCTYPE、构建标记)、交叉链接与 FAQ 是否存在。