gpg:解密失败:没有私钥。

18

没有秘钥,我无法解密我的文件。我知道这个问题以前已经有人问过,并且那里的解决方案并没有帮助到我。

以下是我的问题场景。我在使用 --decrypt 命令时,在命令提示符中收到了此错误。

gpg: decryption failed: No secret key

我手头有公钥和密码短语。 我已经使用以下命令检查是否存在秘钥。

• gpg --list-secret-keys

• gpg --list-keys

上述两个命令都返回空结果(没有错误)。因此,我决定使用 --import 导入公钥。

• gpg --import "C:\PATH\TO_MY_PUBLIC_KEY"

导入命令后,我可以看到公钥已被导入。我找不到处理秘钥的方法。有没有办法找到秘钥或创建新的秘钥?


相关链接:https://security.stackexchange.com/questions/184865/gpg-decryption-failed-no-secret-key - baptx
10个回答

20

我也从相同的两个命令中收到了空白输出:

gpg --list-secret-keys
gpg --list-keys

我有理由怀疑这与最近对~/.gnupg/pubring.kbx文件的更改有关,这促使我运行以下2个命令以重新导入丢失的密钥:

重新导入缺失的私钥:

gpg --import < ~/.gnupg/secring.gpg

重新导入丢失的公钥:

gpg --import < ~/.gnupg/pubring.gpg

在将Ubuntu从16.04升级到18.04后,我的秘钥不见了。使用这种方法重新导入对我有用。 - rwolst
~/.gnupg/secring.gpg 是空的。 - alper
我的电脑上没有secring.gpg或pubring.gpg这样的东西。这是版本问题吗? - don bright

9

如果您的pinentry程序没有正常工作,gpg将无法获取解密密钥的密码,也可能出现此错误消息。我遇到过几次这种情况。如果出现这种情况,gpg -d -v会似乎选择了正确的密钥,然后就会在放弃前一直挂起一段时间。这是它等待pinentry却从未返回。

具体步骤取决于您的特定环境,但检查(或创建)~/.gnupg/gpg-agent.conf中的pinentry-program选项是一个很好的开始。在我的情况下(使用Homebrew安装的gpgpinentry-mac的OS X),我不得不创建以下内容的文件:

pinentry-program /usr/local/bin/pinentry-mac

然后运行gpgconf --kill gpg-agent重新加载配置(gpg-agent应该会自动重启)。

您可能需要根据您喜欢的pinentry程序来调整上面的路径。locate pinentry可以帮助您找到已安装的选项,或者which your-pinentry-program-here将告诉您完整路径(如果您已知道名称)。


2
我是一位macOS Big Sur用户,同时也使用Homebrew。对于上述内容,我完全不知所措。我猜可能是通过Homebrew升级了gpg,但完全忘记检查gpg-agent配置是否需要更改...无论如何,我都不知道在哪里以及如何进行更改。谢谢! - Gwyneth Llewelyn
1
谢谢。在我运行 GPG(通过 pass)的上下文中,“No pinentry” 错误行被吞掉了,只留下了“没有密钥”的行,这让我认为在这台新机器上设置的密钥和 gpg.conf 中有一些微妙的问题。 - Paul Bissex
好的,因为我在笔记本电脑上通过ssh运行命令,所以我只收到了"No secret key"提示,因为"pinentry"是一个桌面弹出窗口。 前往我的实体笔记本电脑,它可以正常工作。Ubuntu 22.04。 - Rodney

5
非常简单的版本:如果没有密钥,您就无法解密。
GnuPG请求密钥(通常将其用作与私钥同义词),因此消息是使用公共/私有密钥加密的。您不能使用公共密钥解密消息,这是公共/私有密钥加密背后的基本原理。秘密密钥可以通过密码短语进行保护,这就是为什么您可能会有密码短语(尽管您错过了密钥)的原因。
如果需要解密消息,请请求私有密钥,或者要求发送方使用对称加密并与您分享密码短语。

5

我遇到了相同的错误,但是解决方案不同,在OSX上,但我认为在其他电脑上也应该类似。

gpg-agent 似乎是罪魁祸首。我意识到其中一个密钥从未弹出 pinentry 的问题。使用 gpgconf --kill gpg-agent 杀死它可以解决问题。随后需要调用的第一个程序将自动启动 gpg-agent。接着, pinentry 就会出现,并且一切都恢复正常。


2
在我的情况下,我的gpg密钥有密码,当我在具有有限宽度和高度的vscode终端中输入git-crypt unlock时,它会输出内容。
gpg: decryption failed: No secret key
git-crypt: GPG error: Failed to decrypt

但是,当我在一个完整的终端窗口上尝试相同的命令时,它能够很好地工作并提示输入密码等信息。


1
当我从远程/ssh tmux屏幕运行gpg --decrypt...命令时,我遇到了相同的问题。 - Cyril Chaboisseau

2

gpg --pinentry-mode loopback --decrypt <yourfile> 这将允许pinentry在您的屏幕上显示其提示。


1

您可以使用以下命令忽略错误:export GPG_TTY=$(tty)


0
如果您导入并信任(最终)并可以使用gpg --list-secret-keys查看密钥,但在尝试解密时却告诉您找不到密钥,则需要在解密命令中添加--batch

0

我使用对称加密和口令而非秘钥来加密文件,但是收到了相同的错误信息,但在我的情况下会发生一个更愚蠢的事情:加密包已经损坏。 如果你遇到了相同的情况,请确保加密包被正确地形成。


0
在我的情况下,系统上安装了gpg(1.x)和gpg2两个版本,而gpg 1.x不支持我的ed25519密钥。
您可以查看版本并使用grep命令查找Pubkey来确定支持哪些算法。
/usr/bin/gpg --version 
/usr/bin/gpg2 --version

如果是这种情况,请尝试使用gpg2 --list-secret-keys命令。
如果可以正常运行,请在.bashrc中添加别名,并将其链接到~/bin(用于git)。
echo "alias gpg='gpg2'" >> ~/.bashrc
ln -s /usr/bin/gpg2 $HOME/bin/gpg
. ~/.bashrc

然后,gpg --list-secret-keys 的输出不再为空。

也许这并不能解决原帖作者的问题,但希望能对其他人有所帮助。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接