在 C++ 中生成 ECDSA 密钥对
Generate ECDSA keypair in C++
我一直在尝试寻找一种在 C++ 中生成 ECDSA 私钥和 public 密钥的方法,但一无所获。
程序应该生成一个ECDSA私钥,然后得到对应的public密钥。我确定 OpenSSL 支持此功能,但在其文档中找不到任何内容。
编辑:这是用于基于区块链的货币实现,它是用 C++ 编写的。我最初在 javascript 中制作了它的原型,因此我可以访问像 javascript.security 这样简单易用的库来访问 EC 对存储和生成。我无法为 openssl 或 cryptopp 等 cpp libys 找到任何形式的(相关)文档,所以我没有尝试过任何代码。
由于您没有给出任何细节,它的示例只是创建一个 256v1 曲线 EC 私钥。
最简单的方法是使用EVP API in openssl, mainly the EVP_PKEY_keygenAPI。其余代码设置密钥类型(在本例中为 EC),然后将密钥保存到文件中。
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++ 中生成 ECDSA 私钥和 public 密钥的方法,但一无所获。
程序应该生成一个ECDSA私钥,然后得到对应的public密钥。我确定 OpenSSL 支持此功能,但在其文档中找不到任何内容。
编辑:这是用于基于区块链的货币实现,它是用 C++ 编写的。我最初在 javascript 中制作了它的原型,因此我可以访问像 javascript.security 这样简单易用的库来访问 EC 对存储和生成。我无法为 openssl 或 cryptopp 等 cpp libys 找到任何形式的(相关)文档,所以我没有尝试过任何代码。
由于您没有给出任何细节,它的示例只是创建一个 256v1 曲线 EC 私钥。
最简单的方法是使用EVP API in openssl, mainly the EVP_PKEY_keygenAPI。其余代码设置密钥类型(在本例中为 EC),然后将密钥保存到文件中。
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;
}