如何解释产生 gpg 列表键的输出?

信息安全 gnupg 术语
2021-08-18 23:03:44

纠正我哪里错了。有公钥和私钥(或秘密)。公钥和私钥组成密钥对。一些密钥对绑定到其他密钥对。前者称为子键,后者称为主(或主)键。尽管它们被称为密钥,但它们实际上是密钥对。

钥匙圈是文件。gpg-1.4.18默认情况下会创建两个pubring.gpg密钥环:public ( ) 和 secret ( secring.gpg)。公钥进入公钥环,私有密钥环。

让我们来看看/etc/apt/trusted.gpg

$ gpg /etc/apt/trusted.gpg
pub  4096R/68576280 2014-06-13 NodeSource <gpg@nodesource.com>
sub  4096R/AA01DA2C 2014-06-13
pub  4096R/86E50310 2016-10-05 Yarn Packaging <yarn@dan.cx>
sub  4096R/D50AF136 2016-10-05
sub  4096R/9D41F3C3 2016-10-05 [expires: 2017-10-05]
sub  4096R/FD2497F5 2016-10-30 [expires: 2019-01-01]
sub  4096R/B6FF4DE3 2017-09-10 [expires: 2019-01-01]
sub  4096R/88B63E1E 2019-01-02 [expires: 2020-02-02]
sub  4096R/69475BAA 2019-01-11 [expires: 2020-02-02]
pub  3072R/95BD4743 2019-03-18 DEB.SURY.ORG Automatic Signing Key <deb@sury.org>
sub  3072R/8059B8AC 2019-03-18 [expires: 2021-03-17]

考虑 Yarn Packaging 键及其子键。首先,列出的所有密钥都是公共密钥。它的公钥有6个公共子密钥。假设,第一个子项没有指定到期日期。

现在,如果我这样做:

$ gpg -k --keyring /etc/apt/trusted.gpg
/etc/apt/trusted.gpg
--------------------
pub   4096R/68576280 2014-06-13
uid                  NodeSource <gpg@nodesource.com>
sub   4096R/AA01DA2C 2014-06-13

pub   4096R/86E50310 2016-10-05
uid                  Yarn Packaging <yarn@dan.cx>
sub   4096R/D50AF136 2016-10-05
sub   4096R/88B63E1E 2019-01-02 [expires: 2020-02-02]
sub   4096R/69475BAA 2019-01-11 [expires: 2020-02-02]

pub   3072R/95BD4743 2019-03-18 [expires: 2021-03-17]
uid                  DEB.SURY.ORG Automatic Signing Key <deb@sury.org>
sub   3072R/8059B8AC 2019-03-18 [expires: 2021-03-17]

我只能看到 Yarn Packaging 的第一个和最后两个键。(1)为什么它不显示所有的键?还有uid一行显示用户 ID,这基本上是一个键名。正如我所说,trusted.gpg只包含公钥。

但是apt对于一个显示更长的密钥ID。(2)为什么会这样?

W:GPG错误:https : //dl.yarnpkg.com stable InRelease:以下签名无法验证,因为公钥不可用:NO_PUBKEY 23E7166788B63E1E

让我们看一下我为撰写本文而生成的密钥:

$ gpg -k
/root/.gnupg/pubring.gpg
------------------------
pub   2048R/454A8AB5 2019-03-25
uid                  Temporary Key (Comment to the Temporary Key) <temporary.key@gmail.com>
sub   2048R/763C1752 2019-03-25

$ gpg -K
/root/.gnupg/secring.gpg
------------------------
sec   2048R/454A8AB5 2019-03-25
uid                  Temporary Key (Comment to the Temporary Key) <temporary.key@gmail.com>
ssb   2048R/763C1752 2019-03-25

所以我有两个密钥对,或 4 个密钥。一个主(或主)密钥(或密钥对)。和一个子密钥(或子密钥对)。公共密钥环中有 2 个(公共)密钥,秘密密钥中有 2 个(私有)密钥。(3)为什么我会自动获取子键?

pub - public key
sub - subkey
sec - private (or secret) key
ssb - private (or secret) subkey
uid - user id

(4)是否有其他方式显示按键信息?

1个回答

有公钥和私钥(或秘密)。公钥和私钥组成密钥对。一些密钥对绑定到其他密钥对。前者称为子键,后者称为主(或主)键。尽管它们被称为密钥,但它们实际上是密钥对。

按键您生成(和自己)的密钥对。如果你将自己的密钥分发给其他人,或者其他人将他们的密钥分发给你,则只分发公钥,所有者保留私钥的唯一副本。这就是公钥密码学的工作原理。

背景:当 PKC 最初被发明时,术语是相当临时的。以前所有历史中的密码学都依赖于保持密钥 - 唯一的唯一密钥 - 秘密,但 PKC 发明了一种新的密钥,它不是保密的,而是可以并且经常应该公开的。最初人们称另一部分为秘密,未公开的部分。随着时间的推移,对称加密中的密钥(通常)必须由两个或更多授权方共享但(总是)对其他人保密,以及根本不应该共享的非对称加密(PKC)中的密钥,因此我们采用了“私有”一词来区分后者。因为 PGP 是在这个术语确定之前创建的,所以它经常使用“秘密”,而现代实践是“私人的”。

