暗号化の仕組みと必要性
コンピュータ通信による暗号化の必要性
前回コンピュータネットワークは葉書のようなもので、経路にいる存在は中身を見ることが可能である、という話をした。
これは端的に事実であるが、インターネットが研究者だけのものではなく一般に開放されるにつれて「ほかの人には秘密で相手にだけ届けたい」という欲望が出てくるわけで・・・。
ここで「暗号化」という発想が出てくる。
暗号化して相手以外は秘密にしてやり取りをしたい、という欲自体は紀元前から存在する。
シーザー暗号という、アルファベットをズラして違う文字におきかえることで暗号化する、という方法である。
例えばシーザー暗号の亜種にROT13というものがある。
英語アルファベット26文字を13文字ずらして表現する。Zを過ぎるとAに戻る。
これを利用するとENGINEERLIFE⇒RATVARREYVSRになる。
なお、意味の通じる元の分を平文(ひらぶん)、暗号化されたよくわからん文字列を暗号文、暗号文から平文を戻すことを復号(ふくごう)という。
ROT13の場合、暗号化関数と復号化関数が一致しているので、2000年ごろの英語圏では「隠す気のない暗号」程度によく利用されたような記憶がある。
https://ja.wikipedia.org/wiki/ROT13
なおシーザー暗号の場合、文字の登場頻度から復号が可能である。
(英語の場合eの出現率が一番高く、zやxの出現率が低い。変換対象の文字をごちゃごちゃに入れ替えたとしても充分な文書があればこの方法で変換表を作れる。)
コンピュータと十分なサンプルがあればこの暗号は数分で解くことが可能になってしまう。
でも実際のインターネットでその程度の暗号では使い物にならないのでもっと強化した暗号が必要になりました。
共通鍵暗号
シーザー暗号でもそうですが、暗号化には「事前に暗号化方法と鍵」を相手方と共有しておく必要があります。
ROT13なら「英語アルファベット26文字内で後ろの数字文ずらす」というのが暗号化方法。13が鍵となる。
で、この暗号化方法や鍵の受け渡しには非常に気を使ったわけです。
第2次世界大戦までアナログ無線は戦争で利用されているわけだが、スパイは割と真面目にこの暗号化方法や鍵の伝達方法を敵から奪う必要があったし、味方へは敵に奪われずに正しく届ける必要があった。
でも、同じ鍵をずっと使っているとそのうち解読されるし、かといって鍵を安全に送れるなら平文だって安全に送れるわよ・・・という鍵配送の問題が出てくるんですよねぇ...
余談から本筋に戻すとして、「事前に鍵を共有」する暗号化方式を共通鍵暗号という。
変換方式自体が有名でも鍵が強ければそれなりに暗号として使えるわけです。
ちなみに吹越が腹抱えて笑った共通鍵暗号に関する話は、第二次世界大戦中の薩摩弁で方言がきつすぎて堂々と国際電話でやり取りしたのにどこの言語かも理解されなかった(日本語に思われなかった)という話である。https://ja.wikipedia.org/wiki/%E8%96%A9%E9%9A%85%E6%96%B9%E8%A8%80
公開鍵暗号
で、後から生まれたのが公開鍵暗号方式。
著名な公開鍵方式としてRSA暗号をベースに解説をします。
RSA暗号では2つの素数を利用します。
例えば11*13を計算するのは簡単だが、143を素因数分解しろと言われるとちょっと時間がかかる、というのがベースです。
公開鍵暗号方式では一般的に相手から自分へ暗号化して送ってもらうための公開鍵(上でいうと143)と秘密鍵(143は11と13のペアというほう)を持ちます。
現在においては256bitや512bit範囲の素数とか使うんですけどね。
で、高速に素因数分解とかできればRSA暗号は解読可能になります。
量子コンピュータのショアのアルゴリズムというのを使うと超高速で素因数分解できることが証明されているので「量子コンピュータができるとクレカが使えなくなる」なんていわれるわけですね。(クレカの番号がわかると決済ができる⇒だから普通は暗号化して送る⇒暗号文事態を盗聴することは可能だけど総当たりだと数千年単位で時間かかるからOK⇒量子コンピュータで数分で終わるならだめじゃん・・・という流れ)
まぁほかの公開鍵方式があるんだけど。
ちなみに公開鍵は必ず秘密鍵も持つわけですが、間違えて秘密鍵も一緒に相手に渡してしまう間抜けとか公開鍵を公開したくないと言い出す頓珍漢がちょいちょいいるんですよねぇ...
TLS
HTTPSで用いられる暗号化通信のこともしくはそのプロトコルをSSLといいます。
ただし、暗号化プロトコルとしてのSSLはハートブリード(心臓出血)と呼ばれるレベルの超やべぇ欠陥が見つかったので、使用するのはやべぇ、というのが2021年現在の地球上の認識です。
なのでSSLというと「暗号化通信してるよ」的な意味で利用されることが微妙にあります。
で、SSLの代わりに暗号化プロトコルとして名前がついているのがTLSです。
TLS1.3というのが現在試験利用中の最新版、安定板はTLS1.2、脆弱性が見つかってて非推奨なのがTLS1.1および1.0ですね。
セキュリティに気を付けているWebサーバだとTLS1.1とかで通信しようとしてくるとエラーを返す設定にします。
あえて低いバージョンの暗号化プロトコルで接続してきて、その脆弱性を利用してサーバを乗っ取ろうとするサイバー攻撃があります。
サーバの証明
HTTPSを用いて通信する場合、サーバ認証機能という機能があります。
ブラウザのアドレス記載場所に載ってる南京錠のマークですね。
これをクリックするとサーバ証明書を見ることができます。
この証明書は「認証局」というところが「この内容で発行したよ」というのを秘密鍵を用いて暗号化します。
秘密鍵で暗号化すると、公開鍵で復号化できる性質がある公開鍵暗号を利用します。RSA暗号もその一つです。
秘密鍵で暗号化すると公開鍵で復号できるので、この公開鍵でちゃんと複合できる内容と平文が一致するからこれはこの公開鍵を出しているところですね、という感じ。
で、サーバ証明書には実は3つの種類がある。
URL文字列(ドメイン)が正しいよ、ということを証明するドメイン認証。
認証局が「企業が存在するよ」まで認証する企業認証型。(会社に電話してくるとかするねん)
認証局に登記登録とかまで確認させる「EV SSL認証」
上記の3つで下のほうほど確認事項が増えて「ちゃんと実在する組織だよ」ということが認証される。
まぁ暗号としての強さはどの証明書でも変わらんし、Googleも「EV SSLでも結局無意味じゃね?」と言い出してchrome77からEV-SSLの特別扱いやめたので高い金出してEV-SSL証明を取るのは基本的に「見栄」以上の理由が無くなった。
※ちょっと古い情報科の教科書には「EV-SSLは緑色で強調表示」とか書いてあったけどもう無くなったので注意。
ちなみにサーバ証明書で証明できるのは「ドメインとサーバが一致している・企業が存在する」くらいなので、フィッシングメールなどで偽ドメインに誘導したとしても偽の内容で証明書作ること自体が簡単なので「繋いでいるサーバが詐欺師の用意したものではない」という保証にならないので注意。
電子署名
秘密鍵と公開鍵のペアは個人単位で持つことも可能なので、PDFなどに対して同じく秘密鍵を用いた暗号で署名することが可能です。