考虑到不同长度的 RSA 密钥对(1024、2048、4096),两个用户生成完全相同的私钥的几率是多少?
RSA 私钥冲突的几率是多少?
首先,重要的是没有两个相同的私钥,如果模数中的任何一个素数相同(这是公钥的一部分),则很容易快速恢复完整的私钥。
(旁白——简短的 RSA 入门:在 n 位私钥的 RSA 中,公钥由一个指数组成,通常是 e=65537 和一个模数 N,它是两个 n/2 位素数的乘积. 私钥由私有指数 d(由 d = e -1 mod (p-1)(q-1) 计算,使用扩展欧几里得算法有效地找到)和模数 N 组成。公共对允许加密通过模幂运算将消息 m 转换为密文 c:c = m e mod N,并且私钥允许通过 m = c d mod N 解密。这一切都归功于数论的基本部分——欧拉定理和如何计算 totients)。
如果两个模共享一个因子,那么您可以有效地取两个模的最大公约数(使用欧几里德算法)并找到共享因子。假设这两个模共享一个素因子 q,因此 N 1 = p 1 q 和 N 2 = p 2 q,则 gcd(N 1 , N 2 ) = q。使用找到的素因子,找到另一个素因子 (p 1 = N 1 /q) 并重新创建私有指数是微不足道的。一个2012的研究查看了 470 万个不同的 RSA 模数,并在其中 12720 个中发现了共享因子(即从网络上搜索到的 470 万个 RSA 密钥中有 0.3% 被他们的分析破坏了)。(该论文还发现了 RSA 在实践中的其他几个问题,例如在看似不同的实体上使用的共享密钥。)
现在,如果您的机器具有大量初始熵并且随机数生成没有缺陷,那么选择相同素数的概率极低。这两个假设并不总是正确的。请参阅2006-2008 年的 Debian OpenSSL 问题密钥,并注意许多人在没有足够时间建立大量熵的全新(虚拟)机器上为系统创建密钥。
粗略地说,1024 位密钥的强度取决于对构成模数的两个 512 位素数的选择。根据素数定理,大约有 (2 512 /ln 2 512 - 2 511 /ln 2 511 ) ~ 10 151个不同的 512 位素数。根据生日悖论,在生成 sqrt(10 151 ) ~ 10 75个不同的质数之后,您应该期望质数的碰撞以大约 50% 的概率出现不止一次。也就是说,如果某个政府每台计算机每秒生成 10 亿个 512 位素数并使用 10 亿台计算机,并且运行了 10 亿年,他们将只能生成大约 10 34质数,并且与某些外部密钥发生冲突的概率基本上为零,这与连续几周准确地玩强力球 10 次并且只购买一张彩票并且每次都赢得大奖而不作弊的机会相同。(直到产生近 10 40 = 10000000000000000000000000000000000000000 倍的素数之前,它才会有很大的机会发生一次素数碰撞)。
然而,正如 2012 年的论文所示,这在现实世界中并非如此,因为 RSA 密钥在实践中是由有缺陷的方法生成的,生成率至少为 0.3%。