循环中的RSA mpz_powm():seg错误

RSA mpz_powm() in for-loop: seg fault

本文关键字:seg 错误 powm RSA mpz 循环      更新时间:2023-10-16

这是前一个问题的后续问题(现在实际问题不同了):

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

当我执行时,程序进入encrypt(),但seg在第4个cout出错。

记住C++是按值传递的,除非您明确表示使用&运算符通过引用传递。在store_m()中,您在函数内分配和分配给m。这不会起作用,因为您正在按值传递m。因此,main()函数从未看到对m的分配,因为store_m()仅具有m的本地副本。因此,您将一个未初始化的变量传递给encrypt()。要么在main()中分配m,要么像这样声明store_m()

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

BTW:你没有在第四个cout断层。在encrypt()函数准备调用mpz_powm()之后,您就开始分段了。实际崩溃是取消引用的m[i](因为m是单元化的)。