![仍然对 GPG 密钥和子密钥感到困惑](https://linux22.com/image/1615270/%E4%BB%8D%E7%84%B6%E5%AF%B9%20GPG%20%E5%AF%86%E9%92%A5%E5%92%8C%E5%AD%90%E5%AF%86%E9%92%A5%E6%84%9F%E5%88%B0%E5%9B%B0%E6%83%91.png)
我刚刚生成了新密钥
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]
我以为我至少在某种程度上理解了键和子键的概念,但这对我来说仍然没有意义。
- 为什么输出在一种情况下显示公钥,而在另一种情况下显示密钥?
- 为什么在第一种情况下公钥 (
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)。
尽管从加密意义上来说,这三种方法都生成相同类型的数字签名,但由于政策原因,密钥本身通常是分开的。(例如,“认证”密钥应比“认证”密钥受到更严格的保护。)