OpenPGP public 和私钥对可以有不同的密钥 ID(短密钥 ID)吗?
Can an OpenPGP public and private key pair can have different key ID (short key ID)?
一个OpenPGPpublic和一对可以成功加解密的私钥可以有不同的密钥ID(短密钥ID)吗?
我尝试过的:
- 我已经使用 Bouncy Castle (C#) 获取用于测试 OpenPGP public 的短密钥 ID 和提供给我的私钥对,OpenPGP 密钥对的密钥 ID 始终相同。
- 我用同样的观察检查了 GPG4Win Kleopatra。
- 我已经完成了 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。
一个OpenPGPpublic和一对可以成功加解密的私钥可以有不同的密钥ID(短密钥ID)吗?
我尝试过的:
- 我已经使用 Bouncy Castle (C#) 获取用于测试 OpenPGP public 的短密钥 ID 和提供给我的私钥对,OpenPGP 密钥对的密钥 ID 始终相同。
- 我用同样的观察检查了 GPG4Win Kleopatra。
- 我已经完成了 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。