【问题标题】:RSA ... GNU MP: Cannot allocate memory (size=1307836444)RSA ... GNU MP:无法分配内存(大小=1307836444)
【发布时间】:2013-12-06 06:59:08
【问题描述】:

首先,我运行的是 Ubuntu 12.04 32 位。该程序通过将 cin 放入字符缓冲区来执行 RSA 公钥加密。然后,当我调用我的加密函数时,我收到以下错误:

GNU MP: Cannot allocate memory (size=1307836444)
Aborted (core dumped)

当我更改生成的 p,q 键的位大小时,此运行时错误的大小会增加。此错误仅在我调用 encrypt() 后发生。

void generate_pq(mpz_t p, mpz_t q);
void compute_n(mpz_t n, const mpz_t p, const mpz_t q);
void compute_phiN(mpz_t phi_n, const mpz_t p, const mpz_t q);
void select_e(mpz_t e, mpz_t phi_n);
void compute_d(mpz_t d, mpz_t e, mpz_t phi_n);
void store_m(mpz_t m[], int& size);
void encrypt(mpz_t c[], mpz_t m[], const int size, 
                 const mpz_t e, const mpz_t n);
void decrypt(mpz_t m2[], mpz_t c[], const int size, 
                 const mpz_t d, const mpz_t n);

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

    // 1. Generate p,q; compute n
    generate_pq(p,q);
    compute_n(n,p,q);
    // 2. Compute phi(n)=(p-1)*(q-1)
    compute_phiN(phi_n,p,q);
    mpz_clear(p); mpz_clear(q);
    // 3. Select encryption key e
    select_e(e,phi_n);
    // 4. Compute decryption key d
    compute_d(d,e,phi_n);
    // 5. m = message to be encrypted
    mpz_t* m;
    int size=0;
    store_m(m,size);
    // 6. c = encrypted message
    mpz_t* c;
    encrypt(c,m,size,e,n);
    // 7. m2 = decrypted message 
    //mpz_t* m2;
    //decrypt(m2,c,size,d,n);
    return 0;
}

使用...编译

g++ -o rsa partb.cc -lgmpxx -lgmp

我尝试在 m、c 和 m2 的 for 循环中使用 mpz_clear。不用找了。这是加密函数:

void store_m(mpz_t m[], int& size) 
{
    printf("Message: ");
    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]);
    }
}

void encrypt(mpz_t c[], mpz_t m[], const int size, 
                 const mpz_t e, const mpz_t n)
{ /* c = cipher */
    c = new mpz_t[size];
    for(int i=0; i<size; i++) {
        mpz_init(c[i]);
        mpz_powm(c[i],m[i],e,n);
        mpz_clear(m[i]);
    } /* c = m^e(mod n) */
}

也许问题是我没有释放足够多的已声明和初始化的 mpz_t?我尝试清除 2 或 3 个 mpz_t,但似乎没有效果。请指教。

编辑!!!!!!!!!

将段错误隔离到此语句:

mpz_powm(c[i],m[i],e,n);

【问题讨论】:

  • +1,我在Cannot allocate memory遇到了同样的问题

标签: c++ encryption rsa gmp


【解决方案1】:

您的变量mpz_t* c 不会被encrypt 函数更改,因此在encrypt 返回后它仍然指向一个随机(可能无效)地址。试试吧:

void encrypt(mpz_t*&amp; c,...

【讨论】:

  • 好的,所以我从参数中的 c 中删除了括号并添加了 '*&'。现在它只是出现了一个段错误。
  • 我想原来的问题已经回答了。谢谢!如果你想解决 seg 错误,我开始了一个新问题:stackoverflow.com/questions/20131671/…
  • 所有mpz_t* 变量都在函数参数中附加了*&amp;。仍然存在段错误。
猜你喜欢
  • 1970-01-01
  • 2017-07-20
  • 1970-01-01
  • 2021-12-02
  • 2017-04-08
  • 2015-05-08
  • 1970-01-01
  • 2012-06-10
相关资源
最近更新 更多