暗号に関する世界観です。セキュリティも参照のこと。
自分の書いたブログ「神々とともに生きる詩人」2021/01/27より。
ネットワーク上でセキュリティを確保するためには、暗号化という仕組みを用いる。
共通鍵暗号方式では、暗号化と復号化に用いる鍵が同じだが、公開鍵暗号方式では、公開鍵と秘密鍵を使う。
秘密鍵は知られてはならないが、公開鍵は誰に知られても構わない。
暗号化通信においては、公開鍵暗号方式を使うことが多い。
まず、受信者が公開鍵と秘密鍵のペアを作り、自分の公開鍵を相手に送る。
送信者は、その公開鍵を使ってデータを暗号化する。
そしてデータを受信した受信者は、秘密鍵を用いてデータを復号化する。
(暗号技術入門 第3版 秘密の国のアリスを参考に執筆しました。)
現在使われている暗号方式はDES(共通鍵暗号)やRSA(公開鍵暗号)です。DESについてはトリプルDES(高速なコンピュータによって解読されないように三段階にDESをかける)も使われています。
このほか、MD5/SHA-*によるハッシュ(データが改竄されていないことを証明する)により、ファイルの同一性を確認できます。LinuxのISOイメージなどにおいては、巨大なイメージファイルが破損していないかどうかの確認によく使われます。
また、デジタル署名(本当の本人であることを秘密鍵を持っているかどうかで確認する)も広く使われています。当人が持っている秘密鍵で暗号化したデータを相手側の公開鍵で復号化できるかどうかで、本人であるかどうかを確認します。
diffとpatch・テキスト処理も参照のこと。
暗号技術入門 第3版 秘密の国のアリスを参考に執筆しました。
XOR(排他的論理和)は基本的な論理演算のひとつで、0 XOR 0 = 0、0 XOR 1 = 1、1 XOR 0 = 1、1 XOR 1 = 0となる。
Aがもし平文を表すビット列であったとして、あらかじめ決められたビット列BをAに対してかけることで、以下のように暗号化された値を作れる。
A | 1 | 1 | 1 | 0 | 1 | 0 | 0 | 1 |
B | 1 | 1 | 0 | 0 | 1 | 0 | 1 | 0 |
A XOR B | 0 | 0 | 1 | 0 | 0 | 0 | 1 | 1 |
同じ数でのXORは必ず0になるから(0 XOR 0 = 0, 1 XOR 1 = 0)、A XOR Bに対してもう一度BとのXORを取ると、必ずAに戻る。
A XOR B | 0 | 0 | 1 | 0 | 0 | 0 | 1 | 1 |
B | 1 | 1 | 0 | 0 | 1 | 0 | 1 | 0 |
A | 1 | 1 | 1 | 0 | 1 | 0 | 0 | 1 |
これは暗号化・復号化の手順に良く似ている。Bとなるビット列を上手く選んだ場合、XORを使ってとても強い暗号を作れる。
使い捨てパッドは、「平文に対してランダムに作られたビット列でXORをかける」というだけのシンプルな暗号。シンプルだが、絶対に解読できない暗号である。なぜなら、復号化されたとしても、それが正しい平文なのかどうかが分からないからである。
コンピュータの計算原理も参照のこと。
2022.12.05編集
DESは共通鍵暗号方式のブロック暗号。
DRSは、何度も暗号化をラウンドごとに繰り返すことで強固な暗号化を行う。
まず64bitの平文を32bitの「右」と「左」に分ける。ここで、サブ鍵と右を使って、ラウンド関数fが、一見ランダムのように見えるビット列を計算する。このビット列と左とのXORを取る。これで「暗号化された左」が生み出される。
ここで、左は暗号化されているが、右は暗号化されていないため、別々のサブ鍵によって何度もラウンドを繰り返し、何度も左と右を交換する。
復号化は、たとえば同じサブ鍵で1ラウンド分の出力を再び入れてみる。そうすると、ラウンド関数fがどのような関数であっても必ず元に戻る。暗号化と復号化にはまったく違いが無く、サブ鍵を使う順番を逆にするだけでよい。
現代では、DESはブルートフォース攻撃で少しの時間で解読されてしまう。トリプルDESは、DESを3段重ねにして強力にしたアルゴリズム。
RSAは公開鍵暗号方式。公開鍵は相手に渡し、秘密鍵は自分で保管する。
公開鍵で暗号化すると、同じ人の秘密鍵で復号できる。秘密鍵で暗号化すると、同じ人の公開鍵で復号できる。
83 mod 5のような式は、「8を3乗して5で割った余り」のことを表す。
RSAによる暗号化は、
暗号文 = 平文E mod N
となる。
EとNの組が公開鍵。
RSAによる複合化は、
平文 = 暗号文D mod N
となる。
DとNの組が秘密鍵。
以下に出てくる数、N, L, E, Dを求めることで、鍵ペアを作ることができる。
大きな素数、pとqを用意する。大きければ大きいほど暗号解読は難しくなるが、それだけ処理時間が長くなる。
この二つの数を掛け合わせると、Nになる。つまり、N = p × q (pとqは素数)
この二つの数から、p - 1とq - 1の最小公倍数を求め、それをLとする。
次に、数Eを求める。
Eは、1よりも大きく、Lよりも小さな数(1 < E < L)であり、同時にEとLの最大公約数は1となる(数Dの存在を保証するため)。
最後にDを求める。
DはEから計算し、1 < D < Lでありながら、E × D mod L = 1(平文に戻ることを保証)となる。
この条件を満たす数Dを見つければ、EとNで暗号化した暗号文を、DとNで復号化できる。
以下の書籍が参考になります。
Linuxや*BSDでは、opensslコマンドでOpenSSLのさまざまな暗号化の機能を使用できる。
とてもたくさんの機能が詰め込まれているため、opensslコマンドだけでとてもたくさんのことができる。
たとえばRSAの公開鍵・秘密鍵の作成や暗号化・複合化などが可能。
OpenBSDも参照のこと。
LibreSSLはOpenSSLからのfork。OpenSSLのハートブリード脆弱性をきっかけにソースコードを検査したところ、forkの必要性があると判断した。
SSL/TLSは、暗号化技術とハッシュ値を用いた電子署名を兼ね備えた技術であり、本人であることを保証し、通信を暗号化し、改竄を防止する。
SSLは、公開鍵暗号を用いた暗号化芸術であるとともに電子署名としても働き、暗号化された本文あるいは通信が誰かに傍受されないようにする(公開鍵暗号を用いた暗号化通信)だけではなく、本人の確認(自分がその公開鍵で復号化することのできる秘密鍵を持っているということが、本人であることの証明になる)や、その内容が改竄されていないかどうかを保証する(ハッシュ値を用いる)こともできる。
通信相手の正当性を保証するために、認証局(CA)から発行される証明書を利用する。サーバ側がサーバ証明書をクライアントに送って正当性を保証する。逆に、クライアント側がクライアント証明書をサーバ側に送ることもある。
(「徹底攻略 応用情報技術者教科書 平成30年度」を参考に執筆しました。)
特に、電子メールの暗号化と電子署名には、PGPとS/MIMEを利用する。
PGPは、信頼できるグループの間で公開鍵を共有する。自分の信頼している人が信頼している人の公開鍵を信頼する。
これに対してS/MIMEでは、公開されている認証局(CA)を用いて、鍵の正当性を保証する。公開鍵暗号による社会基盤のことを公開鍵暗号基盤(PKI)と言う。
S/MIMEでは公開鍵と共通鍵のハイブリッド暗号(メール本文を共通鍵で暗号化し、共通鍵を受信者の公開鍵で暗号化して添付する。こうすることで高速なメール本文の暗号化が可能)を用いる。
詳しくは以下のページ・書籍が参考になる。
メールも参照のこと。
Let's Encryptは無料で使えるSSL/TLSの認証局サービス。自分のサイトでHTTPSでの暗号化通信に対応させるにはこれを使うのが手軽。ただし有効期限が90日と短いことに注意が必要。
2023.10.02
現在広く使われているRSA暗号や楕円曲線暗号は、ただ解読に時間がかかるだけであり、超高速な量子コンピュータが実現すればいとも簡単に破られるということが数学的に証明されている。
これに対して、量子暗号という、量子状態の特性に基づく未来の暗号がある。観測者が観察すると光はゆがみを起こすという量子力学の特性に基づいたもので、第三者が傍受しようとした時に、ほんのわずかであってもノイズが入ってしまう。このノイズをチェックすれば、秘密鍵が有効であるかどうかを判断し、傍受されれば別の秘密鍵に変える、というやり方である。
「量子コンピュータか、あるいは量子暗号か、どちらが先に実現するか」とよく言われている。
以下のページを参考に執筆しました。
量子コンピュータも参照のこと。
共通鍵暗号は、暗号化と復号化の鍵が同じ。公開鍵暗号は、暗号化と復号化の鍵が異なる。
公開鍵暗号を使うことで、データを公開鍵で暗号化して秘密鍵で復号化し、暗号化通信を実現できる。
Wikipedia
ソースコード
Wikipedia
ソースコード
Wikipedia
Wikipedia
ソースコード
diffとpatch・テキスト処理やアーカイブ・同期・デバイス処理を参照のこと。
SSHを参照のこと。
暗号化技術。
書籍