EC キーを使用したデータの署名中に、ランダム シードとして使用する OpenSSL 固有のデータをフィードしたいと考えています。これは、自分のアプリケーションを別の参照アプリケーション (クローズド ソース) と比較するために行っています。このユーティリティは、秘密鍵を含むファイル、署名するデータを含むファイル、およびランダム データを含むファイルをパラメーターとして受け取ります。
私は EC キーの生成とデータの署名を行いましたが、共通点がないため、2 つのアプリケーションを比較することはできません。OpenSSL は、データの署名に使用されるランダム データを (おそらく /dev/random から) 生成するため、実行ごとに異なる署名が得られます。
RAND_clear()
と組み合わせて試してみましRAND_add()
たが、署名が変化し続けています。ECDSA の概念全体を理解していないか、何か間違っています。
アプリケーションを比較するための 2 つ目のオプションは、公開鍵をインポートし、参照プログラムによって生成された署名を検証することです。これはより良いオプションですが、指定された公開鍵の例 (83 文字の 16 進文字列) をインポートできません。EC_POINT_oct2point()
私にnullの結果を与え続けます。
ヘルプ/ポインター/リファレンスは大歓迎です。
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);