C++OpenSSL RSA_free如果也使用EVP_PKEY_free,则会给出分段错误

C++ OpenSSL RSA_free give Segmentation fault if EVP_PKEY_free is also used

本文关键字:free 分段 错误 EVP 如果 RSA C++OpenSSL PKEY      更新时间:2023-10-16

我正在编写一个小程序来测试RSA上的一个旧问题。我需要访问模数的质因数。所以我的代码是

int RSAKeyGen(int keySize) {
EVP_PKEY *pkey  = EVP_PKEY_new();
BIGNUM *bn = BN_new();
BN_set_word(bn, RSA_F4);
RSA *rsa = RSA_new();
RSA_generate_key_ex(rsa, keySize, bn, NULL);
EVP_PKEY_assign_RSA(pkey, rsa);
const BIGNUM *p;
const BIGNUM *q;
RSA_get0_factors(rsa, &p,&q);
BN_print_fp(stdout, p);
puts("n");
BN_print_fp(stdout, q);
RSA_free(rsa);
EVP_PKEY_free(pkey);
BN_free(bn);
return 0;
}

同时拥有EVP_PKEY_free(pkey);RSA_free(rsa);给予

`Segmentation fault (core dumped)`

评论其中一个工作正常,除了可能有些东西没有被释放。更改了顺序,但不起作用。

  • 其中只有一个就足以正常工作吗?

>请参阅此处的EVP_PKEY_assign_RSA文档:

https://www.openssl.org/docs/man1.1.1/man3/EVP_PKEY_assign_RSA.html

如该页面上所述:

EVP_PKEY_assign_RSA((、EVP_PKEY_assign_DSA((、EVP_PKEY_assign_DH((、EVP_PKEY_assign_EC_KEY((、EVP_PKEY_assign_POLY1305(( 和 EVP_PKEY_assign_SIPHASH(( 也将引用的键设置为键,但它们在内部使用提供的键,因此当释放父 pkey 时,键将被释放。

因此,换句话说,通过EVP_PKEY_assign_RSA()调用分配的密钥的所有权将转移到EVP_PKEY。释放EVP_PKEY时,也会释放基础RSA密钥。因此,成功调用EVP_PKEY_assign_RSA()后,不得在基础密钥上调用RSA_free(),否则可能会导致双重释放。