子键到底是什么?

信息安全 gnupg pgp 密钥生成 打开pgp
2021-08-13 08:02:31

我相当了解 RSA、Elgamal、AES、SHA 背后的数学原理,但不知道在实践中是如何使用的。子密钥与主密钥有何不同?我从各个网站了解它的目的,但它是如何在内部实现的?它是如何与主密钥绑定的?它是 OpenPGP 术语吗?

2个回答

用户 rjh 于 2008 年在 enigmail 论坛上发表的这篇文章很好地回答了这个问题:

最初在 PGP 2.6 中,早在 90 年代初,您只有一个密钥对,它用于加密和签名。拥有额外密钥对的能力带来了一些工程挑战。最终,决定将附加的密钥对称为“子密钥”,尽管事实上它们没有任何“子”。同样,您所说的“钥匙”根本不是真正的钥匙——该术语是钥匙真正是钥匙的日子的保留。如今,密钥实际上是密钥的集合,以及一些用于用户标识符、签名等的元数据。

例如,我的“密钥”上有四个密钥对:5B8709EB、D0C6AAE4、71E177DB 和 8DB02BBB3。

GnuPG 所说的“公钥”实际上是集合中最古老的签名密钥。例如,由于首先创建了 5B8709EB,GnuPG 将整个密钥集和元数据称为“5B8709EB 密钥”。

那么,“是否有可能拥有一个根本没有任何子密钥的用于加密和签名的密钥?” 这里的答案是否定的,因为 密钥上的所有密钥对都是子密钥。即使只有其中一个。

子键

子密钥包在RFC 4880, OpenPGP, 5.5 Key Material Packet中定义。它们仅由另一个数据包 ID 区分,并且需要绑定签名才能真正有用(见下文)。

Public-Subkey 数据包(标签 14)与 Public-Key 数据包具有完全相同的格式,但表示一个子密钥。

子键使用

OpenPGP 子密钥用于不同的目的:

  • 能够离线存储主密钥或更安全的设备。如果带有子密钥的机器受到损害,您可以轻松地撤销子密钥,而无需撤销主密钥(共享新密钥、获取新签名等)的所有麻烦。
  • 在不同的机器上拥有不同的子密钥,例如构建服务器上的签名子密钥。同样,撤销单个密钥很容易。
  • 使用较大的主键以获得较长的生命周期,使用较短但更快的子键用于日常使用。
  • 一些算法不支持加密和签名。例如,DSA 主密钥需要另一个密钥进行加密,通常与 ElGamal 配对。

绑定签名

有一些特殊的签名子类型可以将子键绑定到主键(反之亦然),列在RFC 4880, OpenPGP, 5.2.1 Signature Types中:

0x18:子键绑定签名

此签名是顶级签名密钥的声明,表明它拥有子密钥。此签名直接在主密钥和子密钥上计算,而不是在任何用户 ID 或其他数据包上计算。绑定签名子密钥的签名必须在此绑定签名中具有嵌入式签名子包,其中包含由主密钥和子密钥上的签名子密钥生成的 0x19 签名。

0x19:主键绑定签名

这个签名是一个签名子密钥的声明,表明它是由主密钥和子密钥拥有的。此签名的计算方式与 0x18 签名相同:直接在主密钥和子密钥上,而不是在任何用户 ID 或其他数据包上。