我如何从OpenSSL中的ECDSA私钥获取公钥?(How do I obtain the public key from an ECDSA private key in OpenSSL?)

我正在提供这个示例应用程序来显示我的问题

#include <stdio.h>
#include <stdlib.h>
#include <openssl/ec.h>
#include <openssl/bn.h>

int main()
{
     EC_KEY *pkey = NULL;
     EC_POINT *pub_key = NULL;
     const EC_GROUP *group = NULL;
     BIGNUM start;
     BIGNUM *res;
     BN_CTX *ctx;

     BN_init(&start);
     ctx = BN_CTX_new();

     res = &start;
     BN_hex2bn(&res,"3D79F601620A6D05DB7FED883AB8BCD08A9101B166BC60166869DA5FC08D936E");
     pkey = EC_KEY_new_by_curve_name(NID_secp256k1);
     group = EC_KEY_get0_group(pkey);
     pub_key = EC_POINT_new(group);

     EC_KEY_set_private_key(pkey, res);

     assert(EC_POINT_bn2point(group,res, pub_key, ctx)); // Null here

     EC_KEY_set_public_key(pkey, pub_key);


    return 0;
}
 

我想要做的是从私钥显示公钥(应该是椭圆私钥)。 直到遇到类似的问题时,我才知道该怎么做

如何提供用于ECDSA签名的OpenSSL随机数据?

我从哪里指出自己如何获得公钥,并使用EC_POINT_bn2point而不是根据OpenSSL源内部执行BN_hex2bn的hex2point。

那么,为什么EC_POINT_bn2point返回NULL? 我正在认真考虑重新编译OpenSSL,并且设置一些调试例程来找出它失败的原因。

I am providing this sample application to show my problem

#include <stdio.h>
#include <stdlib.h>
#include <openssl/ec.h>
#include <openssl/bn.h>

int main()
{
     EC_KEY *pkey = NULL;
     EC_POINT *pub_key = NULL;
     const EC_GROUP *group = NULL;
     BIGNUM start;
     BIGNUM *res;
     BN_CTX *ctx;

     BN_init(&start);
     ctx = BN_CTX_new();

     res = &start;
     BN_hex2bn(&res,"3D79F601620A6D05DB7FED883AB8BCD08A9101B166BC60166869DA5FC08D936E");
     pkey = EC_KEY_new_by_curve_name(NID_secp256k1);
     group = EC_KEY_get0_group(pkey);
     pub_key = EC_POINT_new(group);

     EC_KEY_set_private_key(pkey, res);

     assert(EC_POINT_bn2point(group,res, pub_key, ctx)); // Null here

     EC_KEY_set_public_key(pkey, pub_key);


    return 0;
}
 

What I am trying to do, is to display the Public key from a private key(should an elliptic private key). I did not know how to do it until I encountered a similar problem

How do I feed OpenSSL random data for use in ECDSA signing?

Which is from where I pointed myself how to get the public key and to use EC_POINT_bn2point instead of hex2point which internally does BN_hex2bn according to the OpenSSL source.

So, why is EC_POINT_bn2point returning NULL? I am seriously considering recompiling OpenSSL and putting some debug routines to figure out why it fails.

最满意答案

ECDSA私钥d (整数)和公钥Q (点)由Q = dG计算,其中G是非秘密域参数。 Suite B FIPS 186-3(ECDSA)实施人员指南详细描述了ECDSA。

OpenSSL使用ECDSA_generate_key生成密钥对。 它的作用是随机生成一个私钥,然后它执行Q = dG乘法来计算公钥:

/* pub_key is a new uninitialized `EC_POINT*`. priv_key is a `BIGNUM*`. */ if (!EC_POINT_mul(ecdsa->group, pub_key, priv_key, NULL, NULL, ctx)) goto err;

所以你可以做同样的事情。 如果我有私钥,我将它设置为EC_KEY或ECDSA结构中的EC_KEY 。 然后我会配置它的域参数。 最后我会做EC_POINT_mul来获得公共关键点。

An ECDSA private key d (an integer) and public key Q (a point) is computed by Q = dG, where G is a non-secret domain parameter. Suite B Implementer’s Guide to FIPS 186-3 (ECDSA) describes ECDSA in detail.

OpenSSL uses ECDSA_generate_key to generate a key pair. What it does is generate a private key randomly, and then it does the Q = dG multiplication to compute the public key:

/* pub_key is a new uninitialized `EC_POINT*`. priv_key is a `BIGNUM*`. */ if (!EC_POINT_mul(ecdsa->group, pub_key, priv_key, NULL, NULL, ctx)) goto err;

So you can do the same thing. If I had the private key, I'd set it as the private key in an EC_KEY or ECDSA struct. Then I'd configure the domain parameters on it. And finally I'd do the EC_POINT_mul to get the public key point.

更多推荐