我找不到可靠的方法来获取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.26
Debian(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