暗号化とは?南京錠でわかる鍵交換のしくみ
画像出典: 写真: Dietmar Rabich(CC BY-SA 4.0 / Wikimedia Commons)
暗号化とは、鍵を使ってデータを第三者に読めない形へ変える処理です。公開鍵暗号では「誰でも掛けられる南京錠(公開鍵)」を配り、「開けられる鍵(秘密鍵)」は自分だけが持つことで、初対面の相手とも安全に鍵を渡し合えます。TLSはこの方式で最初の鍵交換だけを行い、以降は高速な共通鍵暗号に切り替えるハイブリッド構成です。
錠マークが出ていれば安心、というところまでは多くの人が知っています。けれど「誰が」「何を」「どうやって」隠しているのかを説明できる人は多くありません。
暗号化の中心にあるのは、実はとても身近な道具の話です。南京錠を一つ思い浮かべられれば、暗号化の骨組みはほぼ理解できます。週末に腰を据えて、通信が守られる流れを最初から最後までたどってみましょう。
暗号化とは、そもそも何をしている処理?
総務省の解説によれば、暗号化とはデータを第三者に分からなくする処理のことです。暗号鍵を使ってデータを変換し、復号(元に戻すこと)には対応する鍵を用います。
ポイントは、隠しているのが「データそのもの」ではなく「読み方」だという点です。暗号化された通信は、途中の通信経路を流れていること自体は隠せません。カフェのWi-Fiでも、通信会社の設備でも、データは物理的にそこを通っていきます。
通っていくけれど、鍵を持たない人には意味のある文字列に見えない。これが暗号化の守り方です。盗み見られないのではなく、盗み見ても読めない。ここを取り違えると、後の話がずっとぼやけます。
鍵が1本しかない世界の困りごと
最も素直な暗号は、同じ1本の鍵で掛けて、同じ鍵で開ける方式です。これを共通鍵暗号方式と呼びます。金庫と、その金庫の鍵の関係を思い浮かべてください。
速くて効率がいい方式ですが、決定的な問題があります。相手にその鍵をどうやって渡すのか。
これは鍵配送問題と呼ばれる、暗号の世界で長く立ちはだかった壁です。鍵を安全に渡すには安全な通信路が要る。けれど安全な通信路を作るには鍵が要る。堂々巡りになります。
初めて訪れる通販サイトと、事前に鍵を交換する機会などありません。それでもブラウザは接続した瞬間に暗号通信を始めます。この矛盾を解いたのが、次に見る公開鍵暗号方式です。
公開鍵暗号を南京錠で言い換えるとどうなる?
公開鍵暗号方式では、役割の違う2つの鍵をペアで使います。暗号化に使う「公開鍵」と、復号に使う「秘密鍵」です。公開鍵は誰でも入手できるように配ってよく、対応する秘密鍵がなければ復号できません。
ここで南京錠を持ち出します。
- 公開鍵=開いた状態の南京錠/誰でも受け取れて、誰でもカチッと掛けられる
- 秘密鍵=その錠を開けられる唯一の鍵/持ち主だけが手元に置く
- 掛けるのは簡単、開けるのは持ち主だけという非対称さが本質
あなたが誰かに秘密の荷物を送りたいとします。相手はまず、開いた南京錠をたくさん作って、誰にでも配ります。郵送でも構いませんし、途中で他人に見られても問題ありません。開いた南京錠は、拾われたところで何の秘密も漏らさないからです。
あなたはその南京錠を1つ受け取り、荷物の箱に掛けて送り返します。掛けた瞬間、あなた自身にももう開けられません。開けられるのは、対の鍵を持つ相手だけです。
これが公開鍵暗号の流れそのものです。受信者が鍵ペアを生成し、公開鍵を配布し、送信者が公開鍵で暗号化し、受信者だけが秘密鍵で復号する。事前の打ち合わせなしに秘密を送れるので、鍵配送問題が解けます。
なぜ「掛けられるのに開けられない」が成り立つのか
数学的な仕掛けは、片方向にだけ計算が簡単な問題を使うことにあります。たとえば大きな数を2つ掛け合わせるのは一瞬ですが、掛け合わせた結果から元の2つを言い当てるのは桁が大きくなるほど現実的でなくなります。
「開けられない」は、原理的に不可能という意味ではありません。手持ちの計算機で現実的な時間内に解けない、という意味です。だから鍵の長さが問題になります。鍵が長いほど探索すべき候補が跳ね上がり、破るための時間が非現実的な領域へ押し出されます。
実際に使う方式は各国で評価されています。日本ではCRYPTREC(政府による暗号技術評価プロジェクト)が暗号リストを公開しており、TLSで使う共通鍵暗号としてAESやCamelliaを、公開鍵暗号としてRSA-OAEPなどを推奨リストに掲載しています(CRYPTREC暗号リスト LS-0001-2022R1、2023年3月30日付)。AES-256やRSA-2048といった鍵長は、広く採用されている実装例のひとつです。
暗号の安全性は計算量の壁に支えられているため、計算機の性能向上や新しい解読手法によって評価は変わります。かつて広く使われたSSLが脆弱性のためTLSへ移行したように、安全とされる方式は時代とともに入れ替わります。古い方式を使い続けないこと自体が、暗号を使ううえでの対策のひとつです。
TLSは南京錠をどう使って通信を守っている?
ここまでの南京錠が、実際のWebでどう働いているかを見ます。ブラウザとサーバーの間の暗号通信を担うのがTLS(Transport Layer Security、通信を暗号化する規格)です。総務省の解説どおり、SSL/TLSはデータを暗号化して送受信し、クレジットカード番号や個人情報の盗聴を防ぎます。
意外に思われるところですが、TLSは通信の中身すべてを公開鍵暗号で守っているわけではありません。公開鍵暗号は計算の負荷が重く、動画や大きなファイルを丸ごと処理するには向かないからです。
そこでTLSは、役割を分けます。最新のTLS 1.3(IETF RFC 8446として2018年8月に正式発行)の大枠は次の流れです。
- クライアントが挨拶するブラウザが対応できる暗号方式の一覧をサーバーへ提示します(ClientHello)。
- サーバーが方式と証明書を返す使う方式を選び、公開鍵を含むサーバー証明書を返します。ここで南京錠が渡されます。
- 共通のセッション鍵を作る鍵交換の手続きを経て、両者が同じ1本の鍵(セッション鍵)を手元に導出します。
- 以降は共通鍵で高速にやり取りする重い公開鍵暗号は最初だけ。本文のやり取りは軽い共通鍵暗号で行います。
つまり「公開鍵暗号で最初の鍵渡しだけを安全に済ませ、あとは共通鍵暗号で速く通す」ハイブリッド方式です。南京錠は、金庫の鍵を安全に送り届けるためだけに使われる、と考えると腑に落ちます。
TLS 1.3ではこのやり取りが1往復(1-RTT)に短縮され、古い暗号方式は仕様から削除されました。さらに、一時的な鍵を使う鍵交換が必須化されています。
「前方秘匿性」がうれしい理由
一時鍵の必須化は、前方秘匿性(forward secrecy)と呼ばれる性質のためです。名前は難しいのですが、中身は単純です。
セッションごとに使い捨ての鍵を作っておくと、仮に将来サーバーの秘密鍵が漏れても、過去に記録された通信までは復号されません。その通信で使った鍵はもう存在しないからです。
盗聴者が今日の暗号文をすべて保存しておき、何年か後に鍵を手に入れて一斉に読む、という筋書きを封じる設計です。TLS 1.3では例外なくこの守りが効きます。
錠マークは何を保証していて、何を保証していない?
アドレスバーの錠マークは、TLSで通信が暗号化されていることを示します。加えてもう1つ大事な役目があります。電子証明書によって、通信相手が名乗っているとおりの相手かを確認することです。総務省の解説でも、なりすまし防止が証明書の役割として挙げられています。
南京錠の例えで言えば、この確認がないと危うい穴が開きます。あなたが受け取った「開いた南京錠」が、本物の相手のものではなく、途中で入れ替えられた第三者のものだったら。あなたは律儀に暗号化して、その第三者に開けさせてしまいます。
証明書は「この公開鍵は確かにこのサイトのものだ」という第三者の裏書きです。錠マークは、暗号化と身元確認の2つがそろったことを示しています。
証明書が保証するのは、通信が暗号化されていることと、接続先が証明書の示すドメインであることです。そのサイトの運営者が誠実かどうかは何も保証しません。詐欺サイトも証明書を取得できるため、錠マークがあることを理由に個人情報やカード番号を入力してよい、とはなりません。確認すべきはマークの有無より、ドメイン名が本物かどうかです。
いまや暗号化は例外ではなく前提
Googleの透明性レポートによれば、2015年頃に30〜45%程度だったHTTPSの利用率は、2020年前後には95〜99%程度まで上昇し、その後も高水準で推移しています。デスクトップの利用者は、閲覧ページの半数以上・閲覧時間の3分の2をHTTPS経由で過ごしているとされます。
裏返すと、錠マークが付いていないページのほうが今では珍しい状態です。「暗号化されているから安全」という感覚が実感を伴わないのは、当たり前になりすぎて差が見えないからでもあります。
しくみがわかると、日常の判断はどう変わる?
ここまでの理解を、実際の場面に落としてみます。
- 公衆Wi-Fiでも、HTTPSのページなら中身は読まれない/通信経路が信用できなくても、鍵を持たない者には解読できないため
- ただし接続先が偽サイトなら暗号化は無力/正しく相手に届いた暗号文を、その相手が悪意ある側だっただけになる
- 古い端末・古いブラウザは弱い方式に落ちうる/新しい仕様ほど危険な方式が削除されている
- OSとブラウザの更新は暗号の更新でもある/方式の入れ替えは更新を通じて届く
暗号化が守ってくれるのは「通信経路」であって、「接続先の正しさ」や「端末そのものの安全」ではありません。この線引きが引けると、どこに気をつければいいかが自然と絞られます。
3つ目と4つ目に共通するのは、更新です。暗号の安全性は固定されたものではなく、評価が変わるたびに仕様が入れ替わります。OS・ブラウザを最新に保つことは、そのまま最新の暗号方式を使うことを意味します。NISCとIPAの「サイバーセキュリティ対策9か条」でも、OS・ソフトウェアを常に最新の状態に更新することが最初に挙げられています。
南京錠を1つ思い浮かべられれば、公開鍵暗号もTLSのハンドシェイクも同じ絵で説明がつきます。掛けるのは誰でも、開けられるのは持ち主だけ。この非対称さが、見知らぬ相手と秘密を共有できる唯一の入り口になっています。
次に錠マークを見たときは、その裏で南京錠が1往復してセッション鍵が生まれた、という絵を思い出してみてください。しくみが見えている人ほど、どこで警戒すべきかを落ち着いて判断できます。
よくある質問
公開鍵と秘密鍵の違いは何ですか?
公開鍵は暗号化に使う鍵で、誰でも入手できるよう配布して構いません。秘密鍵は復号に使う鍵で、持ち主だけが保管します。公開鍵で暗号化されたデータは、対応する秘密鍵がなければ復号できないため、公開鍵が第三者に渡っても内容は守られます。
暗号化されていれば公衆Wi-Fiでも安全ですか?
HTTPSで接続しているページであれば、通信の中身は鍵を持たない第三者には解読できません。ただし暗号化が守るのは通信経路であり、接続先が偽サイトである場合や端末自体がマルウェアに感染している場合は守れません。ドメイン名が正しいかの確認は別途必要です。
TLSは公開鍵暗号だけで通信を暗号化しているのですか?
いいえ、公開鍵暗号と共通鍵暗号を組み合わせたハイブリッド方式です。最初に公開鍵暗号を使って両者が同じセッション鍵を安全に導出し、以降のデータのやり取りは処理が軽い共通鍵暗号で行います。公開鍵暗号は計算負荷が重いため、鍵交換の場面に限って使われます。
アドレスバーの錠マークは何を保証していますか?
通信がTLSで暗号化されていることと、接続先が電子証明書の示すドメインであることの2点です。サイト運営者が誠実かどうかや、掲載内容が正しいかどうかは保証しません。詐欺サイトも証明書を取得できるため、錠マークの有無だけで安全性を判断しないでください。
※記事で使用した内容・数値は変更される場合があります。最新情報は公式サイトをご確認ください。