OpenPGP public 和私钥对可以有不同的密钥 ID(短密钥 ID)吗?

Can an OpenPGP public and private key pair can have different key ID (short key ID)?

一个OpenPGPpublic和一对可以成功加解密的私钥可以有不同的密钥ID(短密钥ID)吗?

我尝试过的:

  1. 我已经使用 Bouncy Castle (C#) 获取用于测试 OpenPGP public 的短密钥 ID 和提供给我的私钥对,OpenPGP 密钥对的密钥 ID 始终相同。
  2. 我用同样的观察检查了 GPG4Win Kleopatra。
  3. 我已经完成了 PGP FAQ 但无法得到答案。

OpenPGP 密钥对具有相同的密钥 ID 似乎是合乎逻辑的,但是是否有 possibility/way 单个密钥对具有不同的密钥 ID?

我需要这些信息,因为我需要在数据库中保存 OpenPGP 密钥 ID table OpenPGP 密钥 pair.If 一样,我只能用一列来存储密钥编号.

根据:

https://datatracker.ietf.org/doc/rfc4880/?include_text=1

这可能会让您对 Id 的形成方式有所了解。来自

3.3. Key IDs

A Key ID is an eight-octet scalar that identifies a key.
Implementations SHOULD NOT assume that Key IDs are unique. The
section "Enhanced Key Formats" below describes how Key IDs are
formed.

我认为存储此 ID 是徒劳的,因为它们不是唯一的 - 使用相同 keyId 的不同密钥可能会发生冲突。

12.2. Key IDs and Fingerprints

For a V3 key, the eight-octet Key ID consists of the low 64 bits of the public modulus of the RSA key.

The fingerprint of a V3 key is formed by hashing the body (but not the two-octet length) of the MPIs that form the key material (public
modulus n, followed by exponent e) with MD5. Note that both V3 keys
and MD5 are deprecated.

A V4 fingerprint is the 160-bit SHA-1 hash of the octet 0x99,
followed by the two-octet packet length, followed by the entire
Public-Key packet starting with the version field. The Key ID is the low-order 64 bits of the fingerprint.

V3和V4都使用public部分作为id,所以应该与Public和私钥部分相同。

但是: 如果您一遍又一遍地重复使用数据来创建相同的密钥 (V4),它将具有不同的 KeyID,因为创建时间戳是指纹的一部分,指纹的低 64 位构成 KeyID,并且仍然能够破译内容。

如果您将 V3 升级到 V4,它们将具有不同的 ID,但解密的内容相同。

不同的密钥可能具有相同但不能解密相同内容的密钥 ID。

绝对意义上的 KeyID 不是 "ID"。

所以答案是:"For a PAIR - the keyID is identical as is ist based on length and public parts of the key only"。

它不是绝对标识符(又名 - 读取 public 密钥 KeyId,查找匹配的私有密钥 KeyID 并用它解密某些东西)。指纹会更适合那个——但仍然不是 100%:

请注意,密钥 ID 可能会发生冲突 -- 两个 具有相同密钥 ID 的不同密钥。请注意,有很多 较小但仍非零的两个不同密钥具有的概率 相同的指纹。

另请注意,如果 V3 和 V4 格式密钥共享相同的 RSA 密钥 material,他们会有不同的Key ID以及不同的 指纹。

Public 和密钥对的私钥共享他们的指纹

RFC 4880, OpenPGP, 12.2. Key IDs and Fingerprints 定义:

A V4 fingerprint is the 160-bit SHA-1 hash of the octet 0x99, followed by the two-octet packet length, followed by the entire Public-Key packet starting with the version field.

也就是说,所有的指纹都是从public键material计算出来的。密钥 ID(长短)是通过截断低位字节从指纹中导出的。

fingerprint: 0D69 E11F 12BD BA07 7B37  26AB 4E1F 799A A4FF 2279
long id:                                    4E1F 799A A4FF 2279
short id:                                             A4FF 2279

OpenPGP 短密钥 ID 冲突攻击

重要说明:short key IDs are vulnerable to collision attacks. When handling key IDs, especially for programmatic access and storing references to keys, never use short key IDs but the full fingerprint