我有一个 GnuPG 密钥对,带有主密钥(仅证明功能)和 3 个子键(符号,加密和认证功能)。实际上,当我启动时,我只有子密钥的私钥(我有一个存根,标记为#
,而不是主私钥)
我做如下:
- 我列出了私钥(
gpg --list-secret-keys
)。有一个主密钥存根(#
)和三个子密钥。 - 我用公开加密消息加密子密钥 (
gpg -e USER
) - 我解密该消息(
gpg -d
):好的。 - 我删除了三个子密钥(
gpg --edit-key
)。gpg --delete-secret-keys
对主密钥(它只是一个存根)和子密钥都不起作用。 - 我删除了公共主密钥(
gpg --delete-keys
) - 我尝试解密第 2 步中的消息:无法解密,没有私钥,好的。我列出了私钥
gpg --list-secret-keys
:没有密钥 - 我杀死 gpg-agent (
killall gpg-agent
) - 我进口民众再次从密钥服务器获取密钥 (
gpg --receive-keys
) gpg --list-secret-keys
我尝试解密第 2 步中的消息,令人惊讶的是,我能够通过输入保护私有子密钥的密码来解密它!如果我再次执行,私钥就在那里。
我猜我没有正确删除私有子密钥,我猜用该gpg --edit-key
命令我只删除了公共子密钥。但如果没有主密钥(它只是一个存根),我该如何删除私有子密钥?
再次导入秘密主密钥后,我可以通过执行删除主私钥及其三个子密钥gpg --delete-secret-key
。这是我唯一的选择吗?如果主密钥只是一个存根,那么是否不可能删除秘密子密钥?
答案1
对于 GnuPG 2.1+,密钥存储在 gpg-agent 中,仅由主密钥环引用。
再次重新导入公共子密钥,然后运行gpg --list-secret-keys --with-keygrip
。这将显示属于每个子密钥的原始非对称密钥的“指纹”(不要将其与包含元数据和所有内容的整个 PGP 子密钥的指纹混淆)。
对于要删除的每个子项,运行:
gpg-connect-agent "delete_key <keygrip>" /bye