椭圆曲线密钥验证失败

Elliptic curve key verification failed

我正在尝试使用 EC_KEY_new_by_curve_name(NID_secp256k1) 创建一个 EC_KEY 但是当我检查密钥

时我有这个输出

这是图片上的错误。

==13629== Memcheck, a memory error detector
==13629== Copyright (C) 2002-2013, and GNU GPL'd, by Julian Seward et al.
==13629== Using Valgrind-3.10.1 and LibVEX; rerun with -h for copyright info
==13629== Command: ./ec_create-test
==13629==
Key verification failed
==13629==
==13629== HEAP SUMMARY:
==13629==     in use at exit: 1,224 bytes in 28 blocks
==13629==   total heap usage: 2,558 allocs, 2,530 frees, 96,068 bytes allocated
==13629==
==13629== LEAK SUMMARY:
==13629==    definitely lost: 80 bytes in 1 blocks
==13629==    indirectly lost: 1,144 bytes in 27 blocks
==13629==      possibly lost: 0 bytes in 0 blocks
==13629==    still reachable: 0 bytes in 0 blocks
==13629==         suppressed: 0 bytes in 0 blocks
==13629== Rerun with --leak-check=full to see details of leaked memory
==13629==
==13629== For counts of detected and suppressed errors, rerun with: -v
==13629== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0)

TLDR:您没有创建(或设置)任何密钥

OpenSSL 中的一个 EC_KEY 对象,就像其他带有参数(DSADH)的 publickey 方案的对象一样,实际上可以是 4 个中的一个状态:

  1. 对象存在但根本没有设置

  2. 对象设置了参数,但既不是私有密钥也不是 public 密钥

  3. 对象有参数和public密钥集,但没有私钥;这通常被密钥所有者以外的各方使用

  4. 对象设置了参数以及私钥和 public 密钥;这是密钥所有者常用的

对于 EC,参数通常被粗略地称为“曲线”,但从技术上讲这是不精确的:它们实际上包括一个基础字段(此处为 Fp,整数模特定的 256 -位素数);定义该场上曲线的短 Weierstrass 方程的系数;以及该曲线上预先选择的 'base' 或 'generator' 点。这些参数在数学上形成了一个有限群,而 OpenSSL 实际上将它们存储在一个相关但不同的对象类型中 EC_GROUP.

EC_KEY_new_by_curve_name 产生状态 2——它设置了参数(特别是 EC_GROUP),但没有密钥——所以 EC_KEY_check_key 没有要检查的密钥,因此失败。

通常,每当任何 OpenSSL 加密函数 returns 出现故障指示时(通常但不总是 SSL/TLS 函数出现时)you should look at the error stack。 (请注意那里的后续项目 PROG9 大部分已过时;OpenSSL 1.1.0 自动初始化库数据,包括错误字符串,而无需像旧版本那样显式编码。)使用此代码

/* SO 66847659 2021-03-29 */
#include <stdio.h>
#include <openssl/ec.h>
#include <openssl/obj_mac.h>
#include <openssl/err.h>

int main (void){
  EC_KEY * ec = EC_KEY_new_by_curve_name(NID_secp256k1);
  if( EC_KEY_check_key(ec) <= 0 ) ERR_print_errors_fp(stdout);
  return 0;
}

我收到了更具体、更有帮助的错误消息

140659993163520:error:100B1043:elliptic curve routines:EC_KEY_check_key:passed a null parameter:crypto/ec/ec_key.c:258:

如果你想生成一个新的 keypair,在创建 EC_KEY 对象(带参数)后调用 EC_KEY_generate_key —— 或者自 1.0 以来更好的风格.0 在 2010 年是使用更高级别的通用 EVP_PKEY 接口而不是特定于算法的接口。 OTOH 如果您想使用现有的密钥对或 public 密钥,根据您未指定的环境和数据的详细信息,有许多选项。