RSA攻击之wiener攻击

来源:互联网 发布:windows多系统 编辑:程序博客网 时间:2024/06/08 02:09

1、理论基础

    1.1连分数概念

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

       
这里的a0是某个整数,而所有其他的数an都是正整数,可依样定义出更长的表达式。

下面通过实际的例子来学习如何将一个实数转换为连分数
eg:找出3.245的连分数 

1.2重要定理


结合RSA算法,我们理解上面的定理
 
根据上面的定理,我们根据给定的实数a求出p、q。具体过程如下

2、wiener攻击代码实现

在正式开启编程之前,必须明确本次攻击是有前提的:
1.尝试的d有限(可以事先设置一个阈值N,即尝试的次数,本测试案例设置N为10,实际上这远不够,可根据自己的需要适当增大N)
2、
其次,与其他RSA攻击目标不同,这次攻击的目标是d
[cpp] view plaincopy
  1. #include <stdio.h>  
  2. #include <time.h>  
  3. #include "gmp.h"  
  4. #include "iostream"  
  5. #include<string>  
  6. #define N 10  
  7. using namespace std;  
  8. /*本案例为测试工程,所设置的N比较小*/  
  9.   
  10. int main()  
  11. {  
  12.     long tmpb;  
  13.     string ntmp,etmp;  
  14.     mpz_t n_tmp,e_tmp;  
  15.     mpz_init(n_tmp);  
  16.     mpz_init(e_tmp);  
  17.     mpf_t one,e,n;  
  18.     mpf_init(e);  
  19.     mpf_init(n);  
  20.     mpf_init(one);  
  21.     cout<<"请输入e:";  
  22.     cin>>etmp;  
  23.     cout<<"请输入n:";  
  24.     cin>>ntmp;  
  25.   
  26.     mpz_init_set_str(e_tmp,etmp.c_str(),0);//etmp.c_str()就是把string转换成char  
  27.     mpz_init_set_str(n_tmp,ntmp.c_str(),0);  
  28.   
  29.     mpf_set_z (e,e_tmp);  
  30.     mpf_set_z (n,n_tmp);       
  31.     gmp_printf("e:%Ff\n",e);  
  32.     gmp_printf("n:%Ff\n",n);  
  33.     mpf_set_str(one, "1", 10);  
  34.   
  35.     mpz_t m;  
  36.     mpz_init(m);  
  37.     mpz_set_str(m, "10000000000", 10);//已知m  
  38.     gmp_printf("m:%Zd\n",m);  
  39.     mpf_t a[N];  
  40.     for(int i=0;i<N;i++)  
  41.     {  
  42.         mpf_init(a[i]);  
  43.     }  
  44.   
  45.     mpf_t b_tmp[N];  
  46.     for( i=0;i<N;i++)  
  47.     {  
  48.         mpf_init(b_tmp[i]);  
  49.     }  
  50.   
  51.     mpz_t b[N];  
  52.     for( i=0;i<N;i++)  
  53.     {  
  54.         mpz_init(b[i]);  
  55.     }  
  56.   
  57.     mpz_t q[N];  
  58.     for(i=0;i<N;i++)  
  59.     {  
  60.         mpz_init(q[i]);  
  61.     }  
  62.     mpf_div(a[0],e,n);  
  63.     gmp_printf("a[0]:%Ff\n", a[0]);  
  64.     mpf_trunc(b_tmp[0],a[0]);  
  65.     gmp_printf("b_tmp[0]:%Ff\n", b_tmp[0]);  
  66.     tmpb=mpf_get_ui (b_tmp[0]) ;  
  67.     mpz_set_ui(b[0],tmpb);  
  68.     gmp_printf("b[0]:%Zd\n",b[0]);  
  69.     mpz_set_ui(q[0],1);  
  70.     gmp_printf("q[0]:%Zd\n", q[0]);  
  71.   
  72.     mpf_t sub_tmp;  
  73.     mpf_init(sub_tmp);  
  74.     mpf_sub(sub_tmp,a[0],b_tmp[0]);  
  75.     mpf_div(a[1],one,sub_tmp);  
  76.     gmp_printf("a[1]:%Ff\n",a[1]);  
  77.     mpf_trunc(b_tmp[1],a[1]);  
  78.     tmpb=mpf_get_ui (b_tmp[1]) ;  
  79.     mpz_set_ui(b[1],tmpb);  
  80.     gmp_printf("b[1]:%Zd\n",b[1]);  
  81.     mpz_set(q[1],b[1]);  
  82.     gmp_printf("q[1]:%Zd\n",q[1]);  
  83.     mpz_t mul_tmp;  
  84.     mpz_init(mul_tmp);  
  85.     mpz_t ed,result;  
  86.     mpz_init(ed);  
  87.     mpz_init(result);  
  88.     for(i=2;i<N;i++)  
  89.     {  
  90.         mpf_sub(sub_tmp,a[i-1],b_tmp[i-1]);  
  91.         mpf_div(a[i],one,sub_tmp);  
  92.         mpf_trunc(b_tmp[i],a[i]);  
  93.         tmpb=mpf_get_ui (b_tmp[i]) ;  
  94.         mpz_set_ui(b[i],tmpb);  
  95.         mpz_mul(mul_tmp,b[i],q[i-1]);  
  96.         mpz_add(q[i],mul_tmp,q[i-2]);  
  97.         printf("q[%d]:",i);  
  98.         gmp_printf("%Zd\n",q[i]);  
  99.         mpz_mul(ed,e_tmp,q[i]);  
  100.         mpz_powm(result,m,ed,n_tmp);  
  101.         if(mpz_cmp(result,m)==0)  
  102.         {  
  103.             printf("OK,successful");  
  104.             gmp_printf("%Zd\n",q[i]);  
  105.             break;  
  106.         }  
  107.           
  108.     }  
  109.       
  110.             printf("目前破解失败,请调大N重试!");  
  111. }  
先假设N=9449868410449    e=6792605526025  运行程序观察实验结果:
0 0
原创粉丝点击