OpenPGP 密钥和其子密钥之间有什么关系?

OpenPGP 密钥和其子密钥之间有什么关系?

我以前使用普通的 RSA 和 OpenSSL 来满足我所有的非对称加密需求,我学得相当好,但我对 OpenPGP 协议有点难以理解。因此,这将是几个问题。

在我的 Debian 机器中,使用 GnuPG,在当前钥匙串中创建主密钥时,我注意到默认创建了一个子密钥。经过一番阅读,我了解到 GnuPG 自动以这种方式管理密钥;主密钥严格用于签名,子密钥严格用于加密。这让我相信它们只是对私钥和公钥有不同的称呼:主密钥(如私钥)用于签名只有子密钥(公钥)可以解密的数据,但子密钥(公钥)只能加密数据,然后只能由主密钥(私钥)解密。我的这个假设正确吗,或者它们是两个完全独立的密钥对?

如果它们是两个独立的密钥对,那么从数学上讲,子密钥与主密钥如何绑定?

是否只有 GnuPG 使用此方法,即自动创建子密钥进行加密,还是这是 OpenPGP 协议要求的?

当我将密钥上传到密钥服务器时,会上传哪个密钥?主密钥还是子密钥?还是两者兼而有之?

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

答案1

关于主键和子键

主密钥(如私钥)用于对数据进行签名,只有子密钥(公钥)才能解密,但子密钥(公钥)只能加密数据,然后只能由主密钥(私钥)解密。我的这个假设正确吗?或者它们是两个独立的密钥对吗?

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

是否只有 GnuPG 使用此方法,即自动创建子密钥进行加密,还是这是 OpenPGP 协议要求的?

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

为不同用途设置不同的密钥也有一些好处:假设发现一个漏洞,允许在特定条件下从签名计算出私钥。虽然您的签名密钥会成为攻击目标,但加密子密钥是另一个攻击目标,不会成为攻击目标。有些人甚至认为将主密钥限制为仅用于认证,并添加两个子密钥对是最佳实践,一个用于签名,一个用于加密。

绑定签名

如果它们是两个独立的密钥对,那么从数学上讲,什么将子密钥与主密钥绑定在一起?

在 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.

在 GnuPG 中寻址子密钥

当我将密钥上传到密钥服务器时,会上传哪个密钥?主密钥还是子密钥?还是两者兼而有之?

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

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

答案2

我喜欢将主密钥和子密钥之间的关系想象成证书颁发机构 (CA) 与其签名和颁发的证书之间的关系。试图证明证书的第三方与 CA 建立信任,并使用其公钥来验证其颁发的证书的签名。同样,您让其他人验证您的 PGP 主密钥并对其进行签名(即整个去中心化的信任网络)。然后,您将子密钥用于签名和加密数据的所有实际工作。当其他人想要证明子密钥的有效性时,他们会利用您的主密钥(希望)是可信的这一事实(因为它已由其他受信任的密钥签名),然后可用于验证子密钥上的签名,从而将子密钥确立为可信的。

除了签署新子密钥之类的事情之外,主密钥应该很少使用。

相关内容