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

时间:2017-11-09 11:35:00

标签: c# bouncycastle pgp openpgp

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

我尝试过:

  1. 我使用了Bouncy Castle(C#)来获取提供给我的测试OpenPGP公钥和私钥对的短密钥ID,OpenPGP密钥对的密钥ID总是一样。
  2. 我已经用同样的观察结果检查了GPG4Win Kleopatra。
  3. 我已经完成了PGP FAQ但无法得到答案。
  4. 对于OpenPGP密钥对具有相同的密钥ID似乎是合乎逻辑的,但是是否有可能/方式为单个密钥对设置不同的密钥ID?

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

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:-1)

根据:

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,然后用MD5表示指数e)。注意两个V3键
  和MD5已被弃用。

     

V4指纹是八位字节0x99的
160位SHA-1散列,
  然后是两个八位字节的包长度,接着是整个
  从版本字段开始的公钥包。密钥ID是   指纹的低位64位。

V3和V4都使用公共部分来考虑id,因此 对于公钥和私钥部分应该是相同的。

BUT: 如果您重复使用数据来反复创建相同的密钥(V4),它将具有不同的KeyID,因为创建时间戳是指纹的一部分,低64位形成KeyID并且仍然能够解密东西。

如果你将V3升级到V4,他们将拥有不同的ID,但解密相同的东西。

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

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

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

它不是一个绝对的标识符(也就是说 - 读取公钥KeyId,查找匹配的私钥Key KeyID并用其解密)。指纹会更适合 - 但仍然不是100%:

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

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