我尝试了下面的代码来生成 key 对,但它打印出 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);
}
最佳答案
您应该使用相应的函数来显示 BIGNUM
和 EC_POINT
值:
The basic object in this library is a
BIGNUM
. It is used to hold a single large integer. This type should be considered opaque and fields should not be modified or accessed directly.
和
The conversion of
BIGNUM
s to external formats is described inBN_bn2bin
.
我们在哪里找到 BN_bn2hex()
可以用来打印出私钥的十六进制( key 常用十六进制)。
同样,为EC_POINT_new定义了EC_POINT_point2hex
(_new
只是为该手册页定义的许多函数中的第一个函数)。它没有明确指定使用什么点表示。
关于c++ - ECDSA key 对生成输出错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51082773/