BigInteger .isProbablePrime()的可能用例是什么?

时间:2014-12-11 18:39:57

标签: java primes

The method BigInteger.isProbablePrime()很奇怪;从文档中,这将告诉一个数字是否为素数,概率为1 - 1 / 2^arg,其中arg是整数参数。

它已经存在于JDK很长一段时间了,所以它意味着它必须有用。我在计算机科学和算法(以及数学)方面的有限知识告诉我,知道一个数字是否"可能"并不是真的有意义。一个素数但不完全是素数。

那么,人们想要使用这种方法的可能情况是什么?加密?

6 个答案:

答案 0 :(得分:66)

是的,此方法可用于加密。 RSA encryption涉及找到大质数,有时大约为1024位(约300位)。 RSA的安全性取决于将由这些素数中的2个组成的数字因子相乘而非常困难且耗时的事实。但要使它发挥作用,它们必须是最重要的。

事实证明,证明这些数字也很难。但是Miller-Rabin primality testisProbablePrime使用的素性测试之一,或者检测到数字是复合的还是没有给出结论。运行此测试n次可以让您得出结论,这个数字实际上是复合的,并且有两个 n 的概率。运行100次会产生1 in 2 100 的可接受风险,这个数字是复合的。

答案 1 :(得分:20)

如果测试告诉你一个整数不是素数,你当然可以相信100%。

这只是问题的另一面,如果测试告诉你一个整数是“可能的素数”,你可能会怀疑。用不同的“基数”重复测试允许错误地成功地“模仿”素数(相对于多个碱基是一个强伪素数)的概率可以做得尽可能小。

测试的有用性在于速度和简单性。人们不一定会满足于“可能的素数”作为最终答案的地位,但绝对可以避免浪费时间在几乎所有的复合数字上在引入素数测试的大枪之前使用这个例程

与整数分解难度的比较是一种红色的鲱鱼。众所周知,整数的素数可以在多项式时间内确定,实际上有证据证明米勒 - 拉宾检验扩展到足够多的基数是确定的(在检测质数时,与可能的素数相反),但这假设广义黎曼假设,所以它不太确定(更昂贵)AKS primality test

答案 2 :(得分:18)

BigInteger.isProbablePrime(int)的标准用例是加密。具体而言,某些加密算法(例如RSA)需要随机选择的大质数。然而,重要的是,这些算法并不真正要求这些数字保证是素数 - 它们只需要以非常概率为主。

有多高?好吧,在加密应用程序中,通常会调用.isProbablePrime(),其参数介于128和256之间。因此,非素数通过此类测试的概率小于2 128 < / sup>或2 256

让我们从视角来看:如果你有100亿台计算机,每台计算机每秒产生100亿个可能的素数(这意味着任何现代CPU上每个数字的时钟周期不到一个),并测试这些数字的素数对于.isProbablePrime(128),您平均会期望一个非素数在每1000亿年中一次。

也就是说,如果那些100亿台计算机在不遇到任何硬件故障的情况下运行数千亿年,就会出现这种情况。但实际上,随机宇宙射线更有可能在恰当的时间和地点击中您的计算机,将.isProbablePrime(128)的返回值从false翻转为true,造成任何其他可检测的影响,而不是非素数在该确定性水平上实际通过概率素性测试。

当然,随机宇宙射线和其他硬件故障的相同风险也适用于像AKS这样的确定性素性测试。因此,在实践中,即使这些测试由于随机硬件故障而具有(非常小的)基线误报率(更不用说所有其他可能的错误来源,例如实现错误)。

由于很容易将.isProbablePrime()使用的Miller–Rabin primality test的内在假阳性率推到远低于此基线率的水平,只需重复测试足够多次,因此,甚至重复这么多次,Miller-Rabin测试在实践中仍然比最着名的确定性素性测试(如AKS)快得多,它仍然是加密应用的标准素性测试。

(此外,即使你偶然选择一个强大的伪赝作为你的RSA模数的因素之一,它通常不会导致灾难性的失败。通常,这样的假赝品将是两个(或很少更多)的产品大约一半长度的素数,这意味着你最终得到multi-prime RSA key。只要没有因素小(如果它们是,那么素数测试应该已经抓住它们了,RSA算法仍然可以正常工作,并且关键,虽然对于某些类型的攻击比相同长度的普通RSA密钥稍微弱一点,但如果你没有不必要地吝啬密钥长度。)

答案 3 :(得分:8)

一个可能的用例是测试给定数字的素数(在测试中,它本身有很多用途)。 isProbablePrime算法运行速度比精确算法快得多,因此如果数字失败isProbablePrime,则无需花费更多昂贵的算法运行费用。

答案 4 :(得分:6)

查找可能的素数是密码学中的一个重要问题。事实证明,找到可能的k位素数的合理策略是重复选择随机k位数,并使用类似isProbablePrime()的方法测试它的可能素数。

有关进一步的讨论,请参阅section 4.4.1 of the Handbook of Applied Cryptography

另见Brandt和Damgård的On generation of probable primes by incremental search

答案 5 :(得分:5)

RSA密钥生成等算法依赖于能否确定数字是否为素数。

然而,在将isProbablePrime方法添加到JDK(1997年2月)时,没有经过验证的方法来确定性地确定一个数字是否在合理的时间内是素数。当时最着名的方法是Miller-Rabin algorithm - 一种概率算法,有时会产生误报(即,会将非素数报告为素数),但可以调整以减少误报的可能性,运行时适度增加的费用。

从那时起,已经发现了可以确定性地确定一个数字是否合理地快速起来的算法,例如2002年8月发现的AKS algorithm。但是,应该注意这些算法仍然不是像米勒 - 拉宾一样快。

也许更好的问题是为什么自2002年以来没有向JDK添加isPrime方法。