可以成功用于加密和解密的OpenPGP公钥和私钥对是否具有不同的密钥ID(短密钥ID)?
我尝试过:
对于OpenPGP密钥对具有相同的密钥ID似乎是合乎逻辑的,但是是否有可能/方式为单个密钥对设置不同的密钥ID?
我需要这些信息,因为我需要在OpenPGP密钥对的数据库表中保存OpenPGP密钥ID。如果它是相同的,我只能有一列用于存储密钥ID。
答案 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
重要提示: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 指纹。