公開鍵の秘密 -追補- 22007/02/09 13:52

さて、昨日までの勉強で秘密鍵ファイルには、秘密鍵のほかにも公開鍵や、それらを生成する材料となったふたつの素数までもが格納されているらしいことがわかった。

実際に OpenSSH の ssh-keygen のコードを見てみよう。下は OpenSSH 4.5-p1 に含まれる ssh-keygen.c からの抜粋だ。do_convert_private_ssh2_from_blob() という関数が実際に -y オプションを与えられたときに RSA の秘密鍵の処理を行っている部分のようだ。 訂正: この関数は、秘密鍵を SSH2 形式へ変更する -X オプションを指定したときに呼ばれる関数である。 この関数は、一連のデータのかたまり(鍵の元となる)とその長さを受け取り、Key 型へのポインタを返す。この関数は結構な長さがあるので該当部分だけ抜き出すと、次のようになる。

    278         switch (key->type) {
    279         case KEY_DSA:
    280                 buffer_get_bignum_bits(&b, key->dsa->p);
    281                 buffer_get_bignum_bits(&b, key->dsa->g);
    282                 buffer_get_bignum_bits(&b, key->dsa->q);
    283                 buffer_get_bignum_bits(&b, key->dsa->pub_key);
    284                 buffer_get_bignum_bits(&b, key->dsa->priv_key);
    285                 break;
    286         case KEY_RSA:
    287                 e  = buffer_get_char(&b);
    288                 debug("e %lx", e);
    289                 if (e < 30) {
    290                         e <<= 8;
    291                         e += buffer_get_char(&b);
    292                         debug("e %lx", e);
    293                         e <<= 8;
    294                         e += buffer_get_char(&b);
    295                         debug("e %lx", e);
    296                 }
    297                 if (!BN_set_word(key->rsa->e, e)) {
    298                         buffer_free(&b);
    299                         key_free(key);
    300                         return NULL;
    301                 }
    302                 buffer_get_bignum_bits(&b, key->rsa->d);
    303                 buffer_get_bignum_bits(&b, key->rsa->n);
    304                 buffer_get_bignum_bits(&b, key->rsa->iqmp);
    305                 buffer_get_bignum_bits(&b, key->rsa->q);
    306                 buffer_get_bignum_bits(&b, key->rsa->p);
    307                 rsa_generate_additional_parameters(key->rsa);
    308                 break;
    309         }

key->type が KEY_RSA の場合には、はやり p, q, n, d, e を格納取り出している。

コメント

トラックバック