如何使用Openssl:ECDSA获取pubkey

如何使用Openssl:ECDSA获取pubkey,openssl,ecdsa,Openssl,Ecdsa,我想使用ecdsa的基本功能:keygen\sign\verify。 看完文件 我这样写: #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

我想使用ecdsa的基本功能:keygen\sign\verify。 看完文件

我这样写:

#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);
}
#包括
#包括
#包括//用于NID\U secp192k1\
#包括
int main(int argc,字符**argv){
int ret;
ECDSA_SIG*SIG;
电子钥匙*电子钥匙;
eckey=EC_KEY_new_by_curve_name(NID_X9_62_prime256v1);
ECU密钥生成密钥(eckey);
sig=ECDSA_sig_new();
if(eckey==NULL)
printf(“err1”);
无符号字符dgst[]=“测试”;
无符号字符res[32];
SHA256(dgst,32,res);
对于(int i=0;i<32;i++)
{
printf(“%02x”,res[i]);
}
sig=ECDSA_do_符号(res,32,eckey);
if(sig==NULL)
printf(“err\n”);
printf(“\n”);
ret=ECDSA\u do\u验证(res,32,sig,eckey);
printf(“%d\n”,ret);
}
这个代码有效。但是,在
ECDSA\u do\u Verify
中,输入是eckey,包括公钥和私钥。但我只想用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, &copy, n); // 'import' it to a new object
OPENSSL_free (ptr); // for real code, not needed for a test hack like yours
... 无符号字符*ptr=NULL; int n=i2d_EC_PUBKEY(eckey和ptr);/'导出公钥的表示形式 const unsigned char*copy=ptr; EC_KEY*ecpub=d2i_EC_PUBKEY(NULL,&复制,n);/'将其导入到新对象 OPENSSL_-free(ptr);//对于真正的代码,像您这样的测试黑客不需要
当然,在实际的应用程序中,您需要将密钥对存储在某个地方,并且可能会获得公钥的证书,前者和后者肯定已经提供了一个外部化的公钥以供读回


PS:我忘了说,但是您使用的是作为
SHA256()
一个声称的32字节缓冲区
dgst
,但是
dgst
只有5个字节,所以这在技术上是未定义的行为(并且可以做任何事情),实际上可能会使用
dgst
之后内存中发生的任何随机垃圾,这使得您的结果无法生成和验证。

谢谢您的回答!我注意到我在SHA256()中犯的错误,现在我更正了。正如您在实际应用中所说,I需要存储它,在我的项目中,我需要使用unsignchar*表单返回它。但是,我也使用另一个Crytography方案生成密钥对,因此我需要EC_密钥的长度,如何获得长度。我尝试使用
EC_KEY_priv2oct()
,但我失败了。我可能知道函数
i2d_EC_PUBKEY(eckey,&ptr)
告诉我Pubkey需要的长度,以及点ptr的malloc对应空间?我跟踪它可以获得ECDSA_SIG。但是,我没有找到获取EC_密钥对的func。
i2d
返回OpenSSL使用的表示形式的字节长度,即X.509 SPKI in DER,而
i2d
with
ptr==NULL
使用
OPENSSL\u malloc
分配空间,这就是为什么正如我所说,除非程序立即退出,否则应该使用
OPENSSL\u free
释放空间。其他实现EC的软件可能会使用不同的表示法,如果您想与它们进行交换,则需要准确地指定您正在执行的操作。如果你想使用其他算法(不是EC),这是一个不同于你所问的问题。