是否可以导出 GPG 子密钥的公共组件?

信息安全 gnupg
2021-09-03 05:43:53

我正在尝试导出我的子密钥的公共组件,但 GPG 将给我的只是我的主密钥的公共组件。钥匙圈是这样设置的

$ gpg -K
/home/alex/.gnupg/secring.gpg
-------------------------------------------------------
sec#  4096R/4ACA8B96 2014-06-21 [expires: 2015-06-21]
uid                  Alex Jordan <alex@strugee.net>
ssb   4096R/633DBBC0 2014-06-21
ssb   4096R/93A31C56 2014-06-21
$ gpg --armor --export 93A31C56
-----BEGIN PGP PUBLIC KEY BLOCK-----
Version: GnuPG v2.0.22 (MingW32)
...
-----END PGP PUBLIC KEY BLOCK-----

输出到控制台的密钥是 4ACA8B96 的公共组件,而不是请求的密钥。是否存在阻止其工作的技术限制,或者只是 GPG 很顽固?

2个回答

RFC 4880,OpenPGP,11.1。Transferable Public Keys定义子密钥包总是在公共(主)密钥之前,因此 GnuPG 不允许单独导出它。

无论如何要这样做,导出密钥(建议使用--export-options export-minimal以减少您必须处理的数据包数量),然后使用gpgsplit它,这会将 OpenPGP 文件分解为单独的数据包。那些结尾public_subkey是你要找的。要找出哪个是正确的,请使用pgpdump [file]gpg --list-packets对于单个数据包失败,因为输入不是有效的 OpenPGP 文件)来查看它们。pgpdump应该可用于同名包中的大多数发行版。

利用 !防止 gpg 推测/获取与您的 keyid 关联的主键和辅助键alex@strugee.net

使用 gpg 时,可能会附加感叹号 (!) 以强制使用指定的主键或辅助键,而不是尝试计算要使用的主键或辅助键。 https://linux.die.net/man/1/gpg

所以获取keyid,然后只导出指定的子键(稍后通过--import在你的测试.gnupg上进行测试):

gpg --keyid-format long --with-fingerprint --list-key alex@strugee.net
gpg --export --armor --output public-key.asc 633DBBC0! # for ssb1