ssh の RSA 鍵を openssl コマンドで扱ってみる
秘密鍵ファイル(公開鍵も)を openssl で作成する
-aes256 をつけることで passphrase つきの鍵となる。
openssl genrsa -aes256 2048 > newkey.txt
-aes* をつけないと passphrase なしの鍵が生成される。
openssl genrsa 2048 > newkey.txt
この鍵 (newkey.txt) はこのまま ssh で使える。
ssh の authorized_keys に使うための公開鍵の抽出には ssh のコマンドを使う。
chmod 600 newkey.txt ssh-keygen -y -f newkey.txt > pubkey.txt
ちなみにこの公開鍵 (pubkey.txt) は該当部分を base64 でデコードすると大体こんな感じの構造体
int key_type_length, char * key_type, /* "ssh-rsa" */ int E_length, bignum E, /* 多分 11 (0xb) か 65537 (0x10001) */ int N_length, bignum N, /* 巨大な素数同士を掛け合わせた数 */
base64 デコードしたものを md5 すると ssh-keygen -l と同じ fingerprint が得られる。
openssh 公開鍵(秘密鍵ファイルの中にある)で小さいファイルを暗号化
echo HOGE | openssl rsautl -encrypt -inkey ~/.ssh/id_rsa > hoge.txt.enc
暗号化できる平文の長さは鍵の大きさと padding アルゴリズムに依存する。
openssh 公開鍵から openssl 形式の公開鍵を抽出する
openssl rsa -in ~/.ssh/id_rsa -pubout > id_rsa.pubout
抽出した公開鍵でもって暗号化できる。(-pubin 引数)
echo FOO | openssl rsautl -encrypt -inkey id_rsa.pubout -pubin > hoge.txt.enc
openssh のソース読んだりすると
どうやら openssh は openssl の実装をたくさん使っているらしい。動的リンクか静的リンクか分からないが。
昔、いずれかの時点で openssh と openssl は協調するようになったのだろうか。