Bel*_*rog 5 c openssl cryptography key elliptic-curve
我想在使用 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);
Run Code Online (Sandbox Code Playgroud)
签名程序纯粹是为了让其他人确认您已签名,即。您的私钥用于对消息(或任何数据)进行签名,而无需实际拥有您的私钥。
该算法在维基百科Elliptic_Curve_DSA上概述 ,阅读“签名生成算法”,似乎随机数据用于辅助签名的强度,并使攻击更难找出私钥。
因此,您应该预期签名每次都会不同,因为这不仅仅是一个哈希值。
请参阅“签名验证算法”部分,了解验证步骤是您希望用来确认您的 openssl 版本正在输出 ECDSA 方法和闭源程序的有效签名的验证步骤。