Ben*_*ins 3 encryption pgp gnupg
我一直在学习 GPG 和子密钥的使用。我觉得我已经对使用子键和保持主键离线的好处有了很好的理解,但是缺乏关于应该发布哪些键的信息。我的问题:
我应该发布哪些密钥?
我应该发布我的主键、子键还是全部?每个的优点/缺点是什么?
我的朋友应该签署哪些密钥?
如果我的朋友将我添加到他的密钥环中,他是添加我的主键、子键还是我的所有键?如果我设置了一个新的子键,他如何验证它与我的主键相关联?
子键是如何与主键“关联”的?
有很多文章说它们有关联,但没有说如何。它们是否包含一些共享的数学属性?
期待理解这一点,将不胜感激任何可以提供的澄清。
在做了一些进一步的研究之后,我发现了这篇关于GPG 密钥剖析的有趣文章。从本文中包含的信息来看,子密钥似乎完全包含在主密钥中,至少在查看公钥时是这样。我最初没有理解的是,PGP 密钥包含大量元信息,而不仅仅是密钥的实际数值。
我是否正确理解我只有一个公钥?
看来我只有一个公钥,就是我发布的东西,我朋友签名的东西。这就是关联我的子键,并告诉所有人我的子键实际上是我的?
如果我将我的子密钥复制到另一台设备,我是否也需要整个公钥?
或者子密钥有自己的子公钥吗?
从这个开始:
我是否正确理解我只有一个公钥?
看来我只有一个公钥,就是我发布的东西,我朋友签名的东西。这就是关联我的子键,并告诉所有人我的子键实际上是我的?
是和否。这取决于您要使用“公钥”的多个定义中的哪一个。
您有一个 public keyblock,大多数人将其称为一般意义上的“PGP public key”。(它也可以称为“证书”。)正如您在链接文章中看到的,这个公钥块由多个数据包组成:
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)
Run Code Online (Sandbox Code Playgroud)
但是,它与密码学意义上的“一个公钥”不同,因为它具有多组实际的 RSA/DSA/等。里面的公共参数。
子键是如何与主键“关联”的?
有很多文章说它们有关联,但没有说如何。它们是否包含一些共享的数学属性?
它们与由主键生成的签名(自我证明)一起存储。然而,在数学上,它们是完全独立的,可以为不同的算法生成。
我应该发布哪些密钥?
我应该发布我的主键、子键还是全部?各自的优缺点是什么?
所有这些都作为一个单元(keyblock)。
每个单独的密钥都需要用于其自己的任务——主密钥必须是公开的,因为需要它来验证您对其他人的密钥(用户 ID)以及您自己的子密钥和用户 ID 所做的签名(认证)。加密子密钥必须是公开的,以便其他人能够真正加密发送给它的消息。等等。
我的朋友应该签署哪些密钥?
在用户界面中,签名过程首先指定您的主键(通过 ID 或指纹)。然后软件会做正确的事情。
从技术上讲,没有一个密钥被签名。其他人对您的用户 ID 进行签名,这些用户 ID是与主键关联的文本标签(姓名 + 电子邮件)。签署他人的密钥的目的是为了保证密钥与姓名+电子邮件之间的绑定;仅签署密钥是没有用的。
如果我的朋友将我添加到他的密钥环中,他是添加我的主键、子键还是我的所有键?
您的朋友添加了整个键块——主键、子键、用户 ID。
如果我设置了一个新的子键,他如何验证它与我的主键相关联?
您自己的子键和用户 ID 是“自我认证的”,即,一旦您创建它们,它们就会自动由您的主键签名。这就是为什么分发主键的指纹就足够了——它充当验证根。