原始问题
我一直在学习 GPG 和子密钥的使用。我觉得我已经很好地理解了使用子密钥和保持主密钥离线的好处,但缺乏关于应该发布哪些密钥的信息。我的问题:
我应该发布哪些密钥?
我应该发布我的主密钥、子密钥还是全部?每种方法的优缺点是什么?
我的朋友应该签署哪些钥匙?
如果我的朋友将我添加到他的密钥环中,他是添加我的主密钥、子密钥还是所有密钥?如果我设置了新子密钥,他如何验证它是否与我的主密钥相关联?
子键究竟是如何与主键“关联”的?
很多文章都说它们有关联,但没有一篇文章说它们是如何关联的。它们包含一些共同的数学性质吗?
希望了解这一点,如能提供任何澄清将不胜感激。
更新
在做了进一步的研究后,我偶然发现了这篇有趣的文章,关于GPG 密钥剖析。根据本文包含的信息判断,子密钥似乎确实包含在主密钥中,至少在查看公钥时是如此。我最初不明白的是,PGP 密钥包含大量元信息,而不仅仅是密钥的实际数值。
我的理解是否正确,我只有一公钥?
看来我只有一个公钥,也就是我发布的和我朋友签名的。这就是与我的子密钥相关联的东西,它告诉所有人我的子密钥实际上是我的?
如果我将子密钥复制到另一台设备,我是否也会获取整个公钥?
或者子密钥是否有自己的子公钥?
答案1
从这个开始:
我是否正确理解我只有一个公钥?
看来我只有一个公钥,也就是我发布的和我朋友签名的。这就是与我的子密钥相关联的东西,它告诉所有人我的子密钥实际上是我的?
是也不是。这取决于“公钥”的多重定义你想使用。
您有一个公共键块, 哪个大多数人在一般意义上,它被称为“PGP 公钥”。 (它也可以称为“证书”。)正如您在链接的文章中所看到的,这个公钥块由多个数据包组成:
your "primary" public key parameters (the cryptographic values for RSA/DSA/etc)
├─ metadata for that public key (creation/expiry time, etc)
├─ a list of userids (name+email labels)
│ └─ each userid followed by a list of signatures (certifications)
└─ a list of "subkey" public key parameters (RSA numbers, etc)
└─ each subkey followed by a list of self-signatures (self-certifications)
然而,它与密码学意义上的“一个公钥”不同,因为它有多组实际的 RSA/DSA/等等。公共参数在里面。
子键究竟是如何与主键“关联”的?
很多文章都说它们有关联,但没有一篇文章说它们是如何关联的。它们包含一些共同的数学性质吗?
它们与主密钥的签名(自我认证)一起存储。然而,从数学上讲,它们是完全独立的,可以用不同的算法生成。
我应该发布哪些密钥?
我应该发布我的主密钥、子密钥还是全部?每种方法的优缺点是什么?
所有这些都作为一个单元(关键块)。
每个单独的密钥都有其自己的任务——主密钥必须是公开的,因为它需要验证您在其他人的密钥(用户 ID)以及您自己的子密钥和用户 ID 上所做的签名(认证)。加密子密钥必须是公开的,以便其他人可以真正加密发送给它的消息。等等。
我的朋友应该签署哪些钥匙?
在用户界面中,签名过程从指定您的主密钥(通过 ID 或指纹)开始。然后软件会执行正确的操作。
从技术上讲,没有密钥被签名。其他人会签名你的用户 ID,它们是与主密钥关联的文本标签(姓名+电子邮件)。签署他人密钥的目的是保证密钥与姓名+电子邮件之间的绑定;仅签署密钥是无用的。
如果我的朋友将我添加到他的密钥环中,他会添加我的主密钥、我的子密钥还是我所有的密钥?
您的朋友添加整个密钥块 – 主密钥、子密钥、用户 ID。
如果我设置了一个新的子键,他如何验证它是否与我的主键相关联?
您自己的子密钥和用户 ID 是“自我认证的”,即,只要您创建它们,它们就会自动由您的主密钥签名。这就是为什么只需分发主密钥的指纹就足够了——它充当验证根。