首页 > 解决方案 > 如何在 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, &param_array) == 0)
        throw std::runtime_error("cannot read parameters");

    OSSL_PARAM *cur_param;
    int i = 0;
    do {
        cur_param = &param_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++11opensslcryptographyrsa

解决方案


推荐阅读