原始检查算法

时间:2010-01-13 08:16:46

标签: algorithm cryptography

Primality Check可能是数学中“那些”难题之一。所以,什么是最好和最快的算法可用于检查大量的素数。最原始和最慢的方式可能是:

public static bool IsPrime(int i)
{
    for (var x = 2; x < i - 1; i++)
    {
         if (i % x == 0)
         {
             return false;
         }
    }
    return true;
}

最近我读到使用网格计算阵列使用暴力破解了768位RSA算法。他们如何在巨大的素数上执行蛮力?每个处理单元是否占用一系列数字,将其考虑在内并检查该范围内所有数字的素数?

7 个答案:

答案 0 :(得分:10)

查看维基百科上的primality tests以获取当前算法的指示

关于你的天真实现,请注意,如果数字可以被2整除,你可以立即返回false,这样你就可以检查奇数。另外,如果你没有找到x&lt; = sqrt(i)的因子,那么它就是素数。这是因为如果您确实找到大于sqrt(i)的因子,那么它必须与因子而不是sqrt(i)配对。所以如果你没有先找到那个较小的因子,你就完成了。

在你必须前往https://mathoverflow.net/寻求帮助之前,还有一些技巧可以应用于天真的算法:)

答案 1 :(得分:7)

破解RSA-768没有直接涉及任何素性检查算法,而是需要的是因子分解算法:RSA-768是两个非常大的素数的产物,并且破解它涉及找到这些素数。

使用的分解算法是Lenstra的Number Field Sieve

您可以在此处阅读完整文章:Factorization of a 768-bit RSA modulus

答案 2 :(得分:5)

这应该快得多:

public static bool IsPrime(int i) {        
    // only go up to the root of i 
    // +1 to be save from floating point rounding errors, ceil should work too.
    var max = sqrt(i) + 1;

    // skip numbers dividable by 2, except 2 itself
    if (i == 2) return true;
    if (i % 2 == 0) return false;
    for (var x = 3; x < max; x+=2)  {
         if (i % x == 0)  {
             return false;
         }
    }
    return true;
}

答案 3 :(得分:3)

我认为存在某种工作负载分配,但我怀疑他们是否使用这么简单的算法来进行素性测试。也许他们使用了number field sieveLenstra's elliptic curve factorization

答案 4 :(得分:1)

原始性测试!=分解。

中断特定的RSA公钥并检索私钥,需要进行分解。

构建RSA公钥/私钥对的过程包括素性测试。大多数素性测试不用于因子分解不能产生100%明确的答案,而是probabilistic具有任意高概率(更多的测试迭代=更高的概率)。

从技术上讲,你可以拥有一个快速的deterministic primality test,并且不涉及实际计算相关数字的任何因素。

答案 5 :(得分:0)

我建议使用Fermat's Little Theorem。如果((a ^(x-1))%x)== 1 < &#39; x&#39; 的值为素数 / EM> 即可。 &#39; a&#39; 是任何数字, &#39; x&#39;不等于1,0或2

答案 6 :(得分:-1)

public static bool IsPrime(int i)
{
    for (var x = 2; x < (i/2); x++)
    {
         if (i % x == 0)
         {
             return false;
         }
    }
    return true;
}