それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

openssl コマンドと openssh のid_rsa で暗号化と復号化

.ssh/id_rsa を使って文章を暗号化する。

openssl で暗号化するのにRSAが使える。openssh のRSA 鍵だってもちろん使える。

openssl と id_rsaで暗号化

id_rsa秘密鍵なので、秘密鍵で暗号化出来る。

echo "Hello takuya " > takuya.txt
openssl rsautl -encrypt  -inkey /Users/takuya/.ssh/id_rsa -in takuya.txt  -out takuya.en.txt

openssl 3.0 以降は、rsautlpkeyutil に変更になった。

openssl pkeyutl -encrypt  -inkey /Users/takuya/.ssh/id_rsa -in takuya.txt  -out takuya.en.txt

openssl とid_rsa で復号化

復号化も同様にすることが出来る。

openssl rsautl -decrypt  -inkey /Users/takuya/.ssh/id_rsa -in takuya.en.txt
Hello takuya

openssl 3.0 以降は、rsautlpkeyutil に変更になった。

openssl pkeyutil -decrypt  -inkey /Users/takuya/.ssh/id_rsa -in takuya.en.txt
Hello takuya

ということで.ssh/id_rsa秘密鍵があれば暗号化出来るとわかる。

自分で使うにはid_rsaだけがアレば十分ですね。

openssh のid_rsa の保存フォーマットはPEM

私のid_rsassh-keygen で作ったものだが、PEMで保存されている

http://notes.applifirst.jp/2014/07/26/61/ によると、openssl でid_rsa をopenssl でRSA秘密鍵のPEM形式に変換できる。

やってみたが結果は変化がなし

openssl の rsa 変換コマンドで変換

takuya@rena:~/.ssh$ openssl rsa -in id_rsa -outform pem >id_rsa.pem
writing RSA key

しかし出力結果は同じだった

takuya@rena:~/.ssh$ md5sum id_rsa id_rsa.pem
e22c0494eb442607252ea82710404da5  id_rsa
e22c0494eb442607252ea82710404da5  id_rsa.pem

ということでPEMで間違いない。

なぜ両方秘密鍵で出来てしまうのか?

このへんちょっと分かってない。

シェルスクリプトの平文パスワードをセキュアにする方法 - 余白の書きなぐり にあるように

今回は秘密鍵ファイル中に含まれる公開鍵の情報を用いて暗号化している。

わたしも、openssh のid_rsa から公開鍵を導出して暗号化ってことじゃねーかと思ってた。

openssl rsautl -encrypt  -inkey /Users/takuya/.ssh/id_rsa -in takuya.txt  -out takuya.en.txt
openssl rsautl  -encrypt -pubin  -inkey /Users/takuya/.ssh/id_rsa_pubs -in takuya.txt  -out takuya.en2.txt
openssl rsautl  -encrypt -pubin  -inkey /Users/takuya/.ssh/id_rsa_pubs -in takuya.txt  -out takuya.en3.txt
md5sum takuya.en*
4f1fa75e101bd33b56d447961c7fdd4a  takuya.en.txt
32fb99f46e46957524d6c880695a9d65  takuya.en2.txt
5ecedcddca4c4132795873c269b1c5dc  takuya.en3.txt

だとしたら、同じ秘密鍵から導出した公開鍵で暗号化したものと結果がおなじになるはずだ。と考えたけどそれもおかしい。 でも、まぁ、Saltとかあるだろうし毎回結果が同じなるとは限らないから・・・

長い文字列には対応できない

このへんちょっと分かってない。

とにかく、キーの長さより大きいデータは無理ってことです。

Encrypt large files with ruby openssl or? - Ruby - Ruby-Forum

Well, large data is encrypted another way. Usual keysizes are 1024-4096 bits, i.e. 128-512 bytes. With plain RSA, you can encrypt/sign/whatever just as many bytes, as the key size. So, if you have 1024 bit key, and you want to encrypt data larger that 128, you have to do something more.

2022-11-02 追記

rsautl は openssl 3.0 ではpkeyutl に名前が変わっていたので注意。

参考資料

RSA鍵、証明書のファイルフォーマットについて - Qiita

http://qiita.com/shgeta/items/fca87fd0bce31e792dbe

How to encrypt a big file using OpenSSL and someone's public key

http://qiita.com/drobune/items/bf5d689eff7f69ed6866