我意识到很难为 Diffie-Hellman 密钥交换生成合适的素数和生成器。
生成它们的最佳方法是什么?如果我有一个,我可以使用它两次吗?根据维基百科,它们被认为是“公共的”。
我意识到很难为 Diffie-Hellman 密钥交换生成合适的素数和生成器。
生成它们的最佳方法是什么?如果我有一个,我可以使用它两次吗?根据维基百科,它们被认为是“公共的”。
其实这并不难。从计算上讲,它可能有点贵。
生成 DSA 关键参数时,您会得到一个好的 DH 模数和生成器;请参阅DSA 规范。您可以选择子组顺序(q,素数)、模数(p,使得p-1是q的倍数)以及大小为q的子组的生成器。OpenSSL可以为您做到这一点。如果您的编程语言和环境对任意长度的整数提供一些支持(Python 和 Java 支持,C 不支持,除非您使用额外的库,例如GMP),您自己实现起来并不难。
或者,已经投入一些精力来生成所谓的“安全素数”:素数整数p使得(p-1)/2也是素数。之所以这样称呼一个安全素数,是因为它不会遭受一些攻击,这些攻击可能会使离散对数在某些“弱”模上变得容易(或至少更容易)——但随机生成的模不会很弱,具有压倒性的概率,所以这里没有真正的担忧。此外,“安全素数”具有允许g=2的优点作为生成器,它提高了计算效率(不是很多,但仍然如此)。生成安全素数需要尝试正确大小的随机奇数,直到找到安全素数:没有什么复杂甚至难以实现,但可能需要几分钟才能完成(大约 400000 中的一个奇数 1024 位整数是安全的)主要的)。或者,您可以使用RFC 3526中的其中一种。
对数百万个不同的密钥对使用相同的组参数(模数、生成器)没有问题。它们确实是“公共数据”。