c++ - 分离 ECDSA key 对的公钥和私钥

原文 标签 c++ openssl ecdsa key-pair

我正在使用 c++ 尝试在 Elliptic_Curve_Cryptography 之后生成 ECDSA key 对来自 OpenSSL 维基。

#include <iostream>

#include <openssl/obj_mac.h>
#include <openssl/ec.h>

int main()
{
    EC_KEY *key;

    if(NULL == (key = EC_KEY_new_by_curve_name(NID_secp224r1)))
        std::cout << "error on new_curve_by_name" << std::endl;

    if(1 != EC_KEY_generate_key(key)) std::cout << "error in generating keys" << std::endl;
}

key 对生成时没有错误,但我不知道如何在两个不同的对象(EC_POINT 和 BIGNUM)中提取公钥和私钥,知道吗?

最佳答案

我认为你想要的方法是:

EC_KEY_get0_private_key
EC_KEY_get0_public_key

这对我有用:

EC_KEY* key = EC_KEY_new_by_curve_name(NID_secp224r1);

if(!key)
{
    std::cerr << "Error creating curve key" << '\n';
    return EXIT_FAILURE;
}

if(!EC_KEY_generate_key(key))
{
    std::cerr << "Error generating curve key" << '\n';
    EC_KEY_free(key);
    return EXIT_FAILURE;
}

BIGNUM const* prv = EC_KEY_get0_private_key(key);
if(!prv)
{
    std::cerr << "Error getting private key" << '\n';
    EC_KEY_free(key);
    return EXIT_FAILURE;
}

std::cout << "Private key: " << prv << '\n';

EC_POINT const* pub = EC_KEY_get0_public_key(key);
if(!pub)
{
    std::cerr << "Error getting public key" << '\n';
    EC_KEY_free(key);
    return EXIT_FAILURE;
}

std::cout << "Public key: " << pub << '\n';

// Use keys here ...

EC_KEY_free(key);

注意:

使用 C 时像这样的库我经常定义一个自定义的智能指针来处理是否删除。这使得代码不易发生内存泄漏和“异常安全”。

例如我会定义这样的东西:
struct ec_key_dter{void operator()(EC_KEY* k)const{if(k) EC_KEY_free(k);}};
using  ec_key_uptr = std::unique_ptr<EC_KEY, ec_key_dter>;

并像这样使用它:
auto key = ec_key_uptr(EC_KEY_new_by_curve_name(NID_secp224r1));

if(!key)
    throw std::runtime_error("Error creating curve key");

if(!EC_KEY_generate_key(key.get()))
    throw std::runtime_error("Error generating curve key");

if(!EC_KEY_check_key(key.get()))
    throw std::runtime_error("Error checking curve key");

// ... etc ...

// Do not delete the key manually!!

关于c++ - 分离 ECDSA key 对的公钥和私钥,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48685191/

相关文章:

c++ - OpenSSL DER ECDSA 编码错误

c++ - 打印多维数组中的元素-C++

c++ - 可以模拟template <auto X>吗?

ruby - SSL_connect 返回=1 errno=0 状态=未知状态 : unknown protocol

c# - 在哪里可以找到 ECDsaCryptoServiceProvider 类

c++ - ECDSA 未正确签名/验证

c++ - 静脉模拟终止调用openssl ECDSA_SIG_get0函数

c++ - 如何创建过滤 vector 的迭代器?

C++:为什么 decltype (*this) 返回引用?

ssl - 获取 "No certificate matches private key"