首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何获得带有gpg的ASCII装甲PGP密钥的指纹?

如何获得带有gpg的ASCII装甲PGP密钥的指纹?
EN

Unix & Linux用户
提问于 2018-09-12 20:54:35
回答 3查看 14.7K关注 0票数 11

我有一个文件secret.asc包含一个ASCII装甲(即,纯文本,以-----BEGIN PGP PRIVATE KEY BLOCK-----开头) PGP/GPG秘密/私钥,我想知道它的40个字符的密钥指纹,而不是导入到我的GPG密钥环。不幸的是,我尝试过的任何一个命令都没有把这些信息交给我。

我试过什么

在Ubuntu 16.04.5上运行了以下失败尝试,gpg版本为1.4.20,gpg2版本为2.1.11。问题中的关键仅仅是为了实验目的而创建的,不会被用于任何事情,所以我不在乎输出是否透露了太多的信息。

代码语言:javascript
运行
复制
$ gpg --with-fingerprint secret.asc
sec  2048R/161722B3 2018-09-12 
uid                            Testing 

只有短键ID,没有指纹。

代码语言:javascript
运行
复制
$ 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

错误。

代码语言:javascript
运行
复制
$ 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

错误。

代码语言:javascript
运行
复制
$ gpg2 --with-fingerprint --no-default-keyring --secret-keyring ./secret.asc --list-secret-keys
/home/jwodder/.gnupg/pubring.gpg
--------------------------------
...

这上面列出了我钥匙环里的密匙,因为某种原因。

代码语言:javascript
运行
复制
$ 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 "
: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 
gpg: key 161722B3: secret key imported
gpg: pub  2048R/161722B3 2018-09-12  Testing 
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

唯一要找到的指纹是撤销密钥的指纹。

代码语言:javascript
运行
复制
$ gpg2 --dry-run --import -vvvv secret.asc

与上面的输出相同。

代码语言:javascript
运行
复制
$ gpg --list-packets secret.asc
$ gpg2 --list-packets secret.asc

基本上输出与--dry-run --import -vvvv命令相同,只是没有gpg:行。

EN

回答 3

Unix & Linux用户

回答已采纳

发布于 2018-09-13 20:28:02

如注释中所示,最简单的解决方案似乎是首先解除密钥的护甲,然后在新文件上运行--list-secret-keys

代码语言:javascript
运行
复制
$ gpg --dearmor secret.asc  # Creates secret.asc.gpg
$ gpg --with-fingerprint --no-default-keyring --secret-keyring ./secret.asc.gpg --list-secret-keys

令人恼怒的是,虽然可以使用-o -选项将缺少装甲的键写入stdout,但无论是--secret-keyring -还是--secret-keyring /dev/stdin都不允许第二个命令从stdin读取密钥,因此将这两个命令组合为一个管道并不是一个选项。另外,使用gpg2而不是gpg运行第二个命令仍然不能提供所需的输出。

一种稍微复杂一些的方法,但似乎适用于两个版本的gpg,是将秘密密钥导入到一个临时GPG主目录中,然后列出临时主目录的私有密钥:

代码语言:javascript
运行
复制
$ mkdir -m 0700 tmphome
$ gpg --homedir tmphome --import secret.asc
$ gpg --homedir tmphome --with-fingerprint --list-secret-keys
票数 6
EN

Unix & Linux用户

发布于 2019-10-19 12:55:58

新版本的GnuPG可能会改变这种情况,因为您目前可以在一个管道中这样做:

代码语言:javascript
运行
复制
$ 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开始)。

票数 15
EN

Unix & Linux用户

发布于 2021-06-30 15:46:09

自gpg 2.2.8以来 (2018年中期发布)有一个选项--show-keys可以显示密钥而不导入它们,提供的快捷方式--import --import-options show-only

要显示文件secret.asc中的键(S):

代码语言:javascript
运行
复制
$ gpg --show-keys secret.asc

不同指纹格式:

代码语言:javascript
运行
复制
$ gpg --show-keys --with-fingerprint secret.asc
票数 3
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/468647

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档