验证签名中没有密钥公钥的数字签名

信息安全 公钥基础设施 电子签名
2021-09-12 03:42:52

接收电子邮件时,我有时会看到以下内容:

-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1

I found an integer overflow in PHP, in the conversation of dates to "Julian Day Count" function.

The commit, with a PoC can be found here: https://github.com/MegaManSec/php-src/commit/a538d2f5605798422f2746636 ecdc300f8ebcaa1
Use CVE-2015-1353.

CVE assignment team, MITRE CVE Numbering Authority M/S M300 202 Burlington
Road, Bedford, MA 01730 USA [ PGP key available through
http://cve.mitre.org/cve/request_id.html ]

-----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.14 (SunOS)

iQEcBAEBAgAGBQJUw/LpAAoJEKllVAevmvmsiYoH/Ag+n/8x+blfJyccUhjt39bp
nRxsuZw2MIx7COJcoufIxeycu2YGnm1O9RxZBA9lKmVYjb0wjMi9yHogcWkT8UOo 
i93ARMw7V6UFp1nV+2Kv5BgVh2EcwEBXyDkKkcaN2l68Dm3nRoApMB4i4m7G67BC 
K2T1L4eq1orQCNaR7n4hup2155pHZbLqZQRMAYn5EGQPr/+zPjgq+PQKes631US5 
SXrnthRKOAfZk9QVIlxf5t1JfVvC3Cta0HgETTaXJ8TbqEAA5AXw8hl+RmhWgFnI 
Cto73LM+iiA1tyxDXdXnfdRqV/uxmqK+FCgO6asyCuT7EYOpBZ74Wmq1z+RVJRc=
=VLR4 
-----END PGP SIGNATURE-----

据我了解,数字签名的工作方式如下:

  1. 消息的内容被散列以提供整个内容的固定长度输出。
  2. 然后使用发件人私钥对生成的哈希进行加密(PS:我认为公钥用于加密事物,不同的上下文?)
  3. 上述过程创建了一个数字签名,该签名与原始消息一起传输
  4. 接收方使用公钥解密密文以返回哈希值,然后自行对消息进行哈希处理以查看是否相同

我无法理解的问题是公钥部分,在上面来自 Mitre 的示例中,没有发送公钥让我解密签名。那么我该如何去验证这个签名呢?我可以看到他们提供了一个链接“PGP key available throught”,但这个链接包含密钥 ID。这个密钥 ID 是什么,我需要它来查找公钥吗?

2个回答

查找 CVE 的 PGP/KEY

本文介绍了如何搜索 GPG 密钥,特别是 CVE 站点的公钥。那里有关于如何导入它的说明,我在下面提供了基本的导入说明。

典型 GPG/PGP

在 PGP/GPG 中,当用户生成密钥时,还有一个与之关联的密钥 ID。您会注意到,在您提供的链接中,指纹的最后 4 个字节也是密钥 ID

通常,用户会将他们的公钥上传到密钥服务器。密钥 ID是密钥服务器用于在其数据库中查找密钥的内容其他用户可以在密钥服务器中搜索与他们尝试解密或验证的数据相关联的密钥 ID。GPG 使用您的钥匙串来执行其所有操作。在 Linux 机器上,您可以安装 GPG。

德比安:

sudo apt-get install pgpgpg

然后,您可以使用来自密钥服务器的给定密钥 ID将密钥导入您的钥匙串

gpg --recv-keys 0x<key_id> --keyserver 'http://key-server.org'

或者,如果您有密钥文件:

gpg --import <keyfile>

有几种方法可以签署文件。一种方法是创建分离的签名文件。在这种情况下,您可以执行以下操作:

gpg --verify file-1.2.3.tar.sig file-1.2.3.tar

但是,在您的情况下,您在同一个文件中同时拥有消息和签名。你可以说出来,因为你拥有两者-----BEGIN PGP SIGNED MESSAGE-----,并且-----BEGIN PGP SIGNATURE-----在信息中。在这种情况下,您只需执行以下操作

gpg --output your-file.txt --decrypt my-file.gpg


对于这些验证命令中的每一个,GPG 将尝试在您的钥匙串中查找用于签署消息的密钥。如果找不到它,它将打印一条错误消息。

您提到您在电子邮件中看到了这一点。如果您使用的是 Thunderbird,有一个名为Enigmail的扩展程序可以让您设置密钥服务器、导入 GPG/PGP 密钥以及加密/解密/验证电子邮件签名。


要回答您关于公钥和私钥如何关联的问题,我会在此处阅读 Thomas Pornin 的回答

我对 pgp 或 gpg 没有太多了解,但我可以告诉你这将如何与简单的 rsa 一起工作。

如果你想签署你用你的私钥加密的东西,任何得到这个消息的人都可以用你的公钥解密它,因此知道有私钥的人已经发送了这个消息(希望只有你有私钥)。

如果两者都有 rsa 密钥,您可以使用您的私钥对其进行加密,然后使用您要向其发送消息的人的公钥对其进行加密。然后接收者相应地解密消息,您将收到一条只有一个人可以打开并且只有一个人可以发送的消息。

据我了解 pgp 和 gpg 他们用密钥对消息进行哈希处理,然后用 RSA 加密这个密钥。

对于您的密钥问题:有公钥服务器(例如 MIT:https ://pgp.mit.edu/ )