我可以从 PGP 签名中获取公钥吗?

信息安全 pgp
2021-08-14 02:10:31

我有一个已知消息的 PGP 签名。但是,我不确定是谁签的。

我可以仅从消息和签名中获取公钥 - 或者至少是指纹/在公钥服务器上搜索它的其他方式吗?

示例:我从这里收到此消息/签名https://futureboy.us/pgp.html

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


I vote YES on this important measure.

Alan Eliasen
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.13 (GNU/Linux)

iEYEARECAAYFAlHZCvgACgkQ5IGEtbBWdrF5HgCfc4xhT29ouAWdo1PMlyDKIfaq
pGoAoKig5sCXukrPPoKC1ZYB5CW7BzNL
=WPPL
-----END PGP SIGNATURE-----

我可以通过查看它以某种方式找到签名的人吗?

4个回答

是的。签名的格式在RFC 4880中定义。如果你解码base-64并解释数据,你会发现从位置19到26(包括)的字节是这种情况下的颁发者ID:

ID hex: E48184B5B05676B1

您的链接后面的“长密钥 ID”相匹配如果将 ID 转换为 base 64,则可以在原始签名数据中找到它,因为 18 个字节恰好平均分为 24 个 base 64 字符:

ID b64: 5IGEtbBWdrE=
Signature: iEYEARECAAYFAlHZCvgACgkQ5IGEtbBWdrF5HgCfc4xhT29ouAWdo1PMlyDKIfaq...

如果您添加-vv命令行开关,您可以从 gpg 获取所有这些信息。(这意味着更加冗长。)例如,获取有关 OpenPGP 格式消息的详细信息的最简单方法是简单地键入:

gpg -vv

然后将消息粘贴到其中(或将文件名作为参数传递。)例如,粘贴到上面的消息中会为您提供以下详细而有趣的信息:

gpg: armor: BEGIN PGP SIGNED MESSAGE
gpg: armor header: Hash: SHA1
:packet 63: length 19 - gpg control packet
gpg: armor: BEGIN PGP SIGNATURE
gpg: armor header: Version: GnuPG v1.4.13 (GNU/Linux)
:literal data packet:
    mode t (74), created 0, name="",
    raw data: unknown length
gpg: original file name=''

I vote YES on this important measure.

Alan Eliasen
:signature packet: algo 17, keyid E48184B5B05676B1
    version 4, created 1373178616, md5len 0, sigclass 0x01
    digest algo 2, begin of digest 79 1e
    hashed subpkt 2 len 4 (sig created 2013-07-07)
    subpkt 16 len 8 (issuer key ID E48184B5B05676B1)
    data: [159 bits]
    data: [160 bits]
gpg: Signature made Sun 07 Jul 2013 12:30:16 AM MDT using DSA key ID B05676B1
gpg: using PGP trust model
gpg: key 92F88CF9: accepted as trusted key
gpg: key 6C77A726: accepted as trusted key
gpg: Good signature from "Alan Eliasen (http://futureboy.homeip.net/) <eliasen@mindspring.com>"
gpg: WARNING: This key is not certified with a trusted signature!
gpg:          There is no indication that the signature belongs to the owner.
Primary key fingerprint: 402C C0D3 D527 13E3 FB7C  7103 E481 84B5 B056 76B1
gpg: textmode signature, digest algorithm SHA1

在该输出中,您可以清楚地看到 16 位十六进制数字的密钥 ID: E48184B5B05676B1

这将使您可以使用以下内容在密钥服务器中搜索签名者:

gpg --search-keys E48184B5B05676B1

顺便说一句,我写了你参考的 GPG 指南,我可以向你保证我签署了上述消息。:)

是的,我实际上可以。以 GnuPG 为例:

gpg --verify file.txt

(与上述文件)

写到最后

主键指纹:402C C0D3 D527 13E3 FB7C 7103 E481 84B5 B056 76B1

OpenPGP.js 也可以。

openpgp.cleartext.readArmored(

['-----BEGIN PGP SIGNED MESSAGE-----',
'Hash: SHA1',
'',
'',
'I vote YES on this important measure.',
'',
'Alan Eliasen',
'-----BEGIN PGP SIGNATURE-----',
'Version: GnuPG v1.4.13 (GNU/Linux)',
'',
'iEYEARECAAYFAlHZCvgACgkQ5IGEtbBWdrF5HgCfc4xhT29ouAWdo1PMlyDKIfaq',
'pGoAoKig5sCXukrPPoKC1ZYB5CW7BzNL',
'=WPPL',
'-----END PGP SIGNATURE-----']. join('\n')

).getSigningKeyIds()[0].toHex();

=>

“e48184b5b05676b1”

是的你可以。

至少您可以轻松地恢复 KeyID,并且您可以从密钥服务器中恢复公钥(如果用户曾经上传过它)。

您可以使用 pgpdump 恢复 KeyID(如果您安装它,则在本地或通过网站:http ://www.pgpdump.net/ )

例如,您发布的消息由以下人员签名:

Sub:颁发者密钥 ID(sub 16)(8 字节)密钥 ID - 0xE48184B5B05676B1

最后:http://pgp.mit.edu/pks/lookup?op=get&search=0xE48184B5B05676B1获取密钥或密钥详细信息(您也可以使用您的 gnupg 安装从命令行获取数据)