Encryption

GnuPG:密鑰 ID 和指紋的表示

  • June 30, 2014

gpg的手冊頁中,有鍵 ID 的範例:

234567C4
0F34E556E
01347A56A
0xAB123456

234AABBCC34567C4
0F323456784E56EAB
01AB3FED1347A5612
0x234AABBCC34567C4

和指紋:

1234343434343434C434343434343434
123434343434343C3434343434343734349A3434
0E12343434343434343434EAB3484343434343434
0xE12343434343434343434EAB3484343434343434

我的直覺是,前導 0 表示八進制,前導 0x 表示十六進制,但似乎並非如此。

有哪些不同的表示?

***注意:*在我開始之前,這裡的所有表示都是十六進制的。沒有其他代表。


密鑰 ID

手冊頁似乎很清楚這些值的來源。密鑰 ID 是 SHA-1 指紋的一部分。

X.509 證書的密鑰 ID 是其 SHA-1 指紋的低 64 位。使用密鑰 ID 只是一種快捷方式,對於所有自動處理都應該使用指紋。

所有這些值都是十六進制的,該表示法允許數字以0x、 a為前綴0,或者簡單地以非零值開頭。

**注意:**使用密鑰 ID 本質上是一個壞主意,因為它們本質上是利用指紋的一部分來辨識給定的密鑰。問題在於在密鑰 ID 之間產生衝突有點微不足道。有關此問題的更多資訊,請參閱這篇文章,標題為:短密鑰 ID 是壞消息(使用 OpenPGP 和 GNU Privacy Guard)

摘抄

**總結:**我們(通過 GNU Privacy Guard 依賴 OpenPGP 的 Debian 社區)停止使用短密鑰 ID 很重要。OpenPGP 和 GPG 中沒有漏洞。但是,使用短密鑰 ID(如 0x70096AD1)從根本上講是不安全的;短密鑰 ID 很容易產生衝突。我們應該始終使用 64 位(或更長)的密鑰 ID,例如:0x37E1C17570096AD1 或 0xEC4B033C70096AD1。

**TL;DR:**這現在給出了兩個結果:gpg --recv-key 70096AD1

指紋

而指紋:

這種格式是從字元串的長度及其內容或 0x 前綴推導出來的。請注意,只有 20 字節版本的指紋可用於 gpgsm(即證書的 SHA-1 雜湊)。

使用 gpg 時,可能會附加驚嘆號 (!) 以強制使用指定的主鍵或輔助鍵,而不是嘗試計算要使用的主鍵或輔助鍵。

指定密鑰 ID 的最佳方法是使用指紋。這避免了在存在重複密鑰 ID 的情況下的任何歧義。

我建議查看標題為:公鑰指紋的維基百科頁面。它詳細說明瞭如何生成指紋。這是摘要:

摘抄

  1. 公鑰(以及可選的一些附加數據)被編碼為字節序列。為確保以後可以重新創建相同的指紋,編碼必須是確定性的,並且任何附加數據都必須與公鑰一起交換和儲存。附加數據通常是任何使用公鑰的人都應該知道的資訊。附加數據的範例包括:密鑰應與哪些協議版本一起使用(在 PGP 指紋的情況下);和密鑰持有者的名稱(在 X.509 信任錨指紋的情況下,附加數據由 X.509 自簽名證書組成)。
  2. 上一步生成的數據使用加密散列函式(例如 MD5 或 SHA-1)進行散列。
  3. 如果需要,可以截斷散列函式輸出以提供更短、更方便的指紋。

此過程產生一個短指紋,可用於驗證更大的公鑰。例如,典型的 RSA 公鑰長度為 1024 位或更長,而典型的 MD5 或 SHA-1 指紋長度僅為 128 或 160 位。

當顯示以供人工檢查時,指紋通常被編碼為十六進製字元串。然後將這些字元串格式化為字元組以提高可讀性。例如,SSH 的 128 位 MD5 指紋將顯示如下:

   43:51:43:a1:b5:fc:8b:b7:0a:3a:a9:b1:0f:66:73:a8

參考

引用自:https://unix.stackexchange.com/questions/115174