【问题标题】:Use of BigInteger.isProbablePrime() to generate cryptographically secure primes使用 BigInteger.isProbablePrime() 生成加密安全素数
【发布时间】:2014-06-02 09:06:51
【问题描述】:

你可以使用 BigInteger.isProbablePrime() 来生成密码安全的素数吗?他们需要什么确定性才能“安全”?

【问题讨论】:

    标签: java cryptography primes biginteger public-key-encryption


    【解决方案1】:

    我没有加密学位,所以对此持保留态度。

    您有两个主要关注领域:

    1. 您的素数必须是不可预测的随机性。这意味着您需要使用诸如SecureRandom 之类的源来生成素数。无论您多么确定原始性,如果它们是可预测的,整个密码系统都无法实现其目标。如果您使用BigInteger(int bitLength, int certainty, Random rnd) 构造函数,则可以传入SecureRandom,因为它是Random 的子类。

    2. 您的潜在质数需要合理确定是质数(我假设您使用的算法依赖于因式分解的难度)。如果你得到一个可能的素数,但攻击者很有可能在 5 分钟内将其分解,因为它有一个从未被你运行的素数测试注意到的因素,那么你的算法有点不走运。通常使用 Rabin-Miller,this answer 声明 15 的确定性对于 32 位整数就足够了。最大为 40 is recommended 的值,超出此范围的任何值均无意义。

    【讨论】:

    • Rabin-Miller 测试通常被认为是过时的。现在大多数应用程序都使用某种 Lucas 伪素数检验,例如 Baillie-Wagstaff 检验或使用 Lucas 伪素数的 Frobenius 变体的 BPSW 检验。除了比对大量碱基的 Miller-Rabin 测试更快之外,这些测试也不太可能出错;事实上,即使是简单的 Baillie-Wagstaff 检验,也没有已知的反例,更不用说更强的变体了。例如,Mathematica 对一千个进行试除法,对基数 2 和 3 进行强伪素数检验,以及对卢卡斯伪素数进行强检验。
    • @user448810 感谢您的提醒,OP 将感谢添加的花絮。
    • @user448810 - MR 测试不被认为是“过时的”,事实上很少有应用程序使用 Lucas 和/或 BPSW 测试。大多数加密包仍然使用 MR 测试,因为它实现起来相对简单,易于理解,并且不需要递归 Jacobi 符号评估的复杂性。绝大多数复合材料都无法通过单次 MR 测试,因此随着素数频率的降低,随机或增量素数搜索通常会更快。
    • @BrettHale:是的,一些加密包仍然使用 MR,因为它足以满足他们的需求,而且如果您使用 GMP 或 BigInteger 进行算术,MR 是内置的。但是某种 BPSW 现在是数学家的标准。请注意,BPSW 与 MR 共享复合材料的快速回报,因为它以强伪素测试开始。还要注意,一个单一的强伪素检验,然后是某种卢卡斯检验比 15 个强伪素检验快,所以 BPSW 比 MR 更快。而且我从未听过有人说计算雅可比符号很复杂。 ;)
    • @user448810 - 这突出了数学理论和密码学要求之间的区别,并适当考虑了复杂性、占用空间、侧信道分析等。您可能比作者更了解这一点GMP 或各种 SSL / 加密库 - 但也有可能他们有充分的理由做出决定。
    【解决方案2】:

    这就是我为我的加密应用程序生成一个安全 BigInteger 的方式。

    这是我的代码:

            BigInteger b = new BigInteger(25, new SecureRandom());
    

    由于加密应用程序也需要它,所以在我看来,获得BigInteger 是正确的。 注意:请记住,SecureRandom 对象在性能方面的成本很高。所以你不应该多次初始化它们。

    在阅读了 cmets 之后,它进一步解决了 这是一种确保您更确定地获得质数的方法。

     BigInteger b =BigInteger.probablePrime(25, new SecureRandom(););
    

    【讨论】:

    • 不是质数。我想补充一下您如何解决 BigInteger 素性检验的概率行为。
    • @hexafraction 好吧,我已经编辑了我的回复。此代码提供了更多获得素数的可能性。如果它足够好,您可以删除您的反对票。
    • 什么不赞成?您的帖子有 3 向上和 0 向下。不过,我对此表示赞成。
    • @hexafraction 大声笑.. 赞成投票。当我看到只有两个赞成票而不是三个,我的回购点更少。所以我想,你更有经验并且有更好的答案让我失望了。也感谢您的知识
    【解决方案3】:

    正如@hexafraction 所说,您需要使用SecureRandom() 来生成加密质量随机数。 Javadoc 说生成的素数是 2^-100 安全的。如果您想要更高的安全性(例如 2^-128 的 AES 等效安全性),则在其上运行更多的 Miller-Rabin test 迭代。每次迭代都会为您提供额外的 2^-2 安全性,因此 14 次迭代将使您达到 2^-128。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-08-11
      • 2013-09-20
      • 2012-10-07
      • 2015-09-09
      • 1970-01-01
      • 1970-01-01
      • 2016-02-08
      相关资源
      最近更新 更多