我是 pgp 的新手并试图了解它是如何工作的。
这里列出了 nginx 的签名密钥:https : //nginx.org/keys/nginx_signing.key
它的指纹是:573B FD6B 3D8F BC64 1079 A6AB ABF5 BD82 7BD9 BF62
如果我在pgp.mit.edu上搜索 nginx 的密钥,我会得到一个外观不同的 ascii 密钥,其指纹与上面的相同。
尽管密钥相同,为什么“公钥块”部分不同?
我是 pgp 的新手并试图了解它是如何工作的。
这里列出了 nginx 的签名密钥:https : //nginx.org/keys/nginx_signing.key
它的指纹是:573B FD6B 3D8F BC64 1079 A6AB ABF5 BD82 7BD9 BF62
如果我在pgp.mit.edu上搜索 nginx 的密钥,我会得到一个外观不同的 ascii 密钥,其指纹与上面的相同。
尽管密钥相同,为什么“公钥块”部分不同?
密钥的指纹是根据其相关部分计算的,以确保您拥有正确的公钥。
但是 PGP 公钥可以包含比这更多的信息;例如,它可以包含肖像图像,可以包含信任您的密钥的人的签名、他们的电子邮件地址等。这些元素的顺序可能会在不改变指纹的情况下改变,并且密钥是否包含图像不会改变指纹,因为肖像或这些元素的存储顺序与验证密钥无关。
所以很可能keyserver改变了key的一些不相关的部分;所以你得到另一个密钥块,但指纹相同。
想象一下,有人在密钥服务器上弄乱了 Bob 的密钥,以更改其中包含的肖像图片。指纹将保持不变,因为即使使用错误的肖像,如果 Alice 使用密钥加密给 Bob 的消息,它仍然只能由 Bob 的私钥解密。
但是,如果 Malory 不理会 Bob 的肖像,而是用他自己的替换公钥的模数和指数,这将改变指纹,而且正确的是:它不再是 Bob 的密钥,并且用它加密某些东西会让 Malory 访问它通过 Malory 的私钥。
我们可以在公钥的所有元素上构建指纹,例如包括所有签名和关于密钥所有者的其他个人信息,但如果它是这样工作的,那么每次你更新密钥中的一些琐碎信息,或者有人添加另一个签名,你的钥匙指纹会改变,你必须向所有人解释,不,你的钥匙没有被黑,你只是放了一个新的肖像图像,让你的微笑更加容光焕发。
GPG 密钥块不是单个密钥值,而是由多个不同类型的数据包组成,遵循OpenPGP 消息格式。
在您的情况下,两个块都包含相同的公钥和用户 ID数据包,但第二个密钥列出了一些额外的签名数据包。
您可以使用gpg(1)with--list-packets来枚举它们,如下所示:
$ gpg --list-packets nginx_signing.key
# off=0 ctb=99 标签=6 hlen=3 plen=269
:公钥包:
版本 4,算法 1,创建 1313747554,过期 0
pkey[0]:[2048 位]
pkey[1]:[17 位]
密钥ID:ABF5BD827BD9BF62
# off=272 ctb=b4 标签=13 hlen=2 plen=41
:user ID packet: "nginx 签名密钥"
# off=315 ctb=89 标签=2 hlen=3 plen=318
:签名包:算法1,keyid ABF5BD827BD9BF62
版本 4,创建 1466086904,md5len 0,sigclass 0x13
摘要算法 2,摘要 5a 1a 的开始
散列 subpkt 27 len 1(关键标志:03)
散列 subpkt 11 len 5 (pref-sym-algos: 9 8 7 3 2)
散列 subpkt 21 len 5 (pref-hash-algos: 8 2 9 10 11)
散列 subpkt 22 len 3 (pref-zip-algos: 2 3 1)
散列 subpkt 30 len 1(特征:01)
散列 subpkt 23 len 1(密钥服务器首选项:80)
散列 subpkt 2 len 4(创建于 2016 年 6 月 16 日的签名)
散列 subpkt 9 len 4(密钥在 12y303d4h27m 后过期)
subpkt 16 len 8(颁发者密钥 ID ABF5BD827BD9BF62)
数据:[2047 位]
# off=636 ctb=89 tag=2 hlen=3 plen=284
:签名包:算法1,keyid A64FD5B17ADB39A8
版本 4,创建 1313752997,md5len 0,sigclass 0x10
摘要算法 2,摘要 ef da 的开始
散列 subpkt 2 len 4 (sig 创建于 2011-08-19)
subpkt 16 len 8(颁发者密钥 ID A64FD5B17ADB39A8)
数据:[2047 位]
# off=923 ctb=88 标签=2 hlen=2 plen=70
:签名包:算法 17,keyid ECF0E90B2C172083
版本 4,创建 1313758162,md5len 0,sigclass 0x10
摘要算法 2,摘要 51 的开头是
散列 subpkt 2 len 4 (sig 创建于 2011-08-19)
subpkt 16 len 8(颁发者密钥 ID ECF0E90B2C172083)
数据:[160 位]
数据:[158 位]
# off=995 ctb=88 标签=2 hlen=2 plen=70
:签名包:算法 17,keyid A9376139A524C53E
版本 4,创建 1313759073,md5len 0,sigclass 0x10
摘要算法 2,摘要 73 56 的开头
散列 subpkt 2 len 4 (sig 创建于 2011-08-19)
subpkt 16 len 8(颁发者密钥 ID A9376139A524C53E)
数据:[159 位]
数据:[156 位]
现在再次使用来自的密钥pgp.mit.edu:
$ gpg --list-packets nginx_signing2.key
# off=0 ctb=99 标签=6 hlen=3 plen=269
:公钥包:
版本 4,算法 1,创建 1313747554,过期 0
pkey[0]:[2048 位]
pkey[1]:[17 位]
密钥ID:ABF5BD827BD9BF62
# off=272 ctb=b4 标签=13 hlen=2 plen=41
:user ID packet: "nginx 签名密钥"
# off=315 ctb=88 tag=2 hlen=2 plen=70
:签名包:算法 17,keyid ECF0E90B2C172083
版本 4,创建 1313758162,md5len 0,sigclass 0x10
摘要算法 2,摘要 51 的开头是
散列 subpkt 2 len 4 (sig 创建于 2011-08-19)
subpkt 16 len 8(颁发者密钥 ID ECF0E90B2C172083)
数据:[160 位]
数据:[158 位]
# off=387 ctb=88 tag=2 hlen=2 plen=70
:签名包:算法 17,keyid A9376139A524C53E
版本 4,创建 1313759073,md5len 0,sigclass 0x10
摘要算法 2,摘要 73 56 的开头
散列 subpkt 2 len 4 (sig 创建于 2011-08-19)
subpkt 16 len 8(颁发者密钥 ID A9376139A524C53E)
数据:[159 位]
数据:[156 位]
# off=459 ctb=88 tag=2 hlen=2 plen=70
:签名包:算法 17,keyid E3F93C24A0AF822A
版本 4,创建 1393414117,md5len 0,sigclass 0x10
摘要算法 10,摘要 b2 d5 的开始
散列 subpkt 2 len 4 (sig 创建于 2014-02-26)
subpkt 16 len 8(颁发者密钥 ID E3F93C24A0AF822A)
数据:[159 位]
数据:[160 位]
# off=531 ctb=88 tag=2 hlen=2 plen=94
:签名包:算法 17,keyid 6B76D872E5287DB2
版本 4,创建 1453519845,md5len 0,sigclass 0x10
摘要算法8,摘要ff c0的开始
散列 subpkt 2 len 4(创建于 2016 年 1 月 23 日的签名)
subpkt 16 len 8(颁发者密钥 ID 6B76D872E5287DB2)
数据:[254 位]
数据:[255 位]
# off=627 ctb=89 tag=2 hlen=3 plen=284
:签名包:算法1,keyid A64FD5B17ADB39A8
版本 4,创建 1313752997,md5len 0,sigclass 0x10
摘要算法 2,摘要 ef da 的开始
散列 subpkt 2 len 4 (sig 创建于 2011-08-19)
subpkt 16 len 8(颁发者密钥 ID A64FD5B17ADB39A8)
数据:[2047 位]
# off=914 ctb=89 tag=2 hlen=3 plen=284
:签名包:算法1,keyid 676B7CC30978D14B
版本 4,创建 1387022054,md5len 0,sigclass 0x10
摘要算法 2,摘要 58 70 的开头
散列 subpkt 2 len 4(创建于 2013 年 12 月 14 日的签名)
subpkt 16 len 8(颁发者密钥 ID 676B7CC30978D14B)
数据:[2046 位]
# off=1201 ctb=89 标签=2 hlen=3 plen=284
:签名包:算法1,keyid 63563037DB85C154
版本 4,创建 1477007959,md5len 0,sigclass 0x10
摘要算法 10,摘要 cf 83 的开头
散列 subpkt 2 len 4(创建于 2016 年 10 月 20 日的签名)
subpkt 16 len 8(颁发者密钥 ID 63563037DB85C154)
数据:[2047 位]
# off=1488 ctb=89 标签=2 hlen=3 plen=318
:签名包:算法1,keyid ABF5BD827BD9BF62
版本 4,创建 1466086904,md5len 0,sigclass 0x13
摘要算法 2,摘要 5a 1a 的开始
散列 subpkt 27 len 1(关键标志:03)
散列 subpkt 11 len 5 (pref-sym-algos: 9 8 7 3 2)
散列 subpkt 21 len 5 (pref-hash-algos: 8 2 9 10 11)
散列 subpkt 22 len 3 (pref-zip-algos: 2 3 1)
散列 subpkt 30 len 1(特征:01)
散列 subpkt 23 len 1(密钥服务器首选项:80)
散列 subpkt 2 len 4(创建于 2016 年 6 月 16 日的签名)
散列 subpkt 9 len 4(密钥在 12y303d4h27m 后过期)
subpkt 16 len 8(颁发者密钥 ID ABF5BD827BD9BF62)
数据:[2047 位]
# off=1809 ctb=89 tag=2 hlen=3 plen=318
:签名包:算法1,keyid ABF5BD827BD9BF62
版本 4,创建 1313747554,md5len 0,sigclass 0x13
摘要算法 2,摘要 9b e3 的开头
散列 subpkt 2 len 4 (sig 创建于 2011-08-19)
散列 subpkt 27 len 1(关键标志:03)
散列 subpkt 9 len 4(密钥在 5y0d0h0m 后过期)
散列 subpkt 11 len 5 (pref-sym-algos: 9 8 7 3 2)
散列 subpkt 21 len 5 (pref-hash-algos: 8 2 9 10 11)
散列 subpkt 22 len 3 (pref-zip-algos: 2 3 1)
散列 subpkt 30 len 1(特征:01)
散列 subpkt 23 len 1(密钥服务器首选项:80)
subpkt 16 len 8(颁发者密钥 ID ABF5BD827BD9BF62)
数据:[2047 位]
# off=2130 ctb=89 标签=2 hlen=3 plen=540
:签名包:算法1,keyid EB17F674C79A40A2
版本 4,创建 1453812587,md5len 0,sigclass 0x10
摘要算法 2,摘要 d6 ea 的开始
散列 subpkt 2 len 4(创建于 2016 年 1 月 26 日的签名)
subpkt 16 len 8(颁发者密钥 ID EB17F674C79A40A2)
数据:[4096 位]
# off=2673 ctb=89 标签=2 hlen=3 plen=540
:签名包:算法1,keyid 6D688C7C498BF352
版本 4,创建 1474279425,md5len 0,sigclass 0x10
摘要算法 8,摘要 b5 32 的开头
散列 subpkt 2 len 4(创建于 2016 年 9 月 19 日的签名)
subpkt 16 len 8(颁发者密钥 ID 6D688C7C498BF352)
数据:[4096 位]
# off=3216 ctb=89 tag=2 hlen=3 plen=540
:签名包:算法1,keyid 6D688C7C498BF352
版本 4,创建 1474423494,md5len 0,sigclass 0x10
摘要算法 8,摘要 f1 d9 的开始
散列 subpkt 2 len 4(创建于 2016 年 9 月 21 日的签名)
subpkt 16 len 8(颁发者密钥 ID 6D688C7C498BF352)
数据:[4096 位]
# off=3759 ctb=89 tag=2 hlen=3 plen=540
:签名包:算法1,keyid 1465F6CF06C1F0CD
版本 4,创建 1471971424,md5len 0,sigclass 0x10
摘要算法 10,摘要 d7 b0 的开始
散列 subpkt 2 len 4 (sig 创建于 2016-08-23)
subpkt 16 len 8(颁发者密钥 ID 1465F6CF06C1F0CD)
数据:[4095 位]
# off=4302 ctb=89 标签=2 hlen=3 plen=540
:签名包:算法1,keyid A22AE4EB4329C545
版本 4,创建 1381544106,md5len 0,sigclass 0x12
摘要算法 2,摘要 0a 50 的开头
散列 subpkt 2 len 4 (sig 创建于 2013-10-12)
subpkt 16 len 8(颁发者密钥 ID A22AE4EB4329C545)
数据:[4096 位]
如您所见,两个块的公钥数据包具有相同的密钥 id ( ABF5BD827BD9BF62)。大小的差异是由不同的签名包造成的,而公钥本身是相同的。
指纹是实际的公钥参数(即 RSA 模数和类似的东西)。但是,密钥 blob 包含的数据要多得多;它具有可以在密钥上更改的用户身份(姓名、电子邮件等),并且(不匹配的更常见原因)它具有其他人的签名。签名不会影响用于加密或验证签名的密钥部分,但它们会更改密钥 blob 的内容。
如果您好奇,密钥 blob 基本上只是 base64 编码的证书(我不确定实际的解码格式是什么,像 ASN1 这样的二进制文件,但您可以在其中看到名称和电子邮件地址等内容的 ASCII 文本) .