如何使用 gpg 獲取 ASCII 鎧裝 PGP 密鑰的指紋?
我有一個
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
)。