在现实世界中,每天都会创建数百万个 PGP 密钥,创建两个相同密钥的概率(机会)是多少?在不同的地方,由不同的人?
两个 PGP 密钥完全相同的可能性有多大?
如果我们假设您的随机数生成器没有完全失效,那么
两个 PGP 密钥完全相同的可能性有多大?
可以用近似于负无穷次方的东西来回答。或者换句话说:它不会发生。
我们可以通过假设“平均”PGP 公钥使用 2048 位RSA 模数来解决这个问题。因为至少模数的第一位必须始终为 1,所以有效模数长度短了一位。(这背后的确切技术和数学讨论涉及更多,但现在应该已经足够了。)
我不知道该范围内的常见半素数(两个素数的乘积)有多少,但让我们大方一点,将该范围内的任何随机数作为半素数的概率设为 10^-10。10^-10 大约是 2^-33。这是所需范围内的自然数与该范围内实际有效 RSA 模数的比率。
因此,与我们只是随机选择一些足够长度的情况相比,综合效果是有效地将可能的模数减少了大约 34 位。(由于这些数字的大小,小数部分在这里根本不相关。)
因此,我们从 2^2048 到 2^2014(或大约)可能的 RSA 模数。
假设每天生成一千万个密钥。这可能偏高,但同样,我们玩得很慷慨。同样,这大约是 2^33 个键。假设我们已经这样做了 100 年,并且只关心两个键是否具有相同的模数(我们不需要存储它们,或者将它们相互比较,或者其他类似的东西,因为所有这些都增加了我们在密码学理论中通常被忽略的过程的开销)。2^33 * 365 (天) * 100 (年) ~ 2^48。我们已经削减了额外的有效 48 位,达到 2^1966。即使我们假设每天有数十亿个密钥,也只会减少三个数量级(对应于 30 位)左右。
我们得出结论,假设我们每天正确生成一千万个密钥,导致随机生成两个具有相同模数的密钥的概率约为 2^-1966 或 10^-592。2^-1966 这个数字可以和2040 年相比,十年后我们可能勉强能数到 2^138。从 2^138 到 2^1966 的指数曲线有很长一段路要走,我们仍然必须对每个计数的数字做一些实际的事情(比如,生成一个 RSA 密钥)。
即使只是存储所有 2048 位 RSA 模数,假设上面提到的 10^-10 比率,也需要大约 2^2015 * 2048/8 ~ 10^609 字节(10^610 位)的存储空间。如果我们能想出一种方法,在整个可观测宇宙中为每个重子存储一个比特并立即访问所有这些存储,那么我们只需要大约 10^530 个宇宙就可以做到这一点。
如果您不想走简单的路线,那么即使很困难,考虑模数也比依靠随机机会给您一个重复的密钥要容易得多。除了橡胶软管密码分析之外,您需要担心的威胁是分解而不是纯粹的随机巧合。数字在不同的估计之间有所不同,但目前,估计2048 位 RSA对已知的攻击方法提供大约 100-130 位的安全性(2^100 ~ 2^130 工作因子),这暂时就足够了,除非您的威胁模型包括资金雄厚的对手的长期努力,在这种情况下,您可能希望使用 3072-4096 位的模数(4096 位 RSA 提供大约 110-140 位的安全性,具体取决于您询问的对象)。
公认的答案可能是正确的,但我认为从不同的角度来看它值得更多关注。
- 这是对 PGP 密钥生成的批评,非常值得一读。
系统的整体安全性取决于程序必须能够以或多或少相等的概率生成这 2**254 个数字中的每一个。
(这里的具体数字是“过时的”,相关部分是安全的密钥生成需要均匀分布。)
作为后续,了解有关随机数生成器攻击的更多信息很有趣。
然后是这个问题:提交给开源项目的后门示例?
最后在 CloudFlare 博客上:NSA(可能)如何在 RSA 的密码学中设置后门:技术入门:
- 随机数生成器中的一个缺陷允许人们劫持 Hacker News 帐户。
- Android 中损坏的随机数生成器允许攻击者劫持价值数千美元的比特币。
- Debian 发行版上的 OpenSSL 版本存在随机数生成器问题,可能允许攻击者猜测在这些系统上创建的私钥
结合上述情况,某些组织实际上可能有能力生成与其他人之前在另一个地方生成的密钥相同的密钥,这并非不可能。很难对这个机会给出一个数字,但它肯定高于“大约提升到负无穷大的幂”。