.ssh/id_rsa を使って文章を暗号化する。
openssl で暗号化するのにRSAが使える。openssh のRSA 鍵だってもちろん使える。
openssl と 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 以降は、rsautl
が pkeyutil
に変更になった。
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 以降は、rsautl
が pkeyutil
に変更になった。
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_rsa はssh-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