我想在使用 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);