OpenPGP 密钥与其子密钥之间的关系是什么?

The*_*ish 6 pgp rsa gnupg openpgp

我来自使用带有 OpenSSL 的普通旧 RSA 来满足我所有的非对称加密需求,我学到了相当多的知识,但是我很难围绕 OpenPGP 协议进行思考。因此,这将是几个问题。

在我的 Debian 盒子中,使用 GnuPG,在当前钥匙串中创建主密钥时,我注意到子密钥的默认创建。在阅读了一些之后,我了解到 GnuPG 以这种方式自动管理密钥;严格用于签名的主密钥和严格用于加密的子密钥。这让我相信他们只是为私钥和公钥使用了不同的名称:主密钥(如私钥)用于签署只有子密钥(公钥)可以解密的数据,但子密钥(公钥)只能加密数据,然后只能通过主密钥(私钥)解密。我在这个假设中是否正确,还是它们完全是 2 个单独的密钥对?

如果它们是两个单独的密钥对,那么什么在数学上将子密钥绑定到主密钥?

是否只是 GnuPG 使用这种方法,其中会自动创建子密钥以进行加密,还是 OpenPGP 协议强制要求这样做?

当我将密钥上传到密钥服务器时,上传的是哪个密钥,我的主密钥还是子密钥?或两者?

当我使用该--export功能时,当我指定我的 UID 时会导出哪个 OpenPGP 密钥?

Jen*_*rat 6

关于主键和子键

主密钥(如私钥)用于签署只有子密钥(公钥)可以解密的数据,但子密钥(公钥)只能加密数据,然后只能由主密钥解密(私钥)。我在这个假设中是否正确,还是它们完全是 2 个单独的密钥对?

您还没有完全正确地掌握公钥/私钥(也称为非对称)密码学的概念。每组公钥和私钥都是分开的,您发布公钥以便其他人可以使用它并将私钥保密。私钥发出的签名可以通过公钥进行验证,使用公钥加密的消息可以用私钥解密。OpenPGP 中的主键和子键对之间没有直接关系,它们是完全不同的键对。

是否只是 GnuPG 使用这种方法,其中会自动创建子密钥以进行加密,还是 OpenPGP 协议强制要求这样做?

GnuPG 中的默认设置是您有一个用于认证和签名的主密钥对,而加密子密钥仅用于加密。使用 RSA,您还可以生成支持所有这些操作的主键(使用 GnuPG 和--expert标志,您可以!)。这主要是因为 DSA 和 Elgamal 等其他算法仅支持其中一种操作(DSA 仅用于签名,Elgamal 用于加密),您需要使用不同的密钥。

对于不同的用途使用不同的密钥也有一些优势:考虑发现一个缺陷,它允许在某些条件下根据签名计算私钥。虽然您的签名密钥将成为目标,但加密子密钥是另一个并且不受此攻击的攻击。有些人甚至考虑将主密钥限制为仅用于认证,并添加两个子密钥对是最佳做法,一个用于签名,一个用于加密。

绑定签名

如果它们是 2 个单独的密钥对,那么在数学上将子密钥绑定到主密钥的是什么?

在 OpenPGP 中,创建子密钥时会发出一种特殊的绑定签名。能够签名的子密钥也可以在主密钥上发出这样的绑定签名。这些特殊签名在RFC 4880、OpenPGP、5.2.1中定义签名类型

   0x18: Subkey Binding Signature
       This signature is a statement by the top-level signing key that
       indicates that it owns the subkey.  This signature is calculated
       directly on the primary key and subkey, and not on any User ID or
       other packets.  A signature that binds a signing subkey MUST have
       an Embedded Signature subpacket in this binding signature that
       contains a 0x19 signature made by the signing subkey on the
       primary key and subkey.

   0x19: Primary Key Binding Signature
       This signature is a statement by a signing subkey, indicating
       that it is owned by the primary key and subkey.  This signature
       is calculated the same way as a 0x18 signature: directly on the
       primary key and subkey, and not on any User ID or other packets.
Run Code Online (Sandbox Code Playgroud)

在 GnuPG 中寻址子键

当我将密钥上传到密钥服务器时,上传的是哪个密钥,我的主密钥还是子密钥?或两者?

当我使用该--export功能时,当我指定我的 UID 时会导出哪个 OpenPGP 密钥?

通常,在 GnuPG 中,键 ID 和 UID 总是解析为主键。所有导出操作(上传到密钥服务器也被视为导出)还会导出您的密钥上的子密钥、用户 ID 和证书。其他操作(如签名和加密)也存在类似的情况。如果你真的想表示一个操作的子键,你必须!在子键后面添加(例如。gpg --recipient 0xDEADBEEF! --encrypt)。