ネットの海の片隅で

技術ネタの放流、あるいは不法投棄。

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などで公開鍵が公開されていることも多いと思います。 そんなときには、この方法で暗号化してメールにでも添付して送れば、セキュアにファイルを受け渡しすることができます。

公開鍵暗号は偉大ですね!

世界でもっとも強力な9のアルゴリズム

*1:具体的にはAWSのIAM。