如何使用 Openssl:ECDSA 获取它的公钥
How can I get it pubkey with Openssl:ECDSA
我想使用ecdsa的基本功能:keygen\sign\verify。
阅读文档后 openssl/ecdsa
我这样写:
#include <openssl/ecdsa.h>
#include <openssl/sha.h>
#include <openssl/obj_mac.h> // for NID_secp192k1\
#include <stdio.h>
int main(int argc, char **argv){
int ret;
ECDSA_SIG *sig;
EC_KEY *eckey;
eckey = EC_KEY_new_by_curve_name(NID_X9_62_prime256v1);
EC_KEY_generate_key(eckey);
sig = ECDSA_SIG_new();
if (eckey == NULL)
printf("err1");
unsigned char dgst[] = "test";
unsigned char res[32];
SHA256(dgst, 32, res);
for (int i = 0; i < 32; i++)
{
printf("%02x", res[i]);
}
sig = ECDSA_do_sign(res, 32, eckey);
if (sig == NULL)
printf("err\n");
printf("\n");
ret = ECDSA_do_verify(res, 32, sig, eckey);
printf("%d\n", ret);
}
此代码有效。但是,在 ECDSA_do_Verify
中,输入是 eckey,包括 public 密钥和私钥。但是我只想用pubkey来验证。那么我怎样才能实现这个目标呢?
我们将不胜感激。
#include <openssl/x509.h>
...
unsigned char *ptr = NULL;
int n = i2d_EC_PUBKEY (eckey, &ptr); // 'export' a representation of the publickey
const unsigned char *copy = ptr;
EC_KEY * ecpub = d2i_EC_PUBKEY (NULL, ©, n); // 'import' it to a new object
OPENSSL_free (ptr); // for real code, not needed for a test hack like yours
当然,在实际的应用程序中,您需要将密钥对存储在某个地方,并可能获得公钥的证书,前者可能和后者肯定已经提供了一个外部化的公钥以供读回。
PS:我忘了说了,但是你正在使用一个声称的 32 字节缓冲区 dgst
作为 SHA256()
的输入,但 dgst
只有 5 个字节,所以这在技术上是未定义的行为(并且可以做任何事情)并且在实践中可能会使用 dgst
之后内存中碰巧出现的任何随机垃圾,这使得您的结果无法重现且无法验证。
我想使用ecdsa的基本功能:keygen\sign\verify。 阅读文档后 openssl/ecdsa
我这样写:
#include <openssl/ecdsa.h>
#include <openssl/sha.h>
#include <openssl/obj_mac.h> // for NID_secp192k1\
#include <stdio.h>
int main(int argc, char **argv){
int ret;
ECDSA_SIG *sig;
EC_KEY *eckey;
eckey = EC_KEY_new_by_curve_name(NID_X9_62_prime256v1);
EC_KEY_generate_key(eckey);
sig = ECDSA_SIG_new();
if (eckey == NULL)
printf("err1");
unsigned char dgst[] = "test";
unsigned char res[32];
SHA256(dgst, 32, res);
for (int i = 0; i < 32; i++)
{
printf("%02x", res[i]);
}
sig = ECDSA_do_sign(res, 32, eckey);
if (sig == NULL)
printf("err\n");
printf("\n");
ret = ECDSA_do_verify(res, 32, sig, eckey);
printf("%d\n", ret);
}
此代码有效。但是,在 ECDSA_do_Verify
中,输入是 eckey,包括 public 密钥和私钥。但是我只想用pubkey来验证。那么我怎样才能实现这个目标呢?
我们将不胜感激。
#include <openssl/x509.h>
...
unsigned char *ptr = NULL;
int n = i2d_EC_PUBKEY (eckey, &ptr); // 'export' a representation of the publickey
const unsigned char *copy = ptr;
EC_KEY * ecpub = d2i_EC_PUBKEY (NULL, ©, n); // 'import' it to a new object
OPENSSL_free (ptr); // for real code, not needed for a test hack like yours
当然,在实际的应用程序中,您需要将密钥对存储在某个地方,并可能获得公钥的证书,前者可能和后者肯定已经提供了一个外部化的公钥以供读回。
PS:我忘了说了,但是你正在使用一个声称的 32 字节缓冲区 dgst
作为 SHA256()
的输入,但 dgst
只有 5 个字节,所以这在技术上是未定义的行为(并且可以做任何事情)并且在实践中可能会使用 dgst
之后内存中碰巧出现的任何随机垃圾,这使得您的结果无法重现且无法验证。