在 C 中用相同的代码生成两个 RSA 密钥

Generate two RSA keys in the same code in C

我试图在 C 中生成多个 RSA 密钥,但我遇到了以下代码的分段错误:

#include <stdio.h>
#include <stdlib.h>
#include <openssl/rsa.h>
#include <openssl/pem.h>
#include <openssl/bio.h>
#include <openssl/bn.h>

int main () {
    RSA* keys = RSA_new();
    BIGNUM* e = malloc(sizeof(BIGNUM));
    BN_generate_prime_ex(e, 16, 1, NULL, NULL, NULL);
    int r = RSA_generate_key_ex(keys, 2048, e, NULL);

    RSA* keys2 = RSA_new();
    BIGNUM* e2 = malloc(sizeof(BIGNUM));
    BN_generate_prime_ex(e2, 16, 1, NULL, NULL, NULL);
    int r2 = RSA_generate_key_ex(keys2, 2048, e2, NULL);

    return 0;

}

但是,以下代码似乎运行良好:

#include <stdio.h>
#include <stdlib.h>
#include <openssl/rsa.h>
#include <openssl/pem.h>
#include <openssl/bio.h>
#include <openssl/bn.h>

int main () {
    RSA* keys = RSA_new();
    RSA* keys2 = RSA_new();
    BIGNUM* e = malloc(sizeof(BIGNUM));
    BIGNUM* e2 = malloc(sizeof(BIGNUM));
    BN_generate_prime_ex(e, 16, 1, NULL, NULL, NULL);
    BN_generate_prime_ex(e2, 16, 1, NULL, NULL, NULL);
    int r = RSA_generate_key_ex(keys, 2048, e, NULL);
    int r2 = RSA_generate_key_ex(keys2, 2048, e2, NULL);

    return 0;

}

谁能帮我弄清楚为什么?

我真的很想实现第一个解决方案,因为我的RSA生成是在一个函数中。

问题是这个语句没有正确初始化 BIGNUM:

BIGNUM* e = malloc(sizeof(BIGNUM));

相反,应该这样做:

BIGNUM* e = BN_New();

Can you explain the difference between allocating memory with malloc and with BN_new ?

BN_New 的来源表明它比 malloc 多一点——它清零内存并设置一个标志。

P.S。使用最新的 OpenSSL,原始程序无法编译(即使在添加缺失的 #include <openssl/bn.h> 之后)。开发者隐藏了BIGNUM的定义,所以不会再出现这个错误了。