如何从OpenSSL中的ECDSA私钥获取公钥?

far*_*dve 4 openssl cryptography elliptic-curve public-key-encryption

我提供此示例应用程序来显示我的问题

#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;
}
Run Code Online (Sandbox Code Playgroud)

我想要做的是从私钥显示公钥(应该是椭圆私钥).在遇到类似的问题之前,我不知道怎么做

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

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

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

ind*_*div 9

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;
Run Code Online (Sandbox Code Playgroud)

所以你可以做同样的事情.如果我有私钥,我会将其设置为EC_KEYECDSA结构中的私钥.然后我在其上配置域参数.最后我要做的EC_POINT_mul是获得公共关键点.