2015-12-13 10 views
0

Я пытаюсь сделать алгоритм RSA. Для этого мне нужно показать rabin-miller + witness + modular exponentiation (по крайней мере, я должен использовать это). Проблема возникает, когда я генерирую случайные числа, чтобы проверять с помощью ранинового мельника, если они являются простыми числами, и в результате нечетные числа являются первичными для алгоритма рабина-мельника. Может кто-нибудь дать мне руку, чтобы увидеть, где я терпеть неудачу. Спасибо заранее.Тест примитивности Миллера-Рабина дает неправильный ответ

int mod_exp(int a, int b, int n){ 

    int d = 1,i,j=0; 
    int binary[15]; 
    for(i=0;i<=15;i++){ 
     binary[i] = -1; 
    } 
    i=0; 
    do{ 
     binary[i]=(b%2); 

      if((b%2)==1) 
       b=(b-1)/2; 
      else 
       b=b/2; 
     i++; 
    }while(b!=0); 

    do{ 
     d= (d*d)%n; 
     if(binary[i]==1) 
      d=(d*a)%n; 
     i--; 
    }while(i!=-1); 
    return d; 

} 

bool wittness(int a, int n){ 
    int u=n-1,k=0; 
    long x, temp; 
    while(u%2== 0){ 
     u=u/2; 
     k++; 
    } 
    x=mod_exp(a,u,n); 
    for(int i=1;i<=k;i++){ 
     temp=x; 
     cout<< "primera x:"<<x<<endl; 
     x=long(x*x)%n; 
     cout<< "segunda x:"<<x<<endl; 
     if(x==1 && temp!=1 && temp != n-1) 
      return true; 

    } 
    if(x!=1) 
     return true; 
    return false; 

} 


bool miller_rabin(int n, int s){ 

    int a,j; 
    srand(time(NULL)); 

    for(j = 0; j<=s;j++){ 

     a=rand()%s+1; 
     if(!wittness(a,n)) 
     return false; 
    } 
    return true; 
} 
+0

Я считаю, что это упражнение, а не код, который вы планируете выпустить в реальном продукте? Первое прекрасно; для последнего - просто используйте библиотеку, написанную экспертами! (Вы не можете написать тесты для «эта библиотека небезопасна?») –

+0

Я только что видел, что вы используете «int» - обычно 32 бит. Учитывая, что uint512_t безнадежно небезопасен для RSA, это * четко * «упражнение», а не «производство». –

+0

Я думал, что все уйдут, когда я скажу «(по крайней мере, я должен использовать это)« извините, если вы этого не сделали. Да, это упражнение, и это работает, у меня просто были проблемы с вызовами функций. Спасибо всем тем, кто помогал. – Lolo

ответ

1

Я не смотрел весь код, но ваша функция mod_exp, безусловно, неверна. Два выражения (d*d)%n и (d*a)%n оба восприимчивы к переполнению, и если происходит переполнение, вы получите неверный результат.

 Смежные вопросы

  • Нет связанных вопросов^_^