【问题标题】:Can an OpenPGP public and private key pair can have different key ID (short key ID)?OpenPGP 公钥和私钥对可以有不同的密钥 ID(短密钥 ID)吗?
【发布时间】:2017-11-09 11:35:00
【问题描述】:

可以成功用于加密和解密的OpenPGP公钥和私钥对是否可以具有不同的密钥ID(短密钥ID)?

我尝试过的:

  1. 我已使用 Bouncy Castle (C#) 获取提供给我的测试 OpenPGP 公钥和私钥对的短密钥 ID,OpenPGP 密钥对的密钥 ID 始终相同。
  2. 我在 GPG4Win Kleopatra 上进行了同样的观察。
  3. 我已通过PGP FAQ 找到答案。

对于一个 OpenPGP 密钥对具有相同的密钥 ID 似乎是合乎逻辑的,但是是否有任何可能性/方法可以为单个密钥对提供不同的密钥 ID?

我需要这些信息,因为我需要将 OpenPGP 密钥 ID 保存在 OpenPGP 密钥对的数据库表中。如果相同,我可以只有一列用于存储密钥 ID。

【问题讨论】:

  • 除非您正在编写某种密钥库 - 为什么您〜永远〜在您的数据库中拥有公钥和私钥?你用收件人的公钥加密东西,你用发件人用你的公钥加密的私钥解密东西。即使您需要同时存储两者:一个 db 和 { id, byteblob, type , .. metainfo_fk_id }type in {private,public} 这样的结构也会有意义...... [只是好奇]
  • 什么是短键ID?
  • PGP 是 OpenPGP 规范、Bouncy Castle 的专有实现,例如 GnuPG 将形成其他实现。更好地参考 OpenPGP 密钥 来具体说明,尽管 PGP 术语仍然广泛使用,因为它在规范编写之前就已经存在。
  • @James K Polk,Jens Erat 的答案包括您的问题的答案。谢谢
  • @patrik artner,是的一种本地密钥库,很少有人可以访问它,用于将 PGP 密钥存储在不同部门的中心位置。谢谢!!

标签: c# bouncycastle pgp openpgp


【解决方案1】:

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

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

V4 指纹是八位字节0x99 的 160 位 SHA-1 哈希, 其次是两个八位字节的数据包长度,然后是整个 以版本字段开头的公钥包。

换句话说,所有指纹都是仅从公钥材料中计算出来的。密钥 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. 在处理密钥 ID 时,尤其是在编程访问和存储密钥引用时,never use short key IDs but the full fingerprint

【讨论】:

  • 谢谢,Jens Erat,我正在使用来自 Bouncy Castle (C#) 的密钥 ID 和长数据类型来识别唯一密钥。我将 Short key id 用于其他目的。谢谢!!!
【解决方案2】:

根据:

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

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

3.3。密钥 ID

密钥 ID 是一个八位字节的标量,用于标识密钥。
实现不应该假设密钥 ID 是唯一的。
下面的“增强的密钥格式”部分描述了密钥 ID 的作用
形成。

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

12.2。密钥 ID 和指纹

对于 V3 密钥,八位字节的密钥 ID 由低 64 位组成 RSA 密钥的公共模数。

V3 密钥的指纹是通过对正文进行散列形成的(但不是 构成密钥材料的 MPI 的两个八位字节长度(公共
模数 n,然后是指数 e) 和 MD5。请注意,两个 V3 键
和 MD5 已弃用。

V4 指纹是八位字节 0x99 的 160 位 SHA-1 哈希,
后跟两个八位组的数据包长度,然后是整个
以版本字段开头的公钥包。密钥 ID 是 指纹的低位 64 位。

V3 和 V4 都使用公共部分来考虑 id,所以它应该对于公共和私人密钥部分是相同的。

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

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

不同的密钥可能具有相同的 KeyID,但无法解密相同的内容。

KeyID 不是绝对意义上的“ID”。

所以答案是:“对于 PAIR - keyID 与 ist 相同,仅基于密钥的长度和公共部分”。

它不是一个绝对标识符(又名 - 读取公钥 KeyId,查找匹配的私钥 KeyID 并用它解密某些内容)。指纹会更适合这种情况 - 但仍然不是 100%:

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

还要注意,如果 V3 和 V4 格式的密钥共享相同的 RSA 密钥 材料,它们将具有不同的 Key ID 以及不同的 指纹。

【讨论】:

  • 虽然这一切都是真的,但它并没有回答他的问题。
猜你喜欢
  • 2022-01-15
  • 2018-07-19
  • 1970-01-01
  • 2013-08-06
  • 1970-01-01
  • 2013-04-06
  • 2022-01-13
  • 2018-02-27
  • 1970-01-01
相关资源
最近更新 更多