如何提供OpenSSL随机数据以用于ECDSA签名?

我想在使用EC密钥签名数据期间提供OpenSSL特定数据以用作随机种子.我这样做是为了将我的应用程序与另一个引用程序(封闭源代码)进行比较.该实用程序获取带有私钥的文件,带有数据的文件以及随机数据作为参数进行签名和归档.

我已经获得了EC密钥的生成和数据签名,但由于我没有共同点,因此无法比较这两个应用程序. OpenSSL生成用于签名数据的随机数据(可能来自/ dev / random),因此每次运行都会给我一个不同的签名.

我已经尝试将RAND_clear()与RAND_add()结合使用,但不断改变签名.要么我不理解整个ECDSA概念,要么我做错了什么.

我比较应用程序的第二个选项是导入公钥并验证参考程序生成的签名.这是更好的选择,但我无法导入给定的示例公钥(83个字符的十六进制字符串). EC_POINT_oct2point()一直给我空结果.

任何帮助/指针/参考将不胜感激.

char * key_as_binary_data;  //369368AF243193D001E39CE76BB1D5DA08A9BC0A63307AB352338E5EA5C0E05A0C2531866F3E3C2702
int data_size;  //Size of the key buffer
EC_POINT * ecpoint = NULL;
EC_GROUP * ecgroup = NULL;
EC_KEY * eckey = NULL;
point_conversion_form_t form = POINT_CONVERSION_UNCOMPRESSED;
int asn1_flag = OPENSSL_EC_NAMED_CURVE;

eckey = EC_KEY_new();
ecpoint = EC_POINT_new(ecgroup);
ecgroup = EC_GROUP_new_by_curve_name(OBJ_sn2nid("sect163k1"));
EC_GROUP_set_asn1_flag(ecgroup, asn1_flag);
EC_GROUP_set_point_conversion_form(ecgroup, form);
EC_KEY_set_group(eckey,ecgroup);
EC_KEY_generate_key(eckey);

//This gives me a null ecpoint
EC_POINT_oct2point(ecgroup,ecpoint,key_as_binary_data,data_size-1,ctx); 
EC_KEY_set_public_key(eckey,ecpoint);
最佳答案
这是你应该如何加载该公钥:

  EC_KEY    *key = NULL;
  EC_POINT *pub_key;
  const EC_GROUP *group;

  SSL_library_init();
  SSL_load_error_strings();

  key = EC_KEY_new_by_curve_name(NID_sect163k1);
  group = EC_KEY_get0_group(key);
  pub_key = EC_POINT_new(group);

  EC_POINT_hex2point(group,
    "369368AF243193D001E39CE76BB1D5DA08A9BC0A63307AB352338E5EA5C0E05A0C2531866F3E3C2702", pub_key, NULL);

  EC_KEY_set_public_key(key, pub_key);

  if (!EC_KEY_check_key(key)) {
    printf("EC_KEY_check_key failed:\n");
    printf("%s\n",ERR_error_string(ERR_get_error(),NULL));
  } else {
    printf("Public key verified OK\n");
  }

它似乎验证好,所以它应该用于检查签名.

我认为您的错误可能只是将NULL(在ecgroup中)传递给EC_POINT_new().

转载注明原文:如何提供OpenSSL随机数据以用于ECDSA签名? - 代码日志