我找到了EVP_PKEY_copy_parameters
可以复制的功能EVP_PKEY
。但是一些关于这个函数的文档说它只能用于 DSA/ECC 算法。官方文档(来自openssl.org)没有提到该函数是否可用于 RSA EVP_PKEYs。
EVP_PKEY
(包含 RSA 密钥)的另一个实现可能是这样的:
EVP_PKEY_assign_RSA(RSAPrivateKey_dup(EVP_PKEY_get1_RSA(pkey)));
你有什么建议吗?
我找到了EVP_PKEY_copy_parameters
可以复制的功能EVP_PKEY
。但是一些关于这个函数的文档说它只能用于 DSA/ECC 算法。官方文档(来自openssl.org)没有提到该函数是否可用于 RSA EVP_PKEYs。
EVP_PKEY
(包含 RSA 密钥)的另一个实现可能是这样的:
EVP_PKEY_assign_RSA(RSAPrivateKey_dup(EVP_PKEY_get1_RSA(pkey)));
你有什么建议吗?
如果您真的不需要复制密钥,则可以增加其引用计数,如下所示:
CRYPTO_add(&your_evp_pkey->references, 1, CRYPTO_LOCK_EVP_PKEY);
否则,与您建议的类似(几乎相同)的方法如下:
int pkey_rsa_dup(EVP_PKEY *dst_pkey, EVP_PKEY *src_key) {
// Validate underlying key type - Only allow a RSA key
if (src_key->type != EVP_PKEY_RSA)
return -1;
RSA *rsa = EVP_PKEY_get1_RSA(src_key); // Get the underlying RSA key
RSA *dup_rsa = RSAPrivateKey_dup(rsa); // Duplicate the RSA key
RSA_free(rsa); // Decrement reference count
EVP_PKEY_set1_RSA(dst_pkey, dup_rsa); // Set the underlying RSA key in dst_pkey
// EVP_PKEY_set1_RSA also adjusts the other members in dst_pkey
return 0;
}
参考:Re:如何复制 EVP_PKEY -> 正如@X-Istence 下面RSA_dup
所说,此参考线程中建议的方法在 OpenSSL 中不存在(至少在此更新日期之前)。
在 OpenSSL 1.0.0d 中,EVP_PKEY_copy_parameters
应该可以工作。然而,从实现来看,它似乎只是复制了公共参数:
static int pkey_rsa_copy(EVP_PKEY_CTX *dst, EVP_PKEY_CTX *src) {
RSA_PKEY_CTX *dctx, *sctx;
if (!pkey_rsa_init(dst))
return 0;
sctx = src->data;
dctx = dst->data;
dctx->nbits = sctx->nbits;
if (sctx->pub_exp) {
dctx->pub_exp = BN_dup(sctx->pub_exp);
if (!dctx->pub_exp)
return 0;
}
dctx->pad_mode = sctx->pad_mode;
dctx->md = sctx->md;
return 1;
}
除了 jweyrich 的解决方案之外,另一种简单的方法是先i2d_RSAPrivateKey
输入您的 RSA 密钥,然后d2i_RSAPrivateKey
再输入 - 这是您的副本 :)