所以我偶然发现了这个网站,它提供免费向公众在线生成 Diffe-Hellman 参数的服务。
当然,在生产环境中使用这样的网站来生成 DH 参数而不是自己生成它们是一个坏主意吗?或者它实际上从哪里来没有区别?
所以我偶然发现了这个网站,它提供免费向公众在线生成 Diffe-Hellman 参数的服务。
当然,在生产环境中使用这样的网站来生成 DH 参数而不是自己生成它们是一个坏主意吗?或者它实际上从哪里来没有区别?
DH参数是如何产生的
DH 参数有两种类型的生成器。每个生成器都有两个步骤:需要随机输入的步骤和确定性步骤。这两个步骤在两种类型的生成器之间是相同的:
第二步旨在避免生成具有意外不安全数学属性的模数。此步骤并非旨在检测有意恶意的候选者,只会检测自然弹出的意外候选者。这些计算困难的步骤的结果是一个适用于 DH 密钥交换并且没有意外弱点的模数列表。
恶意参数
可以创建仍被验证为安全的后门 Diffie-Hellman 参数。例如,某些与SNFV兼容的素数或易受小子群攻击的素数。还有更多的问题。这意味着信任提供这些参数的服务可能是有风险的,因为您无法知道模数是否实际使用随机数生成器来选择素数,因为您无权访问它们正在使用的种子. 确定性验证步骤仅用于捕获由于创建的大量候选者而导致的意外不安全素数。这并不意味着很难“欺骗”。
什么都没有我的袖子数字
无所事事的数字是具有合适数学属性的值,这是众所周知的,缓解了“你为什么选择这些常数?”的问题。密码学中使用的一些例子是 π、e,甚至是独立宣言。这将允许任何人验证素数是安全的,并且它们是在完全确定性和可重复的过程中生成的。如果他们这样做,他们将更难以生成恶意模数。例如,来自RFC 3526的所有模数都使用 π 作为无意义的数字,因此所有素数都采用以下形式:

其中n是模数中的位数,c是使p成为安全素数的最小正整数。这表明在生成任何这些标准模量时没有使用无法解释的值。
这不是灵丹妙药。对于大量随机选择的常数导致弱点的算法,选择过程中可调整元素的数量可能会使得看似简单的常数足够大,以至于可以搜索插入后门的常数。幸运的是,DH 似乎对它的素数很挑剔,这变得有点困难。尽管如此,最好简单地使用 π,而不是使用知名文档的二进制表示,或者更模糊但仍然是无理数的数字,或者像您家庭的出生日期这样的个人信息。π 提供均匀的随机分布并且是非理性的,因此它适用于所有不需要在特定范围内且不需要保密的常数。
不可预测的公共随机性
如果这种确定性生成将允许对手能够为自己预先计算未来的模量(并因此预测未来的输出)这一事实是有问题的,那么将需要一个分布式共享随机协议来确保未来的输出是不可预测的。这是由 Tor Project 完成的,名为Shared Randomness Protocol。数值无法提前预测,但可以验证为过去已发布。Tor 协议每天 00:00 UTC 在其共识文档中发布一个新值。这些值可用于生成新的 DH 模量,例如通过将其输入 DRNG。
一个图表显示了他们的方法提供的属性、安全数字(nothing-up-my-sleeve numbers)和共享随机性(如 Tor 的协议)之间的比较:
+---------------+-------------+--------------+-------------+----------------+
| | Value known | Reproducible | Predictable | Trust required |
+---------------+-------------+--------------+-------------+----------------+
| Their method | no | no | no | yes |
| Safe numbers | yes | yes | yes | no |
| Shared random | yes | with value | no | low |
+---------------+-------------+--------------+-------------+----------------+
候选素数生成过程可以这样描述:
第一种方法从内部熵源中选择k,例如 Linux 内核的熵池。第二种方法从一个无所谓的数字中选择k,例如 π。第三种方法从不可预测的公共随机值中选择k,例如 Tor 的当前共享随机值。由您决定其中哪些提供满足您的威胁模型的属性。您最好在本地生成自己的参数,因为这不会为您隐藏初始种子,可以用种子重现,不可预测,并且不需要信任。