钥匙圈是文件。gpg-1.4.18 默认创建两个密钥环:public (pubring.gpg) 和 secret (secring.gpg)。公钥进入公钥环,私有密钥环。

对于 GnuPG 1 和 2.0 来说大部分是正确的;2.1 up 将 secret-ring 更改为单独文件的目录。GnuPG 还将与公钥相关的信任设置存储在名为 trustdb.gpg 的单独文件中。除了 GnuPG 之外,还有其他 PGP 实现,它们可以使用不同的文件、数据库,甚至是海龟壳(如果他们愿意),只要它们以某种可用于它们所做操作的方式存储密钥。

让我们以 /etc/apt/trusted.gpg 为例:...考虑一下 Yarn Packaging 键及其子键。首先,列出的所有密钥都是公共密钥。它的公钥有6个公共子密钥。假设,第一个子项没有指定到期日期

这些密钥属于其他人,因此您只能获得公共部分。

现在如果我这样做:$ gpg -k --keyring /etc/apt/trusted.gpg
我只能看到 Yarn Packaging 的第一个和最后两个键。(1) 为什么它不显示所有的键?

默认情况下它不显示过期的子键——crossdupe

还有显示用户 id 的 uid 行,这基本上是一个键名。正如我所说,trusted.gpg 只包含公钥。

用户 ID 应该标识密钥的所有者这与识别密钥并不完全相同,但它非常密切相关。

但 apt for one 显示更长的密钥 ID。(2) 为什么会这样?

在 PGP 和 GnuPG 中,密钥实际上是通过20 字节的指纹和从指纹中提取的 8 字节长的 keyid来识别的。在过去,人们认为必须手动输入、读取和比较长 keyid 对于(某些?)用户来说会很困难,因此 GnuPG 默认使用短 keyid,它是 4 字节(32 位)的低半部分长密钥。注意错误消息中的(长)keyid 23E7166788B63E1E 的下半部分是 88B63E1E,它在您从 /etc/apt/trusted.gpg 生成的列表中——因此应该可用。

在您的 gpg 版本中,您可以添加--keyid-format long以查看长 keyid,和/或--with-fingerprint一次或两次(或单独--fingerprint一次或两次)以查看指纹,从中可以轻松导出两个 keyid;请参阅手册页。(您可以将这些或其他选项放在配置文件中以自动使用它们。) 部分交叉复制

近年来,摩尔定律使得伪造 32 位 keyid变得很容易,因此 GnuPG 2.1 up 在主密钥上显示指纹(但默认情况下不显示子密钥)。

让我们看一下我生成的密钥......所以我有两个密钥对,或 4 个密钥。一个主(或主)密钥(或密钥对)。和一个子密钥(或子密钥对)。公共密钥环中有 2 个(公共)密钥,秘密密钥中有 2 个(私有)密钥。(3) 为什么我会自动获取子键?

简短的回答可能是您使用了 gpg 的默认值,这是默认值,尽管 gpg 可以创建(和使用)其他安排。长答案更复杂,部分基于意见。首先注意 PGP 中的每个密钥/对都有 'usage' 标志来控制它所使用的操作,通常显示为单个字母,并且 gpg 默认是 masterkey 仅用于 S=签名数据和 C=certifying(签名) 密钥,而子密钥用于 E=加密数据。不幸的是,在 2.1(或者可能是 2.2?)之前显示使用标志很不方便. 对于在 1990 年代更流行的 DSA+ElGamal 密钥,当时 RSA 专利对许多人来说是个问题,这是一个技术要求:DSA 只能签名(和认证),EG 只能加密(在 gpg 中)。对于 RSA 或 ECC,它不再是技术要求,但仍然是默认设置。

至少在某些情况下,有单独的(子)密钥用于加密和签名,并且两者都与认证(始终是主密钥)分开,这也可能具有操作优势;gpg 默认只做前者。有关是否、何时以及为什么应该为不同用途或目的设置不同子密钥的讨论,请参阅:
什么是好的通用 GnuPG 密钥设置?
为什么 PGP 主密钥只有一个子密钥,并且默认将认证与签名绑定?
PGP - 为什么有单独的加密子密钥
秘密子密钥的用途?
PGP/GPG:我需要更多加密子密钥吗?
OpenPGP 中子项的基本原理?
用于加密和签名的 GPG 主密钥和子密钥以及默认密钥
子密钥到底是什么?
https://superuser.com/questions/632375/why-does-gpg-pgp-by-default-use-different-keys-for-signing-encryption
https://superuser.com/questions/1113308/what-is -the-relationship-between-an-openpgp-key-and-its-subkey
和许多其他网站博客等遍布网络,但谷歌首先给了我 Stack 结果,因为它知道我喜欢它们。

(4) 是否有其他方式显示按键信息?

很多,尽管他们中的大多数使用 GnuPG 以外的东西,或者至少是在 GnuPG 之上添加的。一个完整的列表需要我数年的时间才能写出来,而且 Stack 政策基本上是反对列表的。如果您有特殊需要,请询问。