Unix gpg解密失败,没有密钥错误

Unix gpg解密失败,没有密钥错误,unix,encryption,public-key-encryption,gnupg,Unix,Encryption,Public Key Encryption,Gnupg,我有一个gpg.key文件,用作解密.dat.pgp文件的密码短语。使用以下命令在一台服务器上使用相同的.key文件成功解密加密的.data.pgp文件 cat xxx_gpg.key | /usr/bin/gpg --batch --quiet -o xxx.dat --passphrase-fd O -d xxx.dat.pgp 但是,当我将同一个密钥移动到另一个服务器xxx_gpg.key并运行上述相同的命令时,会出现以下错误- gpg: decryption failed: No se

我有一个gpg.key文件,用作解密.dat.pgp文件的密码短语。使用以下命令在一台服务器上使用相同的.key文件成功解密加密的.data.pgp文件

cat xxx_gpg.key | /usr/bin/gpg --batch --quiet -o xxx.dat --passphrase-fd O -d xxx.dat.pgp
但是,当我将同一个密钥移动到另一个服务器xxx_gpg.key并运行上述相同的命令时,会出现以下错误-

gpg: decryption failed: No secret key
编辑:

我发现
gpg--list secret keys
在它工作的服务器上返回一些数据,但没有返回其他服务器的结果


我们如何配置密钥

看起来密钥不在另一台计算机上,因此即使使用正确的密码短语(从文件读取),它也无法工作

因此,这些选项应该有效

  • 或者将密钥环复制到另一台机器上(可能只需要密钥环,但公共环是公共的)
  • 或者导出密钥,然后在另一台计算机上导入
man gpg
中的一些有用的外观选项:

--导出

从所有钥匙环(默认钥匙环和其他钥匙环)导出所有钥匙 通过选项
--keyring
)注册,或者如果至少给出了一个名称, 那些同名的。新的密钥环被写入标准输出或 带有选项
--output
的文件。与
--armor
一起使用,以 把那些钥匙寄出去

--导出密钥

与导出相同,但导出密钥

--导入

--快速导入

导入/合并键。这会将给定的密钥添加到密钥环中。禁食 版本目前只是一个同义词

也许

--keyring文件

将文件添加到钥匙圈的当前列表中。如果文件以波浪号开头 和斜杠,它们被$HOME目录替换。如果文件—— 名称不包含斜杠,假定它位于GnuPG主页中 目录(~/.gnupg)(如果未使用--homedir或$GNUPGHOME)

请注意,这将向当前列表中添加一个键环。如果意图是 要单独使用指定的钥匙圈,请将
--keyring
--no default keyring
一起使用

--密钥环文件

--keyring
相同,但用于密钥环


我刚刚在Arch Linux的gpg CLI上遇到了这个问题。我需要终止现有的“gpg代理”进程,然后一切都恢复正常(再次调用gpg命令时,新的gpg代理应该自动启动;…)

  • 编辑:如果进程无法重新加载(例如在一分钟内),请在终端中键入
    gpg agent
    ,然后重新启动

如果在安装了GPG 2.x的系统上向不同的用户加密时试图解密密码,有时也会出现此错误。但目前还没有解决办法;显然,这是由于GPG2.x中的一些设计决策。bug报告中建议的一种解决方法是在tmux或screen会话中运行解密

如果终端窗口太小,使用实用程序
pass
时会出现此错误

只要把终端窗口调高几行就行了


非常令人困惑。

遵循这个程序对我来说很有效

创建gpg密钥。
gpg--gen key--homedir/etc/salt/gpgkeys

导出公钥、密钥和机密子密钥

gpg --homedir /etc/salt/gpgkeys --export test-key > pub.key
gpg --homedir /etc/salt/gpgkeys --export-secret-keys test-key > sec.key
gpg --homedir /etc/salt/gpgkeys --export-secret-subkeys test-key > sub.key
现在使用以下命令导入关键点

gpg --import pub.key
gpg --import sec.key
gpg --import sub.key
验证是否已导入密钥

gpg --list-keys
gpg --list-secret-keys
创建一个示例文件

echo“hahaha”>a.txt

使用导入的密钥加密文件

gpg--encrypt--sign--armor--r测试密钥a.txt

要解密文件,请使用以下命令

gpg --import pub.key
gpg --import sec.key
gpg --import sub.key

gpg--decrypt a.txt.asc

我在尝试通过
su-
从不同的用户帐户解密密钥时遇到了相同的错误。(就像杰亨德伦在回答中建议的那样)

在我的例子中,发生这种情况是因为通常会启动一个图形化的
pinentry
提示,这样我就可以输入密码来解密密钥,但是
su-
ed-to-user无法访问当前运行的(图形)X-Window-System

解决方案是在同一控制台中(作为X服务器当前运行的用户)发出以下问题:

xhost+local:

允许其他本地用户访问当前运行的(local)X-Server。在那之后,出现了
pinentry
提示,我可以输入密码来解密密钥,它工作了


当然,您也可以通过
ssh
连接转发X。为此,在从一台机器迁移到另一台机器时,请查看
ssh
-X参数(客户端)和
x11正向yes
(服务器端)。

-

  • 检查两个系统之间的gpg版本和支持的算法

    gpg——版本

  • 检查两个系统上是否有钥匙

    gpg—列出键

    pub4096R/629997792020-08-04 sub4096R/0F7999972020-08-04

    gpg—列出密钥

    sec4096R/629997792020-08-04 ssb4096R/0F799972020-08-04

  • 检查另一台机器上是否存在同一对密钥ID。对于解密,只需要密钥(sec)和密钥子密钥(ssb)

    如果另一台机器上不存在密钥,请从存在密钥的机器上导出文件中的密钥,scp文件并导入缺少密钥的机器上的密钥

    不要使用相同的密码在新机器上重新创建密钥
    gpg --decrypt --pinentry-mode=loopback <file>