C++ 使用 OpenSSL 1.1.1n 生成新的 EC_KEY

C++ generate new EC_KEY using OpenSSL 1.1.1n

我对这个 OpenSSL 的东西还很陌生,正在尝试学习它。我想生成一个 ec 密钥,但一直无法生成。我目前正在使用 OpenSSL 1.1.1n,这里是基于通过文档和其他人在线示例了解 EC_Key 的片段:

EC_KEY* key = EC_KEY_new_by_curve_name(NID_secp521r1);
if (!key)
{
    ERROR
}

EC_GROUP* ecgroup = EC_GROUP_new_by_curve_name(NID_secp521r1);
if (ecgroup)
{
    printf("ECGROUP IS NOT NULL!\n");
    if (EC_KEY_set_group(key, ecgroup) != 1)
    {
        ERROR
    }
}

if (EC_KEY_generate_key(key) != 1) //<-- fails at this function
{
    ERROR
}

可能这段代码来自旧版本的 OpenSSL,但我没有在更改日志中看到该功能。任何帮助将非常感激!提前致谢!

编辑:

感谢 Jakob 的回答,我能够通过使用 ERR_get_error() 函数获得有关失败的更多信息。我现在看到的错误是 error:2406C06E:random number generator:RAND_DRBG_instantiate:error retrieving entropy

manual 状态:

EC_KEY_generate_key() generates a new public and private key for the supplied eckey object. eckey must have an EC_GROUP object associated with it before calling this function. [...]

在调用函数之前,您是否将 EC_GROUP 与键相关联?有一个名为 EC_KEY_set_group() 的函数可用于添加组对象。可以使用 EC_GROUP_new().

创建这样的对象

顺便问一下,您仍在使用 OpenSSL 1.1.1 是有原因的。我建议使用最新版本的库 OpenSSL 3.0。即使你只是想学习东西,如果你立即学习更新的版本,它可能更有用。

编辑
我不知道,你的 ERROR 宏背后是什么,但学习 OpenSSL 错误处理系统可能是个好主意。像 ERR_print_errors() 这样的函数可能会提示您出了什么问题。

我自己回答,以防有人遇到同样的问题。

我能够通过使用 no-shared 标志构建 OpenSSL 来解决这个问题。我不确定这对获取熵的库有何影响,但这是使 EC_KEY_generate_key() 起作用的参数。

这是我的工作配置命令: perl Configure no-shared VC-WIN32