使用bigint的C实现,无需任何程序集,SSE等。 在2ghz双核奔腾笔记本电脑上运行;什么是 人们应该期待素数的平均时间 在?
中创建对于大于512位的素数是否正常 需要30秒?
2048,4096位等等?
来自security stackexchange question 56214
我最近生成了一些自定义的Diffie Hellmann参数,这些参数基本上只是很长(在下面的情况下为4096位)素数。
由于这一代花了大约2个小时,所以不能在飞行中生成的东西........
这是典型的吗? - 2小时生成4096位密钥...
答案 0 :(得分:4)
不,4小时肯定不典型。
大随机素数的生成取决于以下内容:
使用的随机数发生器非常重要。特别是对于长期密钥,可能需要一个包含大量熵的随机位生成器。这可以通过访问例如例如,在Linux操作系统上/dev/random
。有一个不幸的问题:/dev/random
可能会阻塞,直到收集到足够的熵。取决于可能非常快或非常慢的系统。
现在,第二个是算法。在生成新的DH 参数时,通常会使用生成所谓的安全素数的方法。现在生成安全素数远比生成可能素数的数字困难得多。但是,该素数仅用于DH参数而不是密钥对本身。因此通常不需要产生安全的素数;您只需使用一组预先计算的甚至命名的参数。
实施也可能会有所不同。虽然它不会改变复杂性的顺序,但如果实现比快速实现慢一千倍,它仍可能影响结果。在密码学中,这些差异并非闻所未闻;缓慢的解释语言可能比硬件加速版本慢得多,或者使用CPU或GPU的矢量指令直接运行的版本。
此外,查看数字是否为素数的唯一方法是测试数字。没有确定性的方法来生成素数。问题在于虽然有许多可用的素数,但仍然需要很长时间才能找到。这就是运气因素的来源:可能是您测试的第一个数字是素数,但也可能是您在找到之前经过大量数字。所以最后程序的运行时是不确定的。
对于C程序,在2小时内生成4096位的安全素数似乎有点多。但是,如果它运行一个非常旧的CPU,没有任何SSE,那么它并不一定意味着任何事情都是根本错误的。但是,512位素数需要30秒才能很长。我的笔记本电脑上的OpenSSL命令行只需要0.015(幸运)和1.5(不幸)秒(但那是Core i7)。
注意:
openssl
命令行似乎不支持命名的DH参数;这仅适用于DSA密钥对。