如何在C中获得一个随机的,非常大的(f.e.4096位)素数? 有没有人知道这个好图书馆?
答案 0 :(得分:5)
你最好的选择是libgmp。
它有一个函数,可以从一些起始编号开始扫描下一个素数(使用Miller-Rabin)。
void mpz_nextprime ( mpz_t rop, mpz_t op );
将rop设置为大于op。
的下一个素数此函数使用概率算法来识别素数。实际上,它是足够的,复合传递的可能性非常小。
是你想要的功能。
您只需根据需要滚动一个随机数,然后触发mpz_nextprime
。运行时应该在O(log(op))
附近(概率)。
您还需要其中一个random number generators。
答案 1 :(得分:1)
通常,您使用强随机数生成器(例如,在Windows上使用CryptGenRandom
)生成一个大的随机数,然后应用一些检查来确定它是否可能是素数。
检查它确实是素数的唯一方法是尝试除以1和(potential-prime / 2)之间的每个数字。如果它们中的任何一个平均分配而没有余数,则它不是素数。由于这将花费不可思议的长时间来计算(这是使用非常大的素数的全部要点),所使用的测试要简单得多,并且基于该数字不太可能具有容易猜测的因素的概率。
如果您正在实施使用加密的软件,我强烈建议您使用经过NIST认证的加密库或模块来生成密钥并进行加密。