对RSA密码的Wiener的低解密指数攻击的C++实现

原创 2006年06月21日 16:47:00

这里提供的是一个简要的实现,虽然简单,但是还是蛮有意思,因为毕竟是一种避开分解因子的攻击RSA的方法。可以看到,在一定的条件下,程序可以由公钥n,b求得私钥

具体思路,证明及伪代码请参考Douglas R.Stinson的《Cryptography Theory and Practice(Second Edition)》,这本书有中文译版,书名是《密码学原理与实践》,冯登国译。

对RSA密码的Wiener的低解密指数攻击的C++实现

 #include<iostream>
#include<math.h>
using namespace std;

const N=10000;
static long q[N],m,Prikey,P,Q;
static int flag=0;

int Euc(long a,long b)//euclidean算法
{
    long r[N];
    r[0]=a;
    r[1]=b;
    m=1;
    while(r[m]!=0)
    {
        q[m]=r[m-1]/r[m];
        r[m+1]=r[m-1]-q[m]*r[m];
        m++;
    }
    m--;
    return r[m];
}

void Wiener(long n,long b)//wiener attack
{
    long c[N],d[N],j;
    double ndot,test,test1;
    double temp,mid,de,delte,pp,qq;
    c[0]=1;
    c[1]=q[1];
    d[0]=0;
    d[1]=1;
    j=1;
    while(j<=m)
    {
        temp=double(c[j])*(b);
        ndot=(temp-1)/double(d[j]);
        test=long(ndot);
       
        if(test==ndot)
        {       
            mid=double(n)-ndot+1.0;
            de=mid*mid-4.0*double(n);
            delte=sqrt(de);
            qq=(mid-delte)/2.0;
            pp=(mid+delte)/2.0;
           
            test=long(pp);
            test1=long(qq);
            if(test==pp && test1==qq && de>=0)
            {               
//                cout<<"p="<<pp<<",q="<<qq<<endl;
                P=pp;Q=qq;
                flag=1;
            }
        }
        j++;
        c[j]=q[j]*c[j-1]+c[j-2];
        d[j]=q[j]*d[j-1]+d[j-2];
    }
    if(!flag) cout<<"...attack failed"<<endl;
}

int Gcd(int a,int b,int &x,int &y)//求同余方程
{
    if(!b)
    {
        x=1;
        y=0;
        return a;
    }
    else
    {
        int r=Gcd(b,a%b,x,y);
        int t=x;
        x=y;
        y=t-(a/b)*y;
        return r;
    }
}


int GetPriKey(int Fn,int Pubkey)//求得密钥d..
{
    int x,y,d;
    d=Gcd(Pubkey,Fn,x,y);
    return (x/d)%Fn;
}

int main()
{
    int rm,i;
    long n,b,Fn;
    double temp0;
//    n=160523347;b=60728973;//样例数据
cout<<"PLEASE INPUT n,b"<<endl; cin>>n>>b; cout<<"Euclidean Algorithm("<<n<<","<<b<<")..."<<endl; rm=Euc(n,b); cout<<"r[m]="<<rm<<endl;for(i=0;i<=m;i++)
    {
        cout<<"q["<<i<<"]="<<q[i]<<endl;
    }
    cout<<"[Wiener Attack]"<<endl;
    Wiener(n,b);
   
    if(flag)
    {
        cout<<"attack successed"<<endl;
        cout<<"now checking presupposition...";
       
        temp0=sqrt(sqrt(n));
        if(temp0>3*Prikey && P>Q && P<2*Q)//初始条件验证
        {
            cout<<"passed"<<endl<<"RESULT"<<endl;
            cout<<"p="<<P<<",q="<<Q<<endl;           
            Fn=(P-1)*(Q-1);
            Prikey=GetPriKey(Fn,b);
            cout<<"Prikey="<<Prikey<<endl;
        }
        else
        {
            cout<<"failed"<<endl;
        }
    }   
    return 0;   
}

相关文章推荐

RSA--低加密指数广播攻击例子

RSA低加密指数广播攻击--脚本例子
  • xuqi7
  • xuqi7
  • 2017年07月20日 21:41
  • 693

RSA攻击之wiener攻击

1、理论基础     1.1连分数概念 详细信息请参阅维基百科(http://zh.wikipedia.org/wiki/连分数) 在数学中,连分数或繁分数即如下表达式:         这...

注册时候使用 RSA 实现前台对密码加密和后台解密

注册时候使用 RSA 实现前台对密码加密和后台解密原理这里就不分析了,直接干货奉上。orchard中写的一个moudle,也就是C# mvc代码。前台加密部分 首先项目中引用三个 js 文件 ...
  • chanzig
  • chanzig
  • 2015年03月01日 04:06
  • 497

【密码学】RSA加解密原理及其Java实现算法

密钥生成RSA的密钥通过如下步骤生成: 选取两个不同的质数p和q为了安全考虑,p和q应该随机选取,并且具有相似的数量级。如果p和q仅仅通过几个数字使得长度不同,那么分解因子更加困难 计算n = pqn...

C++实现RSA加密解密

RSA算法的描述

RSA加密解密C++实现

实现过程: 1 随意选择两个大的质数p和q,p不等于q,计算N=p*q。 2 根据欧拉函数,求得r = (p-1)(q-1) 3 选择一个小于 r 的整数 e,求得 e 关于模 r 的模反元素...

c++实现的公钥密码算法RSA

  • 2009年10月23日 22:03
  • 310KB
  • 下载

RSA加/解密算法——gmp大数库C++实现

gmp库c++接口的资料,网络上相对较少,说几乎没有更
  • dzn9966
  • dzn9966
  • 2014年06月01日 15:13
  • 1961

RSA加解密算法(密码)

  • 2009年03月24日 21:58
  • 913KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:对RSA密码的Wiener的低解密指数攻击的C++实现
举报原因:
原因补充:

(最多只允许输入30个字)