分解任意的整数n时,我们自然要寻找n的一个非平凡因子,如要把n分解为素数乘积,可以先用随机素性检测法进行测试,再对不是素数的因子进一步的分解。
那么对RSA的公开模数n,我们如果能找到n的非平凡因子意味着RSA公钥体系的崩塌。当下整数因子分解最快的一般性算法是数域算法(NFS),这个算法在合理假设下期望的运行时间为O(exp(c(logN)^1/3 * (loglogN)^2/3)),这意味着NFS不是多项式算法而是亚指数时间算法。
下面我们来介绍3种典型的因子分解算法,这些算法是对某些特定的大整数为有效的算法,但对绝大多数没有影响,所以不会破坏RSA公钥体系的崩塌,但是同时,这也提醒了我们,在选择RSA的素数或模时要加以小心
一.Pollard “rho”算法
Pollard提出了一个有效的蒙特卡洛方法来寻找大整数的一个非平凡因子,我们称之为Pollard “rho”算法。
我们对要分解的正整数n,选取一个初始值x0,并构造一个适当的函数f,递归计算xi=f(xi-1)mod n,对不同的i,j,利用欧几里得算法计算gcd(xi-xj,n)。如果对某i,j有1 < gcd(xi-xj,n)< n,则意味着找到了n的一个非平凡因子,用这种方法得到的未必是n的最小因子,也未必是素数,甚至找到的可能是n自己,只是概率很小罢了。
注:
- {xn}的值会周期性的出现:这是因为Z/nZ是有限集,肯定存在i,j,使得xi≡xj(mod n),则有f(xi)≡f(xj)(mod n),即xi+1≡xj+1(mod n),从而迭代下去,对任意整数d>0,我们有xi+d≡xj+d(mod n)
- 算法最重要的一步是选取适当的函数f,通常选一个整系数的多项式,如f(x)=x^2+1。如果算法失败的话,我们则选取不同的初始值或者不同的函数f重新运行算法。
Pollard p-方法
input:f,x:= x0
x’:= f(x) modn
p = gcd(x-x’,n)
if p = 1
do x = f(x) mod n
x' = f(x') mod n
p = gcd (x-x’,n)
if p = n
output “失败”
else
output p
代码:
C++参考代码:http://blog.csdn.net/maxichu/article/details/45459533
说明:
上述算法实际是通过计算x2i - xi与n的最大公因子来寻找n的一个因子p,假设对某个i<j,有xi≡xj(mod p),令l=j-i,则有xl