加密时 GnuPG 子密钥选择的优先级

信息安全 加密 pgp gnupg
2021-08-25 23:32:13

我有以下 6 个子项

$ gpg -K
...
ssb>  rsa2048 2017-10-04 [E] [expires: 2027-10-02]
ssb>  rsa2048 2017-10-04 [S] [expires: 2027-10-02]
ssb>  rsa2048 2017-10-04 [A] [expires: 2027-10-02]
ssb>  rsa2048 2015-02-12 [E] [expires: 2025-01-05]
ssb>  rsa2048 2016-01-05 [A] [expires: 2026-01-02]
ssb>  rsa2048 2016-08-20 [S] [expires: 2026-08-18]

上下文是我买了一张新的智能卡(Yubikey)并为它生成了新的子密钥。我想在我的 pubkey 中记录旧的子键,这样 Github 就会一直将我用旧子键签名的旧提交显示为“已验证”。

但是我想确保从现在开始只使用新的子例如,如果有人向我发送加密消息,我希望他们使用新的子密钥。

我注意到gpg -e默认情况下使用我的新加密子密钥,所以这可以按预期工作,但我的问题是为什么

换句话说,如何gpg确定在加密期间使用哪个密钥它是基于子项在文件中保存的顺序(如上)还是创建/到期日期(较新的优先)?

1个回答

GnuPG 总是为相应的操作选择最新的有效(子)密钥(通常是支持算法的最新的未撤销密钥)。即使您选择了特定的子键,GnuPG 也会首先解析关联的主键,然后开始此选择过程。要覆盖它,后缀!到给定的键。例如,如果需要,您可以在 git 配置中执行此操作。

我不知道任何规范性参考(除了 GnuPG 代码):RFC 4880(OpenPGP)和 GnuPG 手册页或手册似乎都没有定义行为。键比较函数的相关代码行:

if (old->validity == new->validity && uid_is_ok (&new->key, uid)
    && old->creation_time < new->creation_time)
  return -1;      /* Both keys are of the same validity, but the
                     NEW key is newer.  */