楕円で秘密な鍵を作ってみる
OpenSSL0.9.8くらいから楕円曲線暗号アルゴリズムが実装されていましたが,今回はちょっとそれを使って秘密鍵を作ってみました.
ECDSA_do_signとかECDSA_do_verifyに特に意味はありません.
#include <openssl/ecdsa.h> #include <openssl/obj_mac.h> int main() { int ret; unsigned char digest[20]; ECDSA_SIG* sig; const BIGNUM *priv_key; const EC_POINT* public_key; const EC_GROUP* group; EC_KEY* eckey = EC_KEY_new(); if (eckey == NULL) { printf("key is null\n"); return 1; } eckey = EC_KEY_new_by_curve_name(NID_secp192k1); if(eckey == NULL){ printf("key->group is null\n"); return 1; } if(!EC_KEY_generate_key(eckey)){ printf("failed generate key\n"); return 1; } if(!EC_KEY_check_key(eckey)) { printf("invalid key\n"); } sig = ECDSA_do_sign(digest, 20, eckey); if(sig == NULL) { printf("miss sign\n"); return 1; } ret = ECDSA_do_verify(digest, 20, sig, eckey); if(ret == -1) { printf("miss verify\n"); return 1; } else if(ret == 0) { printf("incorrect signature\n"); } else { printf("signature ok\n"); } priv_key = EC_KEY_get0_private_key(eckey); public_key = EC_KEY_get0_public_key(eckey); ret = EC_KEY_print_fp(stdout, eckey, -1); return 0; }
ちなみに出力結果はこうなります.
signature ok
Private-Key: (192 bit)
priv:
00:ea:f3:73:98:06:41:47:69:0c:ff:6b:ad:ce:91:
8b:c0:64:89:17:c9:8e:b1:04
pub:
04:91:c5:80:7b:d6:9b:82:32:b0:35:f3:e2:81:5e:
e4:87:ca:fd:cf:96:84:f7:1a:27:2a:44:f2:fe:3a:
ad:5b:66:db:18:a1:3e:60:2d:6f:e4:ee:94:0a:bc:
ba:fb:91:46
Field Type: prime-field
Prime:
00:ff:ff:ff:ff:ff:ff:ff:ff:ff:ff:ff:ff:ff:ff:
ff:ff:ff:ff:ff:fe:ff:ff:ee:37
A: 0
B: 3 (0x3)
Generator (uncompressed):
04:db:4f:f1:0e:c0:57:e9:ae:26:b0:7d:02:80:b7:
f4:34:1d:a5:d1:b1:ea:e0:6c:7d:9b:2f:2f:6d:9c:
56:28:a7:84:41:63:d0:15:be:86:34:40:82:aa:88:
d9:5e:2f:9d
Order:
00:ff:ff:ff:ff:ff:ff:ff:ff:ff:ff:ff:fe:26:f2:
fc:17:0f:69:46:6a:74:de:fd:8d
Cofactor: 1 (0x1)
いくらテストとは言え秘密鍵を貼っつけるってのはどうなんだろう…w