ECDSA 密钥对生成输出错误



我尝试了下面的代码来生成密钥对,但它打印了 8 字节的数据,这些数据只不过是内存地址。任何人都可以阐明问题所在,如何打印256位/32字节私钥及其相应的公钥

我在VS 2010中运行该程序并安装了openssl win32,并在我的项目属性中链接了openssl。

输出数据:

私钥:00156C90

公钥:00158cc0

#include "stdafx.h"
#include <iostream>
#include <openssl/obj_mac.h>
#include <openssl/ec.h>
#include <openssl/bn.h>
int main()
{
//EC_KEY* key = EC_KEY_new_by_curve_name(NID_secp224r1);
//EC_KEY* key = EC_KEY_new_by_curve_name(NID_X9_62_prime256v1);
EC_KEY* key = EC_KEY_new_by_curve_name(NID_secp256k1);

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);

}

您应该使用相应的函数来显示BIGNUMEC_POINT值:


在 bn 文档中:

此库中的基本对象是BIGNUM。它用于保存单个大整数。此类型应被视为不透明,不应修改或直接访问字段。

BIGNUMs到外部格式的转换在BN_bn2bin中进行了描述。

我们在这里找到BN_bn2hex()可用于打印私钥的十六进制(十六进制通常用于密钥(。


类似地,也有为EC_POINT_new定义EC_POINT_point2hex(_new只是为该手册页定义的许多函数中的第一个(。它没有明确指定使用什么点表示。

最新更新