仍然对 GPG 密钥和子密钥感到困惑

仍然对 GPG 密钥和子密钥感到困惑

我刚刚生成了新密钥

gpg——快速生成密钥

现在,当我这样做

gpg --list-keys[电子邮件保护]

我得到了这样的信息:

pub   rsa2048 2020-01-29 [SC] [expires: 2022-01-28]
      DEADBEEFDEADBEEFDEADBEEFDEADBEEFDEADBEEF
uid           [ultimate] [email protected]
sub   rsa2048 2020-01-29 [E]

但是当我这样做时:

gpg——编辑密钥[电子邮件保护]

我得到如下信息:

gpg (GnuPG) 2.2.17; Copyright (C) 2019 Free Software Foundation, Inc.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Secret key is available.

sec  rsa2048/DEADBEEFDEADBEEF
     created: 2020-01-29  expires: 2022-01-28  usage: SC  
     trust: ultimate      validity: ultimate
ssb  rsa2048/BEEFDEADBEEFDEAD
     created: 2020-01-29  expires: never       usage: E   
[ultimate] (1). [email protected]

我以为我至少在某种程度上理解了键和子键的概念,但这对我来说仍然没有意义。

  1. 为什么输出在一种情况下显示公钥,而在另一种情况下显示密钥?
  2. 为什么在第一种情况下公钥 ( pub) 被显示为能够签名 ( S),而在第二种情况下私钥 ( ssb) 被显示为能够加密 ( E)?这难道不是与我们在公钥加密 101 中学到的知识相悖吗?

答案1

为什么输出在一种情况下显示公钥,而在另一种情况下显示密钥?

在 GnuPG 2.1+ 中,我猜测该--edit-key命令会显示密钥,因为它一直都是这么做的。

回到 GnuPG 1.x(以及原始 PGP 2.x),有两个完全独立的密钥环(pubring 和 secring)。一些操作与其中一个配合使用,一些操作与另一个配合使用。因此,除了从不同的文件读取外,它们--list-secret-keys曾经完全一样,并且曾经有一个子命令可以在两个视图之间切换。--list-keys--edit-keys

为什么在第一种情况下公钥 (pub) 被显示为能够签名 (S),而在第二种情况下私钥 (ssb) 被显示为能够加密 (E)?这难道不是与我们在公钥加密 101 中学到的知识相悖吗?

不。输出描述的是 PGP 对象中的“密钥”——而不是纯加密意义上的“密钥”——使用标志描述了它是什么 PGP 操作意味着用途不仅限于“内部”密钥在数学上能够执行的加密操作。这意味着它们不会根据您查看的是公钥还是私钥而改变。

例如,您的示例 PGP 密钥块中有两个 RSA 密钥对,从技术上讲,它们都可以签名/验证以及加密/解密。但拥有两个密钥的意义在于您希望将它们的用途分开 - 即,您不希望 GnuPG 使用用于签名的子密钥执行加密,因此使用标志会将其过滤掉。

(没有单独的“解密”或“验证”标志,因为消息或签名已经表明要使用哪个密钥。)

这也意味着可以有多个使用标志映射到相同的操作(签名或验证)但在不同的上下文中:

  • “S”允许使用密钥来签署消息和文件(电子邮件等);
  • “C”允许使用该密钥来签名(认证)其他密钥/子密钥;
  • “A” 允许使用密钥来签署身份验证挑战(如 TLS 或 SSHv2)。

尽管从加密意义上来说,这三种方法都生成相同类型的数字签名,但由于政策原因,密钥本身通常是分开的。(例如,“认证”密钥应比“认证”密钥受到更严格的保护。)

相关内容