如何使用 GnuPG 查询所有接收者的 OpenPGP 密钥?

如何使用 GnuPG 查询所有接收者的 OpenPGP 密钥?

我找不到可靠的方法来获取gpg用于加密给定文件的(公共)密钥列表。合理的解决方案对我来说不起作用——它从不列出我的钥匙:

gpg --list-only --no-default-keyring --secret-keyring /dev/null $testfile

我从中得出的另一种解决方案此主题是多步骤的,并且毫无疑问有一些特殊情况会显示它的脆弱性:

(gpg -vv --list-only $testfile  2>&1 | grep 'gpg: public key' | awk '{print $NF}' | xargs -L1 gpg --list-keys --with-colons) | egrep '^pub' | awk -F: '{print $5}'

经过进一步挖掘,我发现了另一种潜在的选择,即以一种gpg随着时间的推移无疑会变得脆弱的方式进行欺骗:

gpg --dry-run --pinentry-mode cancel --output /dev/null "$testfile" 2>&1

有谁有比这些更好的解决方案吗?
有谁知道为什么显而易见的--list-only选择没有起到“正确”的作用?

如果有关系,请gpg (GnuPG) 2.1.10在 Mac OS X 和gpgv (GnuPG) 2.0.26Debian(Jessie)上使用。

答案1

最安全的方法可能是列出 OpenPGP 数据包。您可以使用 GnuPG 的--list-packets命令,也可以使用单独的工具pgpdump。您只会获得子密钥;加密消息中未引用主密钥。如果您想查询主密钥,则必须通过本地密钥环(如果缺少,则通过密钥服务器)单独解析它们。

对于加密到我的两个子密钥的文档,输出如下所示(--list-only添加以便 GnuPG 不会查询密码(如果可用)):

$ gpg2 --list-only --list-packets < encrypted.gpg
# off=0 ctb=85 tag=1 hlen=3 plen=524
:pubkey enc packet: version 3, algo 1, keyid CC73B287A4388025
    data: [4090 bits]
# off=527 ctb=85 tag=1 hlen=3 plen=268
:pubkey enc packet: version 3, algo 1, keyid 5C88F5D83E2554DF
    data: [2048 bits]
# off=798 ctb=d2 tag=18 hlen=2 plen=63 new-ctb
:encrypted data packet:
    length: 63
    mdc_method: 2

这将列出所有(已知)收件人。如果使用隐藏收件人,显然这是不可能的:

# off=0 ctb=85 tag=1 hlen=3 plen=524
:pubkey enc packet: version 3, algo 1, keyid 0000000000000000
    data: [4093 bits]

类似输出pgpdump

Old: Public-Key Encrypted Session Key Packet(tag 1)(524 bytes)
    New version(3)
    Key ID - 0x0000000000000000
    Pub alg - RSA Encrypt or Sign(pub 1)
    RSA m^e mod n(4096 bits) - ...
        -> m = sym alg(1 byte) + checksum(2 bytes) + PKCS-1 block type 02
Old: Public-Key Encrypted Session Key Packet(tag 1)(268 bytes)
    New version(3)
    Key ID - 0x5C88F5D83E2554DF
    Pub alg - RSA Encrypt or Sign(pub 1)
    RSA m^e mod n(2047 bits) - ...
        -> m = sym alg(1 byte) + checksum(2 bytes) + PKCS-1 block type 02
New: Symmetrically Encrypted and MDC Packet(tag 18)(63 bytes)
    Ver 1
    Encrypted data [sym alg is specified in pub-key encrypted session key]
        (plain text + MDC SHA1(20 bytes))

遗憾的是,它们都没有明确定义、稳定的输出。GnuPG 的--with-colon选项不适用于转储数据包。


GnuPG 仅打印其他的密钥,而不是您自己的密钥(如果没有--list-only,它将尝试使用密钥代替)。这是否是预期的和可取的行为可能存在争议,传递一个-v/--verbose似乎足以列出您自己的密钥。

您第一次尝试“隐藏”密钥时遇到的问题在于语句的问题--no-default-keyring。来自man gpg2

--no-default-keyring

不要将默认密钥环添加到密钥环列表中。请注意,如果没有任何密钥环,GnuPG 将无法运行,因此如果您使用此选项并且不通过--keyring或提供备用密钥环--secret-keyring,则 GnuPG 仍将使用默认的公共或秘密密钥环。

基努总是读取公钥环。仅传递不可读/空的密钥环是不够的,只传递公钥环就可以了:

gpg2 --no-default-keyring --keyring /dev/null --list-only

相关内容