【发布时间】:2012-09-10 22:32:45
【问题描述】:
我提供这个示例应用程序来显示我的问题
#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;
}
我想要做的是从私钥显示公钥(应该是椭圆私钥)。 直到遇到类似的问题,我才知道该怎么做
How do I feed OpenSSL random data for use in ECDSA signing?
这是我指出自己如何获取公钥并使用 EC_POINT_bn2point 而不是 hex2point 的地方,后者根据 OpenSSL 源在内部执行 BN_hex2bn。
那么,为什么 EC_POINT_bn2point 返回 NULL?我正在认真考虑重新编译 OpenSSL 并放置一些调试程序来找出它失败的原因。
【问题讨论】:
-
好吧,如果您可以从私钥中提取公钥,那将破坏 RSA 的本质......
-
我发现一些文章说私钥留下了一些线索来生成公钥,但不是用英文写的。所以你可以找到私钥的格式,它可能会有所帮助。
-
ECDSA 私钥
d(整数)和公钥Q(一个点)由Q = dG计算,其中G 是非秘密域参数。另见:nsa.gov/ia/_files/ecdsa.pdf -
是的,我拿到了。我需要使用基本生成器 G 进行 EC 乘法。
标签: cryptography openssl public-key-encryption elliptic-curve