はじめに
セキュリティについてある程度の知識を持っている方であれば、公開鍵暗号方式や共通鍵暗号方式という言葉をご存知かと思います。理屈自体は理解しているという方でも、実践したことがあるという方は、IT業界従事者を除くと少ないのではないかと思います。
今回は2つの暗号方式を併用したハイブリッド暗号方式を利用して、ファイルを暗号化しながら送受信することで、本当にデータが覗かれていないという安心感を手に入れたいと思います。
早速次のセクションから実践していきます。送信側と受信側をカッコ書きしておりますが、それぞれ別のホストで作業していると想定して下さい。読むだけだと分かりにくいかと思いますが、手を動かしてみると意外と簡単です。
データを送信する場合
送信するデータ(送信側)
$ vi data
$ cat data
公開鍵暗号方式
公開鍵暗号RSAの秘密鍵作成(受信側)
$ openssl genrsa > private.pem
Generating RSA private key, 2048 bit long modulus
...................................+++
.+++
e is 65537 (0x10001)
公開鍵暗号RSAの秘密鍵から公開鍵を作成(受信側)
$ openssl rsa -in private.pem -pubout -out public.pem
writing RSA key
共通鍵AESでデータを暗号化(送信側)
$ openssl aes-256-cbc -e -in data -out data2
enter aes-256-cbc encryption password:
Verifying - enter aes-256-cbc encryption password:
公開鍵を受け取り共通鍵のパスワードファイルを暗号化(送信側)
$ vi password.txt
$ cat password.txt
【共通鍵のパスワード】
公開鍵で共通鍵を暗号化
$ openssl rsautl -encrypt -pubin -inkey public.pem -in password.txt -out password.encrypted
相手には共通鍵で暗号化されたデータと公開鍵で暗号化された共通鍵を送ります。
- data2
- password.encrypted
秘密鍵を使い公開鍵で暗号化された共通鍵を復号化(受信側)
$ openssl rsautl -decrypt -inkey private.pem -in password.encrypted -out password.decrypted
$ cat password.decrypted
【共通鍵のパスワード】
復号した共通鍵を使いデータを復号化(受信側)
$ openssl aes-256-cbc -d -in data2 -out data3
enter aes-256-cbc decryption password:
$ cat data3
公開鍵暗号方式
一番最初に送信側で作成したdataファイルの内容を、受信側で安全に確認することが出来ました。
まとめ
データ送受信を開始する時の状態が、データを送信したい方が次のようになり、
$ ls | sed "s/ /¥n/g"
data #相手に送信したいデータ
data2 #共通鍵で暗号化した実際に送信するデータ
password.encrypted #公開鍵で暗号化された共通鍵
password.txt #共通鍵
public.pem #受け取った公開鍵
データを受信したい方が次のようになると考えると分かりやすいかもしれません。
$ ls | sed "s/ /¥n/g"
private.pem #秘密鍵
public.pem #公開鍵
データを受信したい場合は今回の逆をすればいいということになります。
終わりに
公開鍵暗号方式の方が手順はより簡潔になりますが、何故今回ハイブリッド暗号方式で実践を行ったのかといいますと、公開鍵暗号方式で暗号化出来るデータ容量と、ハイブリッド暗号方式で暗号化出来るデータ容量を比べると、ハイブリッドの方が遥かに大きくて実践向きだったからです。
ただし公開鍵暗号方式による暗号もスーパーコンピュータにかかれば数日で突破出来ると言われていますし、量子コンピュータなら一瞬です。そうなるとこちらも量子コンピュータでより複雑な暗号化をかけたり、ブロックチェーンで時間稼ぎをするしかないのでしょうか。あるいは錠前の時代に遡るのでしょうかw