対称暗号 vs. 非対称暗号
TL;DR
- 対称暗号にはAESがあり、非対称暗号にはRSA、ECCがある。
- 対称暗号だからと言って安全でないというわけではない。要は正しく配布するすること。
- AES-256は解読するにはほぼ不可能な一方、RSA-1024はもう弱い思われる(2048ビット以上が望ましい)
- 暗号化/復号化において、AES-256はRSA-2048より圧倒的に速い。
- 両者を組み合わせてそれぞれの利点だけ吸収することが可能:TLS、PGP
本文はネットワークの世界における対称暗号と非対称暗号についてのノートである。
また、暗号化の数学的原理には触れない。
対称暗号
1つの鍵で暗号化、復号化を行う暗号化方式である。普段ドアに使われる鍵をイメージしても良い。
共通鍵暗号と対称暗号は同じものを指す。
対称暗号(Symmetric encryption)にはDES、AES、ChaCha20がある。
DES(Data Encryption Standard)は1970年代にIBMによって設計された暗号化方式。1990年代に解読方法が見つかり、その後継はAESである。DESはすでに淘汰された暗号化方式で、今は使われていない。
AES(Advanced Encryption Standard)はアメリカが2001年に標準暗号として定めた共通鍵暗号アルゴリズムで、現在は広く使われている。
ChaCha20(ChaCha20-Poly1305)は2008年に開発された暗号化方式で、AESより計算量が少ないという利点がある。
対称暗号自体は弱くない
256ビットの長さの暗号を解読するには数百兆年がかかり[1]、現時点では安心で使っていい。
欠点: 配布が困難
暗号を配布する際に、攻撃者に窃取される可能性がある。
シナリオ:メールで暗号化されたファイルとそのパスワードを送信する。注意すべき点は別々に送信したとしても安全性が高まることはない。
非対称暗号
ペアで生成され、一方の暗号(公開鍵、名前の通り公開して構わない鍵)で暗号化を行い、復号化はもう一方の暗号(秘密鍵、自分だけ持つ鍵)で行うことが必須である。
公開鍵暗号と非対称暗号は同じものを指す。
非対称暗号(Asymmetric encryption)にはRSA、ECCがある。
RSA(Rivest–Shamir–Adleman)暗号は1977年に発明され、発明者3人の名前の頭文字で命名された。現在は広く使われている。
ECC(Elliptic Curve Cryptography)暗号は1985年に提案された暗号化方式である。本文は主にRSAについて述べる。
ちなみにECC暗号は特定の暗号化方式の名前ではなく、楕円曲線に関わる一連の暗号化方式の総称である。
欠点: 大きさファイルには不向き
- 致命的な欠点でもあるが、 RSA、ECCと言った非対称暗号は大きいフィアルの暗号化のために設計されたものではない。鍵と同等のサイズかより小さいサイズのデータをしか暗号化できない[2]。
- わざと小分けしてRSAによって暗号化/復号化が可能ではあるが、AESより数百倍遅いため[3]、実用性があまりない。
解決策:
非対称暗号と対称暗号を組み合わせて使う。
ここではAlice(送信者)とBob(受信者)を用いて説明する。非対称暗号のRSAと対称暗号のAESを使う。
ステップ1:AliceはBobからRSA暗号の公開鍵を入手する。
ステップ2−1:AliceはデータをAESで暗号化する。
ステップ2−2:AliceはAES暗号自体をRSAの公開鍵で暗号化する。
ステップ3:Aliceは暗号化されたデータと暗号化されたAES暗号をペアとしてBobに送信する。
ステップ4:BobはAliceから送ってきた暗号化されたAES暗号を、自分が持つRSA暗号の秘密鍵で、復号化する。
ステップ5:Bobは暗号化されたデータを、復号化されたAES暗号を使って、復号化する。
下のグラフのように示せる:
([4]を一部編集)
実際、このような混合暗号化方式はTLS、PGP(Pretty Good Privacy)などの場合で広く使われている。
補足
- AESでもRSAでも、量子コンピュータが実用化されていない限り安全と思われる。
参考資料
[1] https://www.osakac.ac.jp/whoslab/research/murakami/
[2] https://stackoverflow.com/questions/40243857/how-to-encrypt-large-file-with-rsa
[3] https://qiita.com/mktshhr/items/157a19c706f10b98ad1f
[4] https://medium.com/@igorfilatov/hybrid-encryption-in-python-3e408c73970c
Discussion