OpenPGP 金鑰檢查器與包解析器

貼上一段 ASCII 甲冑封裝的 OpenPGP 金鑰、簽名或訊息 —— 或者載入二進位制 .gpg 檔案 —— 即可檢視指紋、金鑰 ID、使用者 ID、子金鑰、簽名包以及原始的包結構樹。完全在你的瀏覽器裡完成;不會上傳任何資料。
僅解析。本工具只解碼並展示 OpenPGP 資料 —— 它從不做密碼學簽名驗證、從不解密、也從不索要口令。要真正驗證或解密,請用 GnuPG(gpg --verify、gpg -d)配合你自己的鑰匙串。而且和任何工具一樣:真正的私鑰應該放在你的鑰匙串裡,而不是瀏覽器的標籤頁裡。
接受全部甲冑型別:PUBLIC KEY BLOCK、PRIVATE KEY BLOCK、MESSAGE、SIGNATURE、ARMORED FILE。
二進位制鑰匙串匯出 / .sig / .gpg —— 本地讀取,絕不上傳
本工具檢查什麼 —— 以及刻意不做什麼
它會解碼甲冑(標籤、頭部、base64 載荷、CRC-24 傳輸校驗和),按新舊兩種頭部格式解析每一個包,讀取 v4/v5/v6 金鑰包(演算法、MPI 尺寸、建立時間),計算 v4 指紋(SHA-1)與 v6 指紋(SHA-256),推導金鑰 ID,列出使用者 ID、子金鑰和簽名子包。它不會驗證簽名(那需要完整的 RFC 9580 §5.2.4 雜湊-驗證機制加上一個可信鑰匙串)、不解密、也不會從金鑰伺服器抓取金鑰。任何輸出都請與 GnuPG 交叉核對:gpg --show-keys file.asc 列印指紋和使用者 ID,gpg --list-packets file.asc 轉儲包結構。
本頁的樣本金鑰 —— 四個“樣本”按鈕貼上的是一把專為本頁生成(從未在別處使用)的真實 RSA-2048 OpenPGP v4 金鑰。私鑰樣本刻意以未加密形式存放(S2K usage 0),以便解析器展示秘密 MPI 的佈局;真實匯出的私鑰則會顯示它的密碼演算法與 S2K 派生方式。
自檢
對內建樣本金鑰、一份分離簽名和一條已簽名訊息重新執行解析器:甲冑標籤、CRC-24 通過與刻意損壞、包 tag 序列、與獨立計算值比對的 v4 指紋和金鑰 ID、使用者 ID、子金鑰指紋、私鑰檢測,以及負面用例(垃圾輸入與截斷的包必須被拒絕)。不會向任何地方傳送資料。
OpenPGP 從零講起
一句話:OpenPGP 是一個用於端到端加密和數字簽名的開放標準(RFC 4880,2024 年由 RFC 9580 更新),最著名的用途是保護電子郵件 —— 一切內容都以帶標籤的小型二進位制包傳輸,外面通常再包一層對文本友好的“甲冑”。
什麼是 OpenPGP?

PGP(“Pretty Good Privacy”)由 Phil Zimmermann 於 1991 年釋出,是一個人人都能用來加密和簽名訊息的程式。為了擺脫單一廠商的問題,訊息格式被標準化為 OpenPGP(1998 年 RFC 2440、2007 年 RFC 4880、2024 年 RFC 9580)。如今 GnuPG 是最常見的實現,同一套包格式也出現在簽名的 git 提交、軟體包簽名、金鑰伺服器和 OPENPGPKEY DNS 記錄中。

這個模型是端到端的:你和通訊對方各自生成一對個人金鑰;凡是為你的公鑰加密的東西,只能用你的私鑰解開,而私鑰從不離開你的機器。它不像 TLS 那樣依賴中央證書機構,對他人金鑰的信任來自互相簽署對方的金鑰 —— 即“信任之網”。你是用這張網,還是乾脆用帶外方式(一通電話、一張名片)核對指紋,都由你決定;格式本身不強制任何一種。

什麼是 OpenPGP 金鑰?

一個 OpenPGP“金鑰”其實是小小的一束包:一個主金鑰包(你的身份錨點,通常允許簽名)、一個或多個 User ID 包(“Alice <alice@example.com>”)、把這些 ID 繫結到主金鑰的自簽名,以及可選的、帶各自繫結簽名的子金鑰 —— 通常是一把獨立的加密子金鑰,讓貴重的主金鑰可以保持離線。你貼上進本頁的整段甲冑資料塊就是這一束。

指紋是主金鑰包的雜湊 —— v4 金鑰用 SHA-1(20 位元組),v6 金鑰用 SHA-256(32 位元組)—— 只對公開部分計算。金鑰 ID 只是 v4 指紋的最後 8 位元組(v5 是前 8 位元組)。指紋是你用帶外方式核對的東西,用來確保沒有人在金鑰到你手的路上調包;金鑰 ID 是金鑰伺服器上的短控制代碼,面對堅決的攻擊者並不具備抗碰撞性。

演算法 ID名稱在金鑰中的典型用途
1RSA經典全能型;2048–4096 位,簽名和/或加密
19ECDSANIST 曲線(P-256 等),簽名
18ECDHCurve25519/P-256 金鑰協商,加密子金鑰
22EdDSAEd25519 簽名(GnuPG 2.4+ 的現代預設)
25X25519與 Ed25519 主金鑰配對的加密子金鑰(v6 金鑰)

私鑰資料塊在公開部分之後攜帶秘密數字:一個 S2K usage 位元組說明它們的保護方式(0 = 未保護,254/255 = 由口令派生金鑰配合一個密碼演算法),然後是秘密 MPI 和一個校驗和。本頁會顯示這個保護模式,但從不索要口令、也從不嘗試解密秘密材料。

什麼是 OpenPGP 包(packet)?

甲冑之下,每個 OpenPGP 物件都是一串包。每個包以一個 tag 位元組開頭:舊格式把 4 位包型別和長度型別打包進去,新格式(CTB,第 6 位置 1)用 6 位型別和能以分塊方式描述資料的長度位元組。常見 tag:6 = 公鑰,5 = 私鑰,14 = 子金鑰,13 = 使用者 ID,2 = 簽名,4 = 單遍簽名,11 = 字面資料,8 = 壓縮資料,18 = 加密且受 MDC 保護的資料。本頁為找到的每個包列印 tag、頭部格式、長度和十六進位制轉儲,並在包頭損壞時報出位元組位置。

簽名包把後設資料放在雜湊區和非雜湊區兩個子包區裡。只有雜湊區被簽名本身覆蓋;非雜湊區(歷史上放簽發者金鑰 ID)可以被傳輸途中的任何人隨意改寫,所以讀者只能把它當作提示,絕不能當作事實。User ID 上的自簽名才是真正把名字綁到金鑰上的東西;單貼一個金鑰包,說明不了任何歸屬。

ASCII 甲冑是文本外衣:-----BEGIN PGP PUBLIC KEY BLOCK-----、可選的頭部(如 Version: 或 Comment:)、包流的 base64,以及最後一行存放 24 位 CRC 的 =xxxx。這個 CRC 只能發現傳輸損壞 —— 翻錯一個 base64 字元本頁就會標紅 —— 但它不是簽名,證明不了任何作者身份。

常見錯誤
  • 不核對指紋就信任一把金鑰。任何人都能用任何名字生成金鑰。在一個你已經信任的渠道上(當面、電話)核對指紋,才是整個身份認證環節。
  • 把甲冑 CRC 當成簽名。“CRC OK”只說明 base64 完好地走完了這段路,僅此而已。驗證是一種本頁刻意不做的密碼學操作。
  • 把金鑰 ID 當身份。64 位金鑰 ID 可以被算力普通的攻擊者偽造(“金鑰 ID 碰撞”);請始終引用完整指紋。
  • 把真實私鑰貼進網頁。哪怕像本頁這樣本地執行、不上傳的頁面,這種習慣也不該養成。這裡的樣本只是為演示而生成的用後即棄金鑰。
  • 以為“PGP MESSAGE”就等於加密了。甲冑標籤對內容隻字未提 —— 本頁的樣本訊息就是簽了名但明文的,真正區分加密與字面資料的是包 tag 18 與 11。
  • 匯入 v3 金鑰。v3 金鑰(1996 年前的設計,弱 16 位金鑰 ID)自 2014 年起已廢棄;本檢查器刻意拒絕它們。
常見問題

本工具驗證簽名嗎?不。它只解析並展示。簽名驗證需要完整的 RFC 9580 雜湊尾部構造、簽名者的公鑰,以及你對那把金鑰的信任判斷 —— 那是 GnuPG 或 OpenPGP 庫的工作。

它與 openpgp.js 有何不同?openpgp.js 是你可以嵌入應用的完整實現(加密、解密、簽名、驗證);本頁是一個零依賴的檢查器,用於在瀏覽器裡閱讀和審計 OpenPGP 結構。

能讀取我的 GnuPG 匯出嗎?能 —— v4、v5、v6 金鑰、分離簽名和訊息都可以。v3 金鑰會被拒絕並附註說明(2014 年起廢棄)。

為什麼有十六進位制輸入模式?原始 OpenPGP 資料是二進位制的;如果你手上有鑰匙串或 .gpg 檔案的十六進位制轉儲,把十六進位制貼進來,解析器會把它當作解碼後的位元組一樣處理。

會上傳任何東西嗎?不會。解析、指紋計算和報告生成都在這個標籤頁裡完成;頁面完全在你的瀏覽器中執行。