如何解决如何使用 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,eckey);
if (sig == NULL)
printf("err\n");
printf("\n");
ret = ECDSA_do_verify(res,sig,eckey);
printf("%d\n",ret);
}
此代码有效。但是,在 ECDSA_do_Verify
中,输入是 eckey,包括公钥和私钥。但我只想用公钥来验证。那么我怎样才能实现这个目标呢?
任何帮助将不胜感激。
解决方法
#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:我忘了说,但您正在使用 SHA256()
所谓的 32 字节缓冲区 dgst
作为输入,但 dgst
只有 5 个字节,所以这在技术上是未定义的行为(并且可以做任何事情)并且在实践中可能会使用 dgst
之后内存中碰巧存在的任何随机垃圾,这会使您的结果无法重现且无法验证。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。