如何使用 OpenSSL 生成 ECDHE public 密钥?
How to generate an ECDHE public key with OpenSSL?
我正在尝试在 Windows 上使用 OpenSSL 1.0.2a
生成 ECDHE 密钥,并具有以下示例代码:
#include <openssl/crypto.h>
#include <openssl/evp.h>
#include <openssl/err.h>
#include <openssl/pem.h>
#include <openssl/ecdh.h>
int main()
{
OpenSSL_add_all_algorithms(); ERR_load_crypto_strings();
EVP_PKEY_CTX* parameters_context = EVP_PKEY_CTX_new_id(EVP_PKEY_EC, NULL);
EVP_PKEY* cparameters = nullptr;
EVP_PKEY* private_key = nullptr;
if (EVP_PKEY_paramgen_init(parameters_context) != 1) { return 1; }
if (EVP_PKEY_CTX_set_ec_paramgen_curve_nid(parameters_context, NID_sect571k1) != 1) { return 1; }
if (EVP_PKEY_paramgen(parameters_context, &cparameters) != 1) { return 1; }
EVP_PKEY_CTX* key_generation_context = EVP_PKEY_CTX_new(cparameters, NULL);
if (!key_generation_context) { return 1; }
if (EVP_PKEY_keygen_init(key_generation_context) != 1) { return 1; }
if (EVP_PKEY_keygen(key_generation_context, &private_key) != 1) { return 1; }
BIO* bio = BIO_new(BIO_s_mem());
PEM_write_bio_PUBKEY(bio, private_key); // <== This is where things go wrong.
ERR_free_strings(); EVP_cleanup(); CRYPTO_cleanup_all_ex_data();
}
我在其他平台(OSX 和 Debian Linux,使用 gcc
上测试了上述代码,它似乎工作正常(在 valgrind
下没有报告错误) .
当我 运行 它在 Windows 上时,它总是在这一行失败:
PEM_write_bio_PUBKEY(bio, private_key);
我得到这个 "nice" 错误屏幕:
我不知道哪里出了问题:从我能找到的许多教程和文档页面来看,这似乎是正确的做事方式。
在我再花一天时间找出问题所在之前,我想问问社区可能更明智:这是使用 OpenSSL 生成和编写 ECDHE 密钥作为 PEM 格式的正确方法吗?
这确实是 OpenSSL 中的一个错误。
On Tue, Mar 31, 2015, ****** ******* wrote:
>
if (!combine)
*pval = NULL;
我建议删除上面的两行。结构应该是
没有这个就清除并且上面的行对于非指针是错误的
无论如何字段。
史蒂夫。
——史蒂芬·汉森博士。 OpenSSL 项目核心开发者。现已提供商业技术支持,请参阅:http://www.openssl.org
有关详细信息,另请参阅 。
我正在尝试在 Windows 上使用 OpenSSL 1.0.2a
生成 ECDHE 密钥,并具有以下示例代码:
#include <openssl/crypto.h>
#include <openssl/evp.h>
#include <openssl/err.h>
#include <openssl/pem.h>
#include <openssl/ecdh.h>
int main()
{
OpenSSL_add_all_algorithms(); ERR_load_crypto_strings();
EVP_PKEY_CTX* parameters_context = EVP_PKEY_CTX_new_id(EVP_PKEY_EC, NULL);
EVP_PKEY* cparameters = nullptr;
EVP_PKEY* private_key = nullptr;
if (EVP_PKEY_paramgen_init(parameters_context) != 1) { return 1; }
if (EVP_PKEY_CTX_set_ec_paramgen_curve_nid(parameters_context, NID_sect571k1) != 1) { return 1; }
if (EVP_PKEY_paramgen(parameters_context, &cparameters) != 1) { return 1; }
EVP_PKEY_CTX* key_generation_context = EVP_PKEY_CTX_new(cparameters, NULL);
if (!key_generation_context) { return 1; }
if (EVP_PKEY_keygen_init(key_generation_context) != 1) { return 1; }
if (EVP_PKEY_keygen(key_generation_context, &private_key) != 1) { return 1; }
BIO* bio = BIO_new(BIO_s_mem());
PEM_write_bio_PUBKEY(bio, private_key); // <== This is where things go wrong.
ERR_free_strings(); EVP_cleanup(); CRYPTO_cleanup_all_ex_data();
}
我在其他平台(OSX 和 Debian Linux,使用 gcc
上测试了上述代码,它似乎工作正常(在 valgrind
下没有报告错误) .
当我 运行 它在 Windows 上时,它总是在这一行失败:
PEM_write_bio_PUBKEY(bio, private_key);
我得到这个 "nice" 错误屏幕:
我不知道哪里出了问题:从我能找到的许多教程和文档页面来看,这似乎是正确的做事方式。
在我再花一天时间找出问题所在之前,我想问问社区可能更明智:这是使用 OpenSSL 生成和编写 ECDHE 密钥作为 PEM 格式的正确方法吗?
这确实是 OpenSSL 中的一个错误。
On Tue, Mar 31, 2015, ****** ******* wrote:
>
if (!combine) *pval = NULL;
我建议删除上面的两行。结构应该是 没有这个就清除并且上面的行对于非指针是错误的 无论如何字段。
史蒂夫。 ——史蒂芬·汉森博士。 OpenSSL 项目核心开发者。现已提供商业技术支持,请参阅:http://www.openssl.org
有关详细信息,另请参阅