返回首页

介绍
RSA要求,我们选择了两个随机素数,p和q,并使用它们来生成一个数N = P * Q。 n是因为它只有一个半素数两个因素(除了1号)。在试图通过研究不同的方法来了解保,一种方法是尝试推断出重要P Q值。可以用来分解N = P * Q除数p和q的总和。背景
实施的方法之一,使用下列多项式保问题的一个半素数n表示:

x^2 - (p+q)x + pq = 0

这允许我们使用二次方程式[2]通过设置系数来推断的因素p和q = 1,B = - (PQ),C = PQ,在一般方程:{C}
因此,进入二次公式[2]替换:
x = (-b +- sqrt(b^2 ?4ac))/2

,我们有以下解决方案:{体C3}
作为一个简单的例子,考虑N = 3 * 7 = 21。现在,我们有:{的C4}
,鉴于我们二次方程的使用,产生的公式:{C5的}
解决的情况下:{5233}
,为的情况下:{C7-}
这让我们重现3和7的因素。这意味着,如果我们可以推断出的总和PQ不知何故,我们可以平凡因子n。
我们注意到,我们有:{C8的}
我们可以现蕾PQ和p证明这种说法Q,和解决??
          p^2 + 2 * pq + q^2 ?[p^2 ?2 *pq + q^2] = 4 * pq

          p^2 + 2 * pq + q^2 ?p^2 + 2 *pq ?q^2 = 4 * pq

                      2 * pq + 2 * pq = 4 * pq

                              4 * pq = 4 * pq

鉴于此,我们可以重申保问题作为半素勾股定理的应用:{C10的}C = PQ,A = P Q
,B = SQRT(4 * PQ),从而?{C11的}
这是因为:{C12的}
这是公式2。利用这一点,我们可以写P Q是:
p + q = sqrt((p ?q)^2 + 4 * pq)         (Equation 3)

从勾股定理如下。
鉴于3方程,并注意到,右手方必须是一个完美的正方形,在我们生产整数分解为n,我们可以制定一个分解算法是O((P Q)/ 2?):
#include <stdio.h>

#include <stdlib.h>

#include <math.h>



int

main(int argc, char **argv)

{

    if(argc != 2) {

         fprintf(stderr, syntax: factor semi_prime\n?;

         return 1;

    }

    {

         int n = strtoul(argv[1], NULL, 10);

         int i  = 2, j = 0, k = 0, trials = 0, p = 0, q = 0;

         if((n % i) == 0) {

             /* Divisible by 2. */

             printf(n=%d p=%d q=%d trials=1\n? n, i, p/i);

             return 0;

         }

         for(; i < n; i += 2, ++trials) {

              j = ( i * i );

              j = j + 4 * n;

              k = (int)sqrt(j);

              if((k * k) == j) {

                  /* k == p + q, i == p ?q */

                              p = (k + i) / 2; 

                  q = (k ?i) / 2;

                  printf(n=%d p=%d q=%d trials=%d\n?n,p,q,trials);

                  return 0;

              }

         }

    }

    return 0;

}

,它应该是明确的,该算法是O((P?Q)/ 2)。当我们找到一个完美的正方形以下时,如果声明是真实的,这是确定的,该算法停止:
if ((k * k) == j)

,而发生这种情况时,我恰恰是等于p?问。由于我们指望在i == 2开始了2倍,我们只需要一半的步骤,以便找到一个理。其中的因素之一,p或q,2号的情况下被视为一个特殊的情况。此外,的情况下,p和q是相同的号码(和因此,n是一个完美的正方形),没有被处理的算法。该算法允许我们的因素,不同的半素数因子可数在多项式时间的差异。其中p和q差别很大(将在现实世界的RSA引擎,我们希望的情况下)的情况下,该算法是不可行的。 欧拉披中的应用
现在我们的兴趣转向欧拉披[1]功能。在这里,一些结果的欧拉披函数的定义计算,半素数,N = P * Q其中p和q都是独特的素数。推导出的结果如下:
我们e​​ulerphi(N)等于(P-1)*(Q-1),半素数。然后,我们计算为P * Q eulerphi(N) - P - Q 1,乘以(P-1)*(Q-1)。
然后如下,N = eulerphi(N)PQ - 1。如果我们让X = PQ,我们可以指出,N = eulerphi(N)X - 1。求解X,产量:
X = N - eulerphi(N)1,从而
P Q = N - eulerphi(N)1。
现在,由于多项式:X ^ 2 - (PQ)×PQ,我们可以使用二次公式推导出p和q,n的因素,正如我们前面所述。除了这个时间,值欧拉披计算。因此,如果我们可以计算n的欧拉披,我们可以系数n平凡。
为了实现这个想法,我们使用享有/大奖赛,可从{A1},以下代码的脚本,使用GP:{C16的}
在文章中包含随机生成使用为指导,所需的数位的素数称为gen_prime.java程序。此工具将被用来测试我们的欧拉披基于保。例如,在Linux命令行: {C17的}
将产生一个128位的半素。
现在,我们的Java代码来推断随机素数,另一个脚本用来测试使用这些生成的随机素数的几起案件。
,这些值乘时,被用来作为n值在GP保脚本。
然后,我们让享有解方程,并产生一个结果。的欧拉披应用为例:{C18的}
相比之下,目前的"因素"在Linux的命令产生的结果如下:
运行的测试脚本是可从test_eulerphi.sh。它允许用户自定义的脚本来尝试对128位半素数通过设置脚本的想法素数变量LG(SQRT(2 ^ 128))或64,审判所需的数字,目前有10个。该脚本可以测试这个电流限制两个变量,素数和审判提供不同的价值观,很容易接近。电流限制被认为是84位的素数,允许为168位半素数理。使用代码
的代码来测试的O((PQ)/ 2)算法与C编译器编译,测试与海湾合作委员会在Linux和Windows上的MinGW。运行它需要你传递半素数。多么少的操作数,它需要的因素是,其中的两个因素可数的区别不同的用户会注意到。如编码,该算法使用内置的32位整数类型的默认。享有/大奖赛脚本,您需要在您的计算机上安装此软件第一。然后,你需要编译的Java代码来生成随机素数(gen_prime.java)。在这之后,你可以运行脚本(test_eulerphi.sh)。代码的配置,以分​​解128位的半素数。景点
最好的分解算法,目前存在广义数域筛(GNFS)[1]。为保更大的数字,它建议,该算法调查。另外,也许还有其他技术的基础上计算:(PQ)或(P?Q)N = P * Q的想法,可以发现的。结论
文章显示两种技术涉及二次公式,一个技术与设计考虑到这两个因素之间的差异优势,另一种能分解128位的半素数。后者的实施作为一个脚本,所有的代码都可以在网络上提供进一步的调查和利用。号决议的问题仍将是有趣的。在这个时候,没有人推导出一种方法,运行在多项式时间或证明的决议问题的复杂性,是不是在多项式时间内[1]。使用算法的O((PQ)/ 2)有限的情况下,P-Q是大的。 n的欧拉披使用是有限的,它被推测是难以计算保列印。
总之,到目前为止,在帕里/大奖赛人数最多的使用欧拉披技术因素是一个168位的整数:{C20的}参考文献[1] Pomerance,C放大器;克兰多尔,R.(2005)素数,施普林格,纽约。[2]拉尔森, 稀土,霍斯泰特勒,RP,爱德华兹,BH,放大器; Heyd,DE(1997)初等,Houghton Mifflin公司,纽约。

回答

评论会员: 时间:2
约翰・保罗・沃克:很有趣,文章看起来不错。感谢您显示实际的代码,而不是刚刚发布的数学公式。总是有很大的帮助。什么样的时间范围,我们在这里理这些数字,尤其是在比较其他算法,如一个简单的蛮力搜索,再次感谢,伟大的工作!约翰