【发布时间】:2010-11-11 21:20:05
【问题描述】:
我正在尝试编写 RSA 的实现。问题是我一直在生成大量质数,这些质数涉及生成密钥对。有人可以指出一种快速生成巨大素数/可能素数的方法吗?
【问题讨论】:
标签: encryption rsa primes public-key
我正在尝试编写 RSA 的实现。问题是我一直在生成大量质数,这些质数涉及生成密钥对。有人可以指出一种快速生成巨大素数/可能素数的方法吗?
【问题讨论】:
标签: encryption rsa primes public-key
您不会准确地生成素数。您随机生成一个大的奇数,然后测试该数字是否为素数,如果不是随机生成另一个。有一些素数定律基本上表明你通过随机尝试“命中”素数的几率是 (2/ln n)
例如,如果你想要一个 512 位的随机素数,你会在 2/(512*ln(2)) 中找到一个 因此,您尝试的每 177 个数字中大约有 1 个是素数。
有多种方法可以测试一个数是否为素数,其中一种很好的方法是“Miller-Rabin 测试”as stated in another answer to this question。
此外,OpenSSL 有一个很好的工具来测试素数:
$ openssl prime 119054759245460753
1A6F7AC39A53511 is not prime
【讨论】:
openssl prime -generate -bits 512
2**512-569,发现使用:python -c 'print("\n".join([str(2**512-(x*2+1)) for x in range(1000)]))' | xargs -n 1 openssl prime
看看TrueCrypt 是如何做到的。另外,请查看 Rabin-Miller 以测试大型伪素数。
【讨论】:
由于 U. Maurer,有一种算法可以生成随机可证明(与统计上高概率相反)的素数,这些素数几乎均匀分布在特殊大小的所有素数的集合上。我有一个 Python 实现,它在以下方面相当有效: http://s13.zetaboards.com/Crypto/topic/7234475/1/
【讨论】:
您没有提及您使用的语言。有些内置了执行此操作的方法。例如,在 java 中,这就像在 BigInteger 上调用 nextProbablePrime() 一样简单。
【讨论】:
Mono 有一个 BigInteger 类,它和 java 一样是开源的。你可以看看那些。它们可能是便携式的 :) g'luck
【讨论】: