GPG:分离公共子密钥 - 为什么我不能这样做?

信息安全 密钥管理 gnupg
2021-09-05 11:19:28

我了解使用子键的好处。我也知道,在私钥的情况下,可以将子密钥与主密钥分离,因为有时用户可能不希望将私钥与私钥一起存储。(使用 gpg, --export-secret-subkeys)此外,当您--export使用公钥时,您使用主密钥的指纹还是其中一个子密钥的指纹似乎并不重要。

据我所知,无法分离 public subkeys让我明确一点:我想不出任何重要的理由。我能想到的唯一理由是极简主义——您可能只想导入公共子密钥,因为这就是您打算使用的全部。但我试图弄清楚是否有更根本的原因。

  • 是因为用户 ID 详细信息附加到主密钥,而分离子密钥会允许身份不明的密钥四处飘浮吗?(我不相信这一点 - 当您导入分离的私有子密钥时,缺少的主密钥仍然会获得参考 [sec# 等],即使它不存在。所以当然可以对公钥进行同样的操作。)
  • 仅仅是因为没有充分的理由这样做吗?

但是,如果出于某种原因无法在逻辑上将公共子密钥与公共主密钥分开,则表明我没有正确理解子密钥。

1个回答

理论上分离子键...

分离子键与主键、子键、用户 ID、证书和信任的 OpenPGP 模型不能很好地对应。

子键和用户 ID 都分别绑定到主键。认证应用于主键和用户 ID 的元组,直接信任主键。

您可以很好地将子键与其主键分离并使用它(作为主键),必要时通过摆弄 OpenPGP 数据包中的位。但如果没有与主密钥的联系,它实际上是一个全新的密钥,没有任何认证和信任(尽管密钥材料,它背后的数字保持不变)。

...和实践

请注意,使用 导出子键时gpg --export-secret-subkeys,始终会导出主键存根以及用户 ID;正因为如此,GnuPG 将显示“缺少主密钥 [...] 引用 [sec# 等]”,就像您调用它一样。

您可以通过运行轻松验证它

gpg --export-secret-subkeys [subkey-id]! | gpg --list-packets

例如(对于子键0xDEADBEEF

gpg --export-secret-subkeys 0xDEADBEEF! | gpg --list-packets

确保!在子键 id 之后包含一个,否则 GnuPG 将解析关联的主键,从而导出所有可用的子键!

真的把事情分开

真正分离子密钥,您可以使用gpgsplit,它将 OpenPGP 消息分解为其实际的子数据包。使用它们需要对OpenPGP 规范 (RFC 4880)有更深入的了解,但它使得处理单个数据包(也使用十六进制编辑器)和重新编译有效的 OpenPGP 消息cat变得相当容易。