c++11 - 如何在 OpenSSL 3.0 EVP_PKEY api 中仅设置公钥
问题描述
我可以使用这些函数从 OSSL_PARAM 数组中提取公钥和私钥。对于 RSA,我为公钥提取参数“n”,为私钥提取参数“d”(我尝试使用特殊函数通过这些名称获取这些参数,但他们找不到它们并且由于某种原因失败)
std::vector<unsigned char> GetNamedParam(EVP_PKEY *key, const std::string& name) {
OSSL_PARAM *param_array;
if (EVP_PKEY_todata(key, EVP_PKEY_PUBLIC_KEY, ¶m_array) == 0)
throw std::runtime_error("cannot read parameters");
OSSL_PARAM *cur_param;
int i = 0;
do {
cur_param = ¶m_array[i++];
if (std::string(cur_param->key) == name) {
auto data = GetParameterData(cur_param);
OSSL_PARAM_free(param_array);
return data;
}
} while (cur_param->key != nullptr);
throw std::runtime_error("cannot find parameter with name \"" + name + '"');
}
std::vector<unsigned char> GetParameterData(OSSL_PARAM *param) {
BIGNUM *bignum{nullptr};
if(OSSL_PARAM_get_BN(param, &bignum) == 0)
throw std::runtime_error("cannot read bignum");
std::vector<unsigned char> bytes;
int new_size = BN_num_bytes(bignum);
bytes.resize(new_size);
BN_bn2bin(bignum, bytes.data());
return bytes;
}
问题是当我尝试使用相同的方法从原始字节构建新密钥时
// keys_ defined inside object
EVP_PKEY *keys_ {nullptr};
void SetPublicKey(const std::vector<unsigned char> &key) {
auto param_bld = OSSL_PARAM_BLD_new();
BIGNUM *bignum = BN_bin2bn(key.data(), (int)key.size(), nullptr);
OSSL_PARAM_BLD_push_BN(param_bld, key, bignum);
// default rsa exponent
OSSL_PARAM_BLD_push_long(param_bld, "e", RSA_F4);
auto parameters = OSSL_PARAM_BLD_to_param(param_bld);
OSSL_PARAM_BLD_free(param_bld);
auto ctx = EVP_PKEY_CTX_new_id(EVP_PKEY_RSA, nullptr);
if (EVP_PKEY_fromdata_init(ctx) <= 0)
/*error*/
EVP_PKEY_free(keys_);
if (EVP_PKEY_fromdata(ctx, &keys_, EVP_PKEY_KEYPAIR, parameters) <= 0)
/*error*/
OSSL_PARAM_free(parameters);
}
由于某种原因,函数 EVP_PKEY_fromdata() 无法使用我的 OSSL_PARAM 数组创建新密钥。我应该怎么做才能在签名验证端仅初始化公钥(我无法使用所有参数构建完整的密钥对)?
你可以在https://github.com/Valemos/course_work_inverted_index/blob/master/src/session/RSAKeyPair.cpp看到这个类的完整源代码
解决方案
推荐阅读
- c# - 转换字典
> 列出 与 concat 键/值 c# - javascript - 从javascript更改顶部div内的文本后div重叠
- css - materialize.css 中的 materialboxed 不起作用
- pyspark - Pyspark:使用窗口函数按日期将数据框保存到单个 csv?
- python - 为什么当我尝试执行登录时,我没有得到下一页的 html
- javascript - React Native:useState setter 不会重新渲染
- excel - VBA - “可用参考”存储在哪里?
- flutter - 制作新小部件后清除类的列表
- visual-studio-code - 您可以将自定义图标分配给还没有图标的文件类型吗?
- css - Bootstrap 选项卡左侧的意外填充