客户端 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,} 密钥。