如何使用 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, &copy, 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 之后内存中碰巧出现的任何随机垃圾,这使得您的结果无法重现且无法验证。