OpenSSLを使ってセキュアにファイルを送信する
先日、外部に漏れるとマズいファイル*1をセキュアに受け渡しする必要が生じました。
受け渡しをする相手と頻繁に会うようであれば直接会って渡せば良いのですが、あまり合う機会がない相手の場合はインターネット越しに安全にファイルを渡す必要があります。
そこで、
- 「Google Driveでも使うか……一応httpsだし」
- 「一時的とはいえ他人のサービスに預けるのは気持ち悪い……」
- 「サーバが相手ならscpで一発なんだが」
- 「かといって受け渡し用にサーバを用意するのはめんどい」
などと、独りで葛藤していたのですが、しばらくして思いつきました。
「普通に公開鍵で暗号化して、秘密鍵で復号すれば良いのでは?」
というわけで、その方法を書いておきます。
前提
- 送信相手のid_rsa.pubが手に入る
- OpenSSLが入っている
これだけです。
手元で暗号化と復号の実験をしてみます。
準備
id_rsa.pubをpem形式に変換する。
$ openssl rsa -in .ssh/id_rsa -outform pem > .ssh/id_rsa.pem
復号用の秘密鍵も変換しておきます。
$ openssl rsa -in .ssh/id_rsa -pubout -outform pem > .ssh/id_rsa.pub.pem
暗号化
暗号化用のサンプルファイルを作ります。
$ echo "This is test file." > test.txt $ cat test.txt This is test file.
暗号化します。
$ openssl rsautl -encrypt -pubin -inkey ~/.ssh/id_rsa.pub.pem -in test.txt -out test.txt.encrypted
暗号化した結果。 見事に読めません。
$ cat test.txt.encrypted �,��W�� ��s��Ő��-Ͼ�^�.�4w�2�]���KQ�q��N�~kA3���`�7��<��]6��<u�TR��!���T�v9����x?x-&�橲B����9��6:�-A~��Я�S�!���$~UV�����٫��Py�0�K��j ���%�-�.;�HȂ�e.H�D[1��\�5� �'Z�s��@��=��,� x&�3��O�U��~���i;���0�z�9M��%
復号
暗号化したファイルを復号してみます。
$ openssl rsautl -decrypt -inkey ~/.ssh/id_rsa.pem -in test.txt.encrypted -out test.txt.decrypted
復号した結果。
$ cat test.txt.decrypted This is test file.
無事、復号できました。
さいごに
受け渡しの相手がプログラマであれば、Gistなどで公開鍵が公開されていることも多いと思います。 そんなときには、この方法で暗号化してメールにでも添付して送れば、セキュアにファイルを受け渡しすることができます。
公開鍵暗号は偉大ですね!
*1:具体的にはAWSのIAM。