生成大素数需要多长时间?

时间:2017-08-20 04:04:32

标签: cryptography arbitrary-precision

使用bigint的C实现,无需任何程序集,SSE等。 在2ghz双核奔腾笔记本电脑上运行;什么是 人们应该期待素数的平均时间 在?

中创建

对于大于512位的素数是否正常 需要30秒?

2048,4096位等等?

来自security stackexchange question 56214

  

我最近生成了一些自定义的Diffie Hellmann参数,这些参数基本上只是很长(在下面的情况下为4096位)素数。
  由于这一代花了大约2个小时,所以不能在飞行中生成的东西........

这是典型的吗? - 2小时生成4096位密钥...

1 个答案:

答案 0 :(得分:4)

不,4小时肯定不典型。

大随机素数的生成取决于以下内容:

  1. 随机数生成器中的速度和熵
  2. 使用的算法来测试候选人的素数
  3. 实施
  4. 和运气
  5. 使用的随机数发生器非常重要。特别是对于长期密钥,可能需要一个包含大量熵的随机位生成器。这可以通过访问例如例如,在Linux操作系统上/dev/random。有一个不幸的问题:/dev/random可能会阻塞,直到收集到足够的熵。取决于可能非常快或非常慢的系统。

    现在,第二个是算法。在生成新的DH 参数时,通常会使用生成所谓的安全素数的方法。现在生成安全素数远比生成可能素数的数字困难得多。但是,该素数仅用于DH参数而不是密钥对本身。因此通常不需要产生安全的素数;您只需使用一组预先计算的甚至命名的参数。

    实施也可能会有所不同。虽然它不会改变复杂性的顺序,但如果实现比快速实现慢一千倍,它仍可能影响结果。在密码学中,这些差异并非闻所未闻;缓慢的解释语言可能比硬件加速版本慢得多,或者使用CPU或GPU的矢量指令直接运行的版本。

    此外,查看数字是否为素数的唯一方法是测试数字。没有确定性的方法来生成素数。问题在于虽然有许多可用的素数,但仍然需要很长时间才能找到。这就是运气因素的来源:可能是您测试的第一个数字是素数,但也可能是您在找到之前经过大量数字。所以最后程序的运行时是不确定的。

    对于C程序,在2小时内生成4096位的安全素数似乎有点多。但是,如果它运行一个非常旧的CPU,没有任何SSE,那么它并不一定意味着任何事情都是根本错误的。但是,512位素数需要30秒才能很长。我的笔记本电脑上的OpenSSL命令行只需要0.015(幸运)和1.5(不幸)秒(但那是Core i7)。

    注意:

    • RSA通常需要两个密钥大小一半的素数,这些素数通常不是安全素数。因此,生成DH密钥对(使用新参数)将比生成相同大小的RSA密钥对花费
    • 如果可能,请尝试使用预定义的DH参数。不幸的是,openssl命令行似乎不支持命名的DH参数;这仅适用于DSA密钥对。
    • 如果您想要速度,请尝试使用预定义参数的Elliptic Curve DH。生成密钥几乎与生成256个随机位一样快(例如,对于P-256曲线)。直到Quantum Crypto过时,这些键才会比DH键更强大。