c++ - ECDSA key 对生成输出错误

标签 c++ openssl cryptography

我尝试了下面的代码来生成 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);


    }

最佳答案

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


bn documentation :

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 BIGNUMs to external formats is described in BN_bn2bin.

我们在哪里找到 BN_bn2hex()可以用来打印出私钥的十六进制( key 常用十六进制)。


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

关于c++ - ECDSA key 对生成输出错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51082773/

相关文章:

c++ - 提升 : copy_file fail with access denied but there are no permission problem

ruby - ECDSA 签名/验证似乎仅考虑数据的前 32 个字节

hash - 双散列是否具有抗碰撞性?

c++ - 与 uint64_t 斗争

c++ - 是否有任何内置函数告诉编译器分支是否可预测?

java - Android、Java 上 PEM 文件中的公钥

cryptography - 7-zip 如何检查您提供的密码是否正确?

encryption - OpenSSL 解密错误 - 填充与原始

c++ - 确定 2x2 正方形包含数字 1-4(无重复)的算法

encryption - 如何在 OpenSSL/libcrypto 中导出公钥?