ECDSA密钥对生成输出错误

时间:2018-06-28 12:20:21

标签: c++ openssl cryptography

我尝试了下面的代码来生成密钥对,但是它会打印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);


    }

1 个答案:

答案 0 :(得分:0)

您应该使用相应的功能来显示BIGNUMEC_POINT的值:


bn documentation中:

  

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

  

BIGNUM中将BN_bn2bin转换为外部格式。

在找到BN_bn2hex()的位置,该EC_POINT_new可用于打印出私钥的十六进制(密钥通常使用十六进制)。


类似地,为image sample定义了EC_POINT_point2hex_new只是该手册页中许多定义的第一个功能)。它没有明确指定使用哪种点表示。