c++ - 在 C++ 中生成 ECDSA key 对

标签 c++ openssl cryptography ecdsa

我一直在尝试寻找一种在 C++ 中生成 ECDSA 私钥和公钥的方法,但一无所获。

程序应该生成一个ECDSA私钥,然后获取相应的公钥。我确信 OpenSSL 支持这一点,但在他们的文档中找不到任何内容。

编辑:这是基于区 block 链的货币实现,它是用 C++ 编写的。我最初使用 javascript 对其进行原型(prototype)设计,因此我可以访问简单易用的库(例如 javascript.security)来访问 EC 对存储和生成。我无法找到像 openssl 或 cryptopp 这样的 cpp liabys 的任何形式的(相关)文档,所以我没有尝试任何代码。

最佳答案

由于您没有提供任何详细信息,因此示例仅创建一个 256v1 曲线 EC 私钥。

最简单的方法是使用 EVP openssl中的API,主要是EVP_PKEY_keygen API。代码的其余部分是设置 key 类型(在本例中为 EC),然后将 key 保存到文件中。

template<typename T, typename D>
std::unique_ptr<T, D> make_handle(T* handle, D deleter)
{
    return std::unique_ptr<T, D>{handle, deleter};
}

void print_openssl_error(std::string const& function)
{
    char buffer[1024];
    ERR_error_string_n(ERR_get_error(), buffer, sizeof(buffer));
    std::cerr << "openssl function " << function << " failed with " << buffer << "\n";
}

bool create_ec_private_key()
{
    // Create the context for the key generation
    auto kctx = make_handle(EVP_PKEY_CTX_new_id(EVP_PKEY_EC, nullptr), EVP_PKEY_CTX_free);
    if(!kctx)
    {
        print_openssl_error("EVP_PKEY_CTX_new"s);
        return false;
    }

    // Generate the key
    if(1 != EVP_PKEY_keygen_init(kctx.get()))
    {
        print_openssl_error("EVP_PKEY_keygen_init"s);
        return false;
    }

    //  We're going to use the ANSI X9.62 Prime 256v1 curve
    if(1 != EVP_PKEY_CTX_set_ec_paramgen_curve_nid(kctx.get(), NID_X9_62_prime256v1)) 
    {
        print_openssl_error("EVP_PKEY_CTX_set_ec_paramgen_curve_nid"s);
        return false;
    }

    EVP_PKEY *pkey_temp = nullptr;
    if (1 != EVP_PKEY_keygen(kctx.get(), &pkey_temp))
    {
        print_openssl_error("EVP_PKEY_keygen"s);
        return false;
    }

    // write out to pem file
    auto pkey = make_handle(pkey_temp, EVP_PKEY_free);

    auto file = make_handle(BIO_new_file("ecprivatekey.pem", "w"), BIO_free);
    if(!file)
    {
        print_openssl_error("BIO_new_file"s);
        return false;
    }

    if(!PEM_write_bio_PrivateKey(file.get(), pkey.get(), nullptr, nullptr, 0, nullptr, nullptr))
    {
        print_openssl_error("PEM_write_bio_PrivateKey"s);
        return false;
    }

    return true;
}

关于c++ - 在 C++ 中生成 ECDSA key 对,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57277510/

相关文章:

c++ - CredMartialCredentials 用户名提示(智能卡)

c++ - 如何使用模板制作 3D 对象的打印版本? (c++)

c++ - 如何使用 OpenSSL 的 SHA256 函数

c++ - 在 C 函数中返回结构会导致段错误

c++ - 如何在 Windows 中使用 MinGW 构建 OpenSSL?

swift - 为什么无法读取设备上验证的收据数据

c# - 从 C# 到 C++ 的转换

c# - 在源代码中存储加密 key 有多安全?

C++ std::unordered_map 复杂度

c++ - Python 标准库的 C/C++ 等效项