吾爱汇编

 找回密码
 立即注册

QQ登录

绑定QQ避免忘记帐号

查看: 1651|回复: 5

[易语言] 【算法】Pollard_rho大整数分解

[复制链接]
gmh5225 发表于 2015-1-2 18:51 | 显示全部楼层 |阅读模式

本帖最后由 gmh5225 于 2015-1-2 22:23 编辑

用途:分解大整数,为RSA公钥私钥 作基础


Pollard_rho原理:
步骤1:
通过某种方法得到a和b(通常用b=(a*a%n+c)%n) 这里的n是要分解的大整数,a是一个随机数,范围[0,n-1],c是一个随机数,范围[1,n-1]   a先备份一个给t。
步骤2:
把b=(a*a%n+c)%n 先备份一个给a ,作迭代用 , 再算d=Gcd(ABS(b-a),n)  如果t==b,则返回n本身,退出循环,随机失败,或者 d不是1而且也不是n,那么此时返回的d就是一个公因子,否则循环判断步骤2。



Pollard_rho优化:
因为随机会失败,所以我们每次随机几次后,如果失败,那么 先把b给t,然后扩大随机次数继续判断,这里扩大的次数是你自己定的,一般来讲,定个2倍,这样一直循环,直到 a==b 返回n本身,或者找到公因子。

下面给出代码:


  1. #define ll __int64
  2. ll Pollard_rho(ll n,ll c)
  3. {
  4.         ll a,b,t,d;
  5.         ll i=1,k=2;//这里的k就是优化过程中的随机  扩大次数,i是计数器
  6.         //srand(time(0)); 这句别加了 太费时间
  7.         a=rand()%n;
  8.         t=a;//先备份一个,因为a会变化
  9.         while (true)
  10.         {
  11.                 ++i;//计数器+1
  12.                 b=(mult_mod(a,a,n)+c)%n;
  13.                 a=b;//要进行迭代,所以这样做
  14.                 if (t==a) return n;//如果a==b  那么返回n本身,退出循环
  15.                 d=gcd(t>b?t-b:b-t,n); //gcd(abs(a-b),n)
  16.                 if (d!=1&&d!=n) return d;// 这个时候d是公因子
  17.                 if (i==k)   //扩大随机的次数,这是一个优化
  18.                 {
  19.                         t=b;//把b的数值给a ,改变之前的a的数值
  20.                         k+=k;//这里把随机次数扩大2倍
  21.                 }
  22.         }
  23. }
复制代码
以上只能返回一个公因子,如果我们想把他的全部公因子都找出来,就需要用递归
递归p和n/p (这里的p是上述函数返回的公因子)   用一个全局数组去保存这些数字
ll AllFactor[100] int count=0//一个数组,一个下标

代码如下:

  1. void Solve(ll n)
  2. {
  3.         if (Miller_Rabin(n)) //如果这个公因子是素数,不可再分,则存入
  4.         {
  5.                 Allfactor[count++]=n;
  6.                 return;
  7.         }
  8.         ll p=n;//先把n备份一个
  9.         while (p==n) //如果失败则会返回n本身,那么继续进入此函数计算
  10.         {
  11.                 p=Pollard_rho(n,rand()%(n-1)+1);
  12.         }
  13.         Solve(p);//递归这个 公因子,看他可不可以再拆分
  14.         Solve(n/p);//递归这个n/p,看看n/p可不可以拆分
  15. }
复制代码
这样 Allfactor数组中存的就是拆分的因子了,例如n=16  则因子是 2 2 2 2

上面的算法需要Miller_Rabin素数测试函数


评分

参与人数 6HB +11 THX +5 收起 理由
消逝的过去 + 1
zxjzzh + 1 [吾爱汇编论坛52HB.COM]-软件反汇编逆向分析,软件安全必不可少!
agan8888 + 1
雨季 + 3 + 1 评分=感恩!简单却充满爱!感谢您的作品!!.
Scar-疤痕 + 6 + 1 ★★★★★ 热心人,佛祖保佑你事事顺利 ,财源滚滚!!!
520Kelly + 1 + 1 ★★★★★ 热心人,佛祖保佑你事事顺利 ,财源滚滚!!!

查看全部评分

吾爱汇编论坛-学破解,防破解!知进攻,懂防守!逆向分析,软件安全!52HB.COM
520Kelly 发表于 2015-1-2 19:09 | 显示全部楼层
吾爱汇编论坛-学破解,防破解!知进攻,懂防守!逆向分析,软件安全!52HB.COM
Scar-疤痕 发表于 2015-1-2 19:33 | 显示全部楼层

膜拜楼主,学习了!谢谢
吾爱汇编论坛-学破解,防破解!知进攻,懂防守!逆向分析,软件安全!52HB.COM
lucious 发表于 2015-1-5 02:08 | 显示全部楼层
吾爱汇编论坛-学破解,防破解!知进攻,懂防守!逆向分析,软件安全!52HB.COM
惜缘情 发表于 2015-1-5 05:48 | 显示全部楼层

算法好东西
吾爱汇编论坛-学破解,防破解!知进攻,懂防守!逆向分析,软件安全!52HB.COM
xujinwen 发表于 2022-1-8 12:02 | 显示全部楼层
吾爱汇编论坛-学破解,防破解!知进攻,懂防守!逆向分析,软件安全!52HB.COM
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

警告:本站严惩灌水回复,尊重自己从尊重他人开始!

1层
2层
3层
4层
5层
6层

免责声明

吾爱汇编(www.52hb.com)所讨论的技术及相关工具仅限用于研究学习,皆在提高软件产品的安全性,严禁用于不良动机。任何个人、团体、组织不得将其用于非法目的,否则,一切后果自行承担。吾爱汇编不承担任何因为技术滥用所产生的连带责任。吾爱汇编内容源于网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑中彻底删除。如有侵权请邮件或微信与我们联系处理。

站长邮箱:SharkHeng@sina.com
站长QQ:1140549900


QQ|RSS|手机版|小黑屋|帮助|吾爱汇编 ( 京公网安备11011502005403号 , 京ICP备20003498号-6 )|网站地图

Powered by Discuz!

吾爱汇编 www.52hb.com

快速回复 返回顶部 返回列表