因子分解算法

本文介绍了三种因子分解算法:Pollard的rho算法,p-1算法和Dixon随机平方算法。Pollard rho算法通过计算序列的gcd寻找因子,p-1算法要求因子的(p-1)有小的素数幂因子,Dixon随机平方算法寻找x ≡ ±y mod n来找到n的因子。这些算法在特定情况下能有效分解大整数,但对大多数RSA模数无效,强调了选择RSA素数时的注意事项。
摘要由CSDN通过智能技术生成

       分解任意的整数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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值