for循环中的RSA mpz_powm():seg fault

时间:2013-11-21 20:55:34

标签: c++ segmentation-fault rsa gmp

这是previous question的后续问题(现在实际问题不同了):

int main() 
{
    mpz_t p, q, n, phi_n, e, d; 
    mpz_inits(p, q, n, phi_n, e, d, NULL);

    generate_pq(p,q);
    compute_n(n,p,q);

    compute_phiN(phi_n,p,q);
    mpz_clear(p,q,NULL);

    select_e(e,phi_n);

    compute_d(d,e,phi_n);
    mpz_clear(phi_n);

    mpz_t* m;
    int size=0;
    store_m(m,size);

    mpz_t* c;
    encrypt(c,m,size,e,n);
    return 0;
}

以下是相关功能:

void store_m(mpz_t m[], int& size) 
{ /* m = original message */
    printf("\nMessage: ");
    char* buffer = new char[128];
    cin.getline(buffer,128);
    size = strlen(buffer); //size = buffer
    m = new mpz_t[size];
    for(int i=0; i<size; i++) {
        mpz_init(m[i]);
        mpz_set_ui(m[i],(int)buffer[i]);
    }
    delete buffer;
}

void encrypt(mpz_t*& c, mpz_t m[], const int size, 
                 const mpz_t e, const mpz_t n)
{ /* c = cipher */
    cout << "1" << endl;
    c = new mpz_t[size];
    cout << "2" << endl;
    for(int i=0; i<size; i++) {
        cout << "3" << endl;
        mpz_init(c[i]);
        cout << "4" << endl;
        mpz_powm(c[i],m[i],e,n);
        cout << "5" << endl;
        mpz_clear(m[i]);
        cout << "6" << endl;
    } /* c = m^e(mod n) */
    cout << "7" << endl;
}

当我执行时,程序进入加密()但在第4个cout处出现故障。

1 个答案:

答案 0 :(得分:1)

记住C ++是按值传递的,除非您明确表示您使用&运算符通过引用传递。在store_m()中,您正在分配并分配给函数内的m。由于您按值传递m,因此无效。因此,main()函数永远不会看到m的分配,因为store_m()只有m的本地副本。因此,您将未初始化的变量传递给encrypt()。在m中分配main()或像这样声明store_m()

void store_m( mpt_t*& m, int& size);

BTW:你不是在第4 cout分段。在encrypt()函数准备调用mpz_powm()之后,您就会立即进行分段。实际崩溃是取消引用m[i](因为m是单元化的。)