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 是否存在。