产生大素数需要多长时间?
不,4个小时绝对不是典型的。
大随机素数的产生取决于以下几点:
随机数发生器中的速度和熵质数候选测试的算法实施和运气使用的随机数发生器是非常重要的。特别是对于长期密钥,您可能需要一个包含大量熵的随机位生成器。例如,可以通过访问linux操作系统上的/dev/random来实现这一点。有一个不幸的问题:/dev/random可能会阻塞,直到收集到足够的熵。取决于系统可以是非常快的,也可以是非常慢的。
现在,第二个是算法。当生成新的DH参数时,通常使用一种方法来生成所谓的安全素数。现在,生成安全素数要比生成一个可能的素数难得多。但是,这个素数只用于DH参数,而不是密钥对本身。因此,通常不需要生成安全的素数;您可以简单地使用一组预先计算过的参数,甚至是命名的参数。
实现也会带来一些不同。虽然它不会改变复杂性的顺序,但是如果实现比快速实现慢一千倍,它仍然会影响结果。这种差异在密码学中并非闻所未闻;缓慢的解释语言可能比硬件加速版本或直接使用CPU或GPU的矢量指令运行的版本慢得多。
此外,判断一个数字是否为素数的唯一方法是测试这个数字。不存在只生成素数的确定性方法。问题是,尽管有许多,许多素数可用,但仍然需要很长时间才能找到一个。这就是幸运因素的来源:你测试的第一个数字可能是素数,但也可以是在找到一个之前,你要经过大量的数字。因此,最后,该过程的运行时间是不确定的。
对于一个C程序来说,在2小时内生成4096位的安全素数似乎有点麻烦。但是,如果它运行一个非常旧的CPU,没有任何SSE,这并不一定意味着任何事情都是根本错误的。然而,512位质数需要30秒的时间是非常长的。OpenSSL命令行在我的笔记本上只需要0.015秒(幸运)到1.5秒(不幸)(但那是一个核心i7)。
备注:
RSA通常需要两个密钥大小为一半的素数,它们通常不是安全的素数。因此,生成DH密钥对(具有新参数)要比生成相同大小的RSA密钥对花费的时间要长得多。如果可能,尝试使用预定义的DH参数。不幸的是,openssl命令行似乎不支持命名DH参数;这只支持DSA密钥对。如果您想要速度,尝试椭圆曲线DH与预定义的参数。生成密钥的速度几乎和生成256位随机比特一样快(例如,对于P-256曲线)。在量子密码学结束之前,这些密钥要比上面的DH键强得多。