gpg 加密:使用确认密钥和准确命令进行解密时出现错误,与过去成功传输的情况相同

gpg 加密:使用确认密钥和准确命令进行解密时出现错误,与过去成功传输的情况相同

客户端 A 通常使用公钥加密文件,并将其发送给拥有相应私钥的客户端 B 来解密该文件。

我的团队将接管客户 A 的职责,他们向我提供了公钥(通过电子邮件发送了未防护的文件PUB_KEY.asc),我已成功导入该公钥并可以在我的密钥环上看到:

gpg --list-keys

pub   1024R/21FG3F01 2008-11-05
uid                  PUB_KEY
sub   1024R/3287SBN9 2008-11-05

我用以下命令加密了文件与客户端 A 完全相同的命令并将其发送给客户端B,但他们解密失败:

gpg --output file.txt.gpg -e -r PUB_KEY file.txt

客户端 B 收到以下解密错误:1080:找不到用于解密的私钥(虽然他们确实拥有私钥)。

他们提到可能签署密钥,所以我尝试使用签署公钥,gpg --sign-key PUB_KEY但收到以下错误:

pub  1024R/21FG3F01  created: 2008-11-05  expires: never       usage: SC
                     trust: unknown       validity: unknown
sub  1024R/3287SBN9  created: 2008-11-05  expires: never       usage: E
[ unknown] (1). PUB_KEY

gpg: no default secret key: No secret key

为什么我需要密钥来签署公钥?当我确实使用正确的公钥时,什么可能导致客户端 B 无法解密文件?

答案1

您的第一个问题(“为什么我需要密钥来签署公钥?”)很简单:这就是公钥加密的工作原理。签署某些内容(密钥、文档等)需要使用您的私钥,并且可以使用您的公钥进行验证。加密使用您的公钥,并且可以使用您的私钥解密。

你的第二个问题涉及更多。您签署或不签署密钥并不重要 - 签名只会防止有关密钥不可信的警告;它是 PGP/GPG 所建立的信任网络的重要组成部分。但是,如果您已经在信任网络之外验证了密钥的正确性(例如,通过直接从接收者处接收密钥),那么您可以忽略信任网络。所以不需要签名。

我猜测正在发生的情况是,您使用的是-r完整密钥指纹之外的参数,并且您不小心加密了错误的收件人。您应该使用完整的指纹(例如,067E3C456BAE240ACEE88F6FEF0F382A1A7B6500而不是短指纹EF0F382A1A7B6500,当然也不是非常短的指纹1A7B6500)。

我能想到的唯一的另一件事是您正在使用(可能不知道)解密方不支持的某种算法。例如,如果您使用的 gnupg 版本比收件人新得多。或者收件人正在使用其他程序。接收者的密钥指定程序支持的内容是正常的,但该特定密钥可能不支持或者是错误的。 GPG 具有覆盖选项(请参阅“互操作性”下的联机帮助页,但是--pgp8--pgp7--pgp6值得尝试)。

答案2

gnupg 报告在失败之前解密文件所需的密钥,因为它包含在加密消息的标头中。例如:

‰ gpg -d test
gpg: encrypted with 4096-bit RSA key, ID 0xF38153E276D54749, created 2011-09-23
      "Greg Kroah-Hartman (Linux kernel stable release signing key) <[email protected]>"
gpg: decryption failed: No secret key

gpg --list-secret-keys消息中提供的密钥是否与客户端 B 上输出中的任何密钥相对应?看起来您可能收到了错误的公钥,或者客户端 B 删除了相关的秘密 {sub,} 密钥。

相关内容