【问题标题】:Generating REALLY big primes生成非常大的素数
【发布时间】:2010-11-11 21:20:05
【问题描述】:

我正在尝试编写 RSA 的实现。问题是我一直在生成大量质数,这些质数涉及生成密钥对。有人可以指出一种快速生成巨大素数/可能素数的方法吗?

【问题讨论】:

    标签: encryption rsa primes public-key


    【解决方案1】:

    您不会准确地生成素数。您随机生成一个大的奇数,然后测试该数字是否为素数,如果不是随机生成另一个。有一些素数定律基本上表明你通过随机尝试“命中”素数的几率是 (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 中生成素数:openssl prime -generate -bits 512
    • 最大的 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
    【解决方案2】:

    看看TrueCrypt 是如何做到的。另外,请查看 Rabin-Miller 以测试大型伪素数。

    【讨论】:

    • 你为什么认为 TrueCrypt 会生成素数?据我所知,它只使用对称加密。
    【解决方案3】:

    由于 U. Maurer,有一种算法可以生成随机可证明(与统计上高概率相反)的素数,这些素数几乎均匀分布在特殊大小的所有素数的集合上。我有一个 Python 实现,它在以下方面相当有效: http://s13.zetaboards.com/Crypto/topic/7234475/1/

    【讨论】:

      【解决方案4】:

      您没有提及您使用的语言。有些内置了执行此操作的方法。例如,在 java 中,这就像在 BigInteger 上调用 nextProbablePrime() 一样简单。

      【讨论】:

      • 根据该功能的实现方式,如果搜索空间减少,您可能会影响您的密钥选择。
      【解决方案5】:

      Mono 有一个 BigInteger 类,它和 java 一样是开源的。你可以看看那些。它们可能是便携式的 :) g'luck

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-07-23
        • 1970-01-01
        • 2012-10-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多