Gpg

如何使用 gpg 獲取 ASCII 鎧裝 PGP 密鑰的指紋?

  • June 30, 2021

我有一個secret.asc包含 ASCII 鎧裝(即純文字並以 開頭-----BEGIN PGP PRIVATE KEY BLOCK-----)PGP/GPG 密鑰/私鑰的文件,我想知道它的 40 個字元的密鑰指紋而不將其導入我的 GPG 密鑰環。不幸的是,我嘗試過的任何命令都沒有將這些資訊交給我。

我試過的

以下失敗的嘗試是在 gpg 版本 1.4.20 和 gpg2 版本 2.1.11 的 Ubuntu Xenial 16.04.5 上執行的。有問題的密鑰是僅為實驗目的而創建的,不會用於任何事情,所以我不在乎輸出是否透露了太多關於它的資訊。

$ gpg --with-fingerprint secret.asc
sec  2048R/161722B3 2018-09-12 
uid                            Testing <testing@testing.nil>

只有短鍵ID,沒有指紋。

$ gpg2 --with-fingerprint secret.asc
gpg: DBG: FIXME: merging secret key blocks is not anymore available
gpg: DBG: FIXME: No way to print secret key packets here

錯誤。

$ gpg --with-fingerprint --no-default-keyring --secret-keyring ./secret.asc --list-secret-keys
gpg: [don't know]: invalid packet (ctb=2d)
gpg: keydb_search_first failed: invalid packet

錯誤。

$ gpg2 --with-fingerprint --no-default-keyring --secret-keyring ./secret.asc --list-secret-keys
/home/jwodder/.gnupg/pubring.gpg
--------------------------------
...

由於某種原因,這列出了我的密鑰環中的密鑰。

$ gpg --dry-run --import -vvvv secret.asc
gpg: using character set `utf-8'
gpg: armor: BEGIN PGP PRIVATE KEY BLOCK
gpg: armor header: Version: GnuPG v1
:secret key packet:
       version 4, algo 1, created 1536783228, expires 0
       skey[0]: [2048 bits]
       skey[1]: [17 bits]
       skey[2]: [2047 bits]
       skey[3]: [1024 bits]
       skey[4]: [1024 bits]
       skey[5]: [1021 bits]
       checksum: 386f
       keyid: 07C0845B161722B3
:signature packet: algo 1, keyid 07C0845B161722B3
       version 4, created 1536783228, md5len 0, sigclass 0x1f
       digest algo 2, begin of digest b6 12
       hashed subpkt 2 len 4 (sig created 2018-09-12)
       hashed subpkt 12 len 22 (revocation key: c=80 a=1 f=9F3C2033494B382BEF691BB403BB6744793721A3)
       hashed subpkt 7 len 1 (not revocable)
       subpkt 16 len 8 (issuer key ID 07C0845B161722B3)
       data: [2048 bits]
:user ID packet: "Testing <testing@testing.nil>"
:signature packet: algo 1, keyid 07C0845B161722B3
       version 4, created 1536783228, md5len 0, sigclass 0x13
       digest algo 2, begin of digest 33 ee
       hashed subpkt 2 len 4 (sig created 2018-09-12)
       hashed subpkt 27 len 1 (key flags: 03)
       hashed subpkt 9 len 4 (key expires after 32d3h46m)
       hashed subpkt 11 len 5 (pref-sym-algos: 9 8 7 3 2)
       hashed subpkt 21 len 5 (pref-hash-algos: 8 2 9 10 11)
       hashed subpkt 22 len 3 (pref-zip-algos: 2 3 1)
       hashed subpkt 30 len 1 (features: 01)
       hashed subpkt 23 len 1 (key server preferences: 80)
       subpkt 16 len 8 (issuer key ID 07C0845B161722B3)
       data: [2046 bits]
gpg: sec  2048R/161722B3 2018-09-12   Testing <testing@testing.nil>
gpg: key 161722B3: secret key imported
gpg: pub  2048R/161722B3 2018-09-12  Testing <testing@testing.nil>
gpg: writing to `/home/jwodder/.gnupg/pubring.gpg'
gpg: using PGP trust model
gpg: key 793721A3: accepted as trusted key
gpg: key 161722B3: public key "[User ID not found]" imported
gpg: Total number processed: 1
gpg:               imported: 1  (RSA: 1)
gpg:       secret keys read: 1
gpg:   secret keys imported: 1

唯一可以找到的指紋是撤銷密鑰的指紋。

$ gpg2 --dry-run --import -vvvv secret.asc

與上面相同的輸出。

$ gpg --list-packets secret.asc
$ gpg2 --list-packets secret.asc

基本上與命令的輸出相同--dry-run --import -vvvv,只是沒有gpg:行。

如評論中所示,最簡單的解決方案似乎是首先對密鑰進行加密,然後--list-secret-keys在新文件上執行:

$ gpg --dearmor secret.asc  # Creates secret.asc.gpg
$ gpg --with-fingerprint --no-default-keyring --secret-keyring ./secret.asc.gpg --list-secret-keys

-o -令人討厭的是,雖然可以使用該選項將 dearmored 密鑰寫入標準輸出,但--secret-keyring ---secret-keyring /dev/stdin不允許第二個命令從標準輸入讀取密鑰,因此將兩個命令與管道組合成一個不是一種選擇。gpg2此外,使用而不是執行第二個命令gpg仍然無法提供所需的輸出。

一種稍微複雜一點的方法,但似乎適用於兩個版本的方法gpg是將密鑰導入臨時 GPG 主目錄,然後列出臨時主目錄的私鑰:

$ mkdir -m 0700 tmphome
$ gpg --homedir tmphome --import secret.asc
$ gpg --homedir tmphome --with-fingerprint --list-secret-keys

這可能隨著 GnuPG 的新版本而改變,因為您目前可以在一個管道中執行此操作:

$ gpg --with-colons --import-options show-only --import --fingerprint < secret.asc | awk -F: '$1 == "fpr" {print $10;}'

主要的遊戲改變者是import-options啟用假進口的選項。我們只是使用文件,因為它會被導入,但它不是。

選項--with-colons保證我們在上一部分中使用的穩定機器可解析的格式。awk

awk只需從指紋行開始列印第 10 列(以 開頭fpr)。

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