首页
社区
课程
招聘
[旧帖] [原创]RSA解密过程模拟程序 0.00雪花
发表于: 2009-5-14 21:12 1701

[旧帖] [原创]RSA解密过程模拟程序 0.00雪花

2009-5-14 21:12
1701
很基本的东西,给初学者看看吧……

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define Int unsigned __int64

Int inline Modular(Int a,Int b,Int n)
{
        Int sum=0;
        Int k=b;
        if(a==0)return 0;
        while(k)
        {
                if(k&1)
                {
                        if((sum=sum+a)>n) sum-=n;
                }
                k>>=1;
                if((a<<=1)>n) a-=n;
        }
        return sum;
}

Int inline Greatest_common_divisor(Int a,Int b)  //a>b
{
    if(b==0)return a;
    return Greatest_common_divisor(b,a%b);
}

Int Extend_Greatest_common_divisor(Int a,Int b,Int &x,Int &y,Int t)  //a>b
{
  Int temp,d,m;
  if(b==0)
  {
        x=1;
        y=0;
        return a;
  }
  d=Extend_Greatest_common_divisor(b,a%b,x,y,t);
  temp=x;
  x=y;
  m=a/b%t;
  y=(temp+t-Modular(m,x,t))%t;
  return d;
}

Int Pollard_Rho(Int n)
{
l1:
        Int d;
        time_t t;
        srand((unsigned)time(&t));
        Int x=rand()%n;
        Int y=x;
        Int i=1;
        Int k=2;
        Int c=rand()%(n-2)+1;
        Int T=80000;
        while(T--)
        {
                i++;
                x=Modular((x+n-c)%n,(x+c)%n,n);
                d=Greatest_common_divisor(2*n+y-x,n);
                if(d!=1&&d!=n)return d;
                if(i==k)
                {
                        y=x;
                        k<<=1;
                }
        }
        goto l1;
}

Int Mod_2(Int b,Int n,Int p)
{
        Int k=n;
        Int a=1;
        while(k>0)
        {
                if(k&1)
                {
                        a=Modular(a,b,p);
                }
                k>>=1;
                b=Modular(b,b,p);
        }
        return a;
}

int main()
{
        Int C,E,N,p,q,t;
        Int x,y;
        while(EOF!=scanf("%I64u%I64u%I64u",&C,&E,&N))
        {
                p=Pollard_Rho(N);
                q=N/p;
                t=(p-1)*(q-1);
                if(E<t) Extend_Greatest_common_divisor(t,E,y,x,t);
                else Extend_Greatest_common_divisor(E,t,x,y,t);
                printf("%I64u\n",Mod_2(C,x,N));
        }
        return 0;
}

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (4)
雪    币: 171
活跃值: (10)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
2
这里有个函数被换成了星星了,那个函数是求最大公约数的,由于误和某词汇拼音缩写雷同……
2009-5-14 21:15
0
雪    币: 44229
活跃值: (19955)
能力值: (RANK:350 )
在线值:
发帖
回帖
粉丝
3
你用别的词代替一下。另请收短信。
2009-5-16 11:02
0
雪    币: 171
活跃值: (10)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
4
把源代码改了一下,没有星星了
2009-5-17 22:16
0
雪    币: 1022
活跃值: (31)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
5
如果再稍稍加点注解的话就好了,
比如:Pollard_Rho(Int n),Mod_2(Int b,Int n,Int p)函数的功能和参数说明
(虽然看看也能大概明白,但有说明就能直接用了不用花更多功夫)
2009-11-8 10:36
0
游客
登录 | 注册 方可回帖
返回
//