【问题标题】:Miller-Rabin primality test gives wrong answerMiller-Rabin素数检验给出错误答案
【发布时间】:2016-03-19 07:07:32
【问题描述】:

我正在尝试制作 RSA 算法。为此,我需要 rabin-miller+witness+模幂(至少我需要使用它)。当我生成随机数以检查它们是否是素数时,问题就出现了,结果是非素数是 rabin-miller 算法的素数。有人可以帮我看看我失败的地方。 提前致谢。

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;
}

【问题讨论】:

  • 我认为这是一个练习,而不是您计划在实际产品中发布的代码?前者很好;对于后者 - 只需使用专家编写的库! (你不能为“这个库不安全吗?”编写测试)
  • 我刚刚看到您使用的是“int”——通常是 32 位。鉴于 uint512_t 对 RSA 来说绝对不安全,这显然是“练习”而不是“生产”。
  • 当我说“(至少我必须使用它)”时,我以为每个人都会理解,如果你没有。是的,这是一个练习,它有效,我只是在调用函数时遇到了问题。无论如何感谢那些帮助过的人。

标签: c++ primes primality-test


【解决方案1】:

我没有看过所有的代码,但是你的 mod_exp 函数肯定是不正确的。 (d*d)%n(d*a)%n 这两个表达式都容易溢出,如果溢出就会得到错误的结果。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-30
    • 1970-01-01
    • 1970-01-01
    • 2016-02-27
    • 1970-01-01
    • 2011-01-15
    相关资源
    最近更新 更多