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 アルゴリズムに依存する。

秘密鍵で小さいファイルを復号化

cat hoge.txt.enc | openssl rsautl -decrypt -inkey ~/.ssh/id_rsa

=> HOGE

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 は協調するようになったのだろうか。