
VPNの暗号化は実際どう動くのか:AES-256、ハンドシェイク、トンネリングを解き明かす
VPNの暗号化は実際どう動くのか:AES-256、ハンドシェイク、トンネリングを解き明かす
VPN暗号化の説明の多くは、安心感を与えるスローガンで終わってしまいます。「あなたの通信は軍事レベルのAES-256で保護されています」。しかしこれでは、自分のデータに実際に何が起きているのかはほとんど分かりません。本当に面白い部分——競合する記事のほぼすべてが省いてしまう部分——は、あらゆる安全な接続の最初の一手にあります。そこでは、一度も出会ったことのない2台のコンピューターが、敵対的なネットワークがやり取りされる一バイトすべてを監視するなかで、秘密の鍵について合意するのです。
この記事では、あなたのデータの一つのパケットを、その全ライフサイクルを通じて追いかけます。ハンドシェイク、鍵交換、実際の仕事を担う共通鍵暗号、すべてを包み込むトンネリング、そして相手側での復号です。その過程で、AES-256とは本当のところ何なのか、なぜ「軍事レベル」という表現が技術仕様ではなくマーケティングなのか、そしてあなたの保護が実際にどこから始まりどこで終わるのかを説明します。曖昧なごまかしも、不安を煽る脅しもありません。
2種類の暗号方式、そしてなぜVPNには両方が必要なのか
パケットを追いかける前に、一つの基礎的な考え方を押さえておく必要があります。暗号には根本的に異なる2つの系統があり、VPNはそれぞれを別々の仕事のために使うということです。
共通鍵暗号は、施錠と解錠の両方に単一の共有鍵を使います。同じ秘密がデータを暗号化し、また復号します。これは非常に高速で、現代のCPUは専用のAES命令を使って毎秒ギガバイト単位で共通鍵データを暗号化します(IntelとAMDのチップは2010年頃からAES-NIハードウェアアクセラレーションを搭載しています)。ただし問題は明らかです。両者が同じ鍵を必要とするのに、盗聴者が耳を澄ましている信頼できないネットワーク越しに、秘密の鍵をそのまま送ることはできないのです。
公開鍵暗号(非対称暗号)は、数学的に結びついた鍵のペアを使います。誰もが知ってよい公開鍵と、秘密のまま保たれる秘密鍵です。一方で施錠したデータは、もう一方でしか解錠できません。これは鍵配送の問題を見事に解決します——公開鍵は公然と共有できるからです——が、はるかに低速で、連続的に流れる通信を暗号化するには実用的ではありません。
あらゆるVPN(そしてあらゆるHTTPSウェブサイト)の中心にある巧みな仕掛けは、両者を組み合わせることです。低速な非対称演算を、最初に一度だけ、ただ高速な共通鍵について合意するためだけに使う。そして重い機構は捨て去り、あとは高速な暗号にすべての本格的な作業を任せるのです。この最初の交渉こそがハンドシェイクと呼ばれるものです。
ステップ1:ハンドシェイクと鍵交換
VPNアプリが接続するとき、あなたの閲覧の一バイトが保護されるよりも前に、あなたのデバイスとVPNサーバーはハンドシェイクを行います。その目標は狭く具体的です。どんな観測者にも計算できなかった同一の共通鍵を両方のマシン上に持ち、サーバーが名乗っているとおりの相手であることを確認することです。
まず認証が来ます。サーバーは自身の公開鍵を含む証明書を提示し、あなたのクライアントはデジタル署名を検証して、中間者攻撃(machine-in-the-middle攻撃)を行う偽者ではなく本物のサーバーと話していることを確認します。ここで通常はRSAやECDSAの署名が働きます。
次に鍵合意が来ます。これこそ理解する価値のあるステップです。現代のVPNはDiffie-Hellmanを使い、ほぼ常にその楕円曲線版であるECDHを用います。Diffie-Hellmanは見事な数学です。両者は公開値を平文でやり取りし、それぞれが相手の公開値を自分の秘密と組み合わせ、そして——その根底にある数論のおかげで——両者が独立して同じ共有秘密にたどり着きます。回線上を流れたすべてを捕捉した盗聴者でも、その秘密を導き出すことはできません。なぜなら秘密の片割れはどこにも送られないからです。
ハンドシェイクの目的のすべては、衆人環視のなかで共有秘密を作り出すことにあります——両端が同一に計算しながらも、観測者が流れていく通信から再構成することのできない鍵を。
その共有秘密から、両者はあなたの実際の通信を暗号化することになる共通鍵のセッション鍵を導出します。これでコストの高い公開鍵のステップは終わりです。WireGuardではこの交換はCurve25519の上に構築され、OpenVPNやIKEv2/IPsecではTLSあるいはIKEハンドシェイクの一部として交渉されます。具体的な名称は異なりますが、その形はどれにおいても同一です。
ステップ2:AES-256とは本当のところ何なのか
共通鍵が手に入ると、VPNは主力の暗号——最も一般的にはAES、すなわちAdvanced Encryption Standard(高度暗号化標準)——に切り替えます。AESは2001年に米国国立標準技術研究所(NIST)によって標準化され、公開された公募コンペティションから選ばれました。優勝したアルゴリズムはもともとRijndaelと呼ばれ、ベルギーの暗号学者Joan DaemenとVincent Rijmenによって設計されました。
マーケティングがめったに説明しないのが次の点です。AESはブロック暗号であり、データを固定長の128ビットのブロック(一度に16バイト)で暗号化します。「256」が指すのは鍵長——256ビット——であって、ブロックサイズではありません。AESは各ブロックを、置換・転置・撹拌からなる複数のラウンドで処理します。AES-128は10ラウンド、AES-192は12ラウンド、AES-256は14ラウンドを使います。ラウンドが多く鍵が長いほど安全マージンは大きくなり、その代償としてわずかな性能低下があります。
ブロックサイズ: 128ビット。すべてのAESバリアントで同じです。
鍵長: 128、192、または256ビット——この数字が指す唯一の違いです。
ラウンド数: それぞれ10/12/14——鍵が長いほど変換のパスが増えます。
モードが重要: 素のAESはストリームを安全に暗号化するために動作モード(GCMやCBCなど)を必要とします。VPNは認証付きモードを使い、素のブロック暗号化は決して使いません。
「軍事レベルの暗号化」:そのラベルを暴く
「軍事レベルの暗号化」はマーケティング表現であって、技術的な認証ではありません。ソフトウェアを軍事レベルと認定する標準化団体など存在しません。ベンダーが言いたいのは、AES-256が機密情報をTOP SECRET(最高機密)レベルまで保護するために米国国家安全保障局(NSA)に承認されている、ということです——それは事実ですが、同じNSAのガイダンスはAES-128もSECRETレベルのデータ向けに承認しています。どちらもAESであり、どちらも安全とみなされています。
正直に言えばこうです。AES-128とAES-256はどちらも、公開された暗号解析が知るかぎり、総当たり攻撃では事実上破ることができません。128ビットの鍵には2^128通りの値があり——およそ340澗(かん)です。地球上のあらゆるコンピューターを徴用したとしても、太陽が燃え尽きるより前に一本のAES-128鍵を総当たりで割り出すことはできないでしょう。AES-256の2^256の鍵空間は「2倍」強いのではありません。それはさらに天文学的に大きいのですが、AES-128の時点ですでに現実的な攻撃の限界をはるかに超えていたのです。総当たり攻撃に対するAES-128とAES-256の現実世界での差は、あらゆる実用的な意味でゼロです——どちらも手の届かないところにあります。
では、なぜAES-256を好むのでしょうか。一つには将来の暗号解析の進歩に対するマージン、もう一つには量子コンピューティング(後述します)が理論上は実効的な鍵強度を半減させるため、AES-256のほうがより余裕のあるバッファを残せるからです。しかし、VPNがあなたを守るとすれば、それは128ビットと256ビットの違いのおかげではありません。暗号を取り巻くすべて——ハンドシェイク、鍵管理、実装——のおかげなのです。完璧な暗号も、壊れたハンドシェイクの下では何も守りません。
ステップ3:トンネリング——パケットを包む
いよいよ実際のデータです。あなたがウェブページをリクエストするとしましょう。あなたのデバイスは普通のIPパケットを組み立てます。宛先アドレスを記したヘッダーと、リクエストを含むペイロードです。VPNがなければ、そのパケットは宛先——そしてしばしば中身も——が見える状態で、あなたのISPのネットワークを横断していきます。
VPNがあると、カプセル化が起こります。VPNクライアントはあなたの元のパケット全体——ヘッダーごと——を取り、共通鍵のセッション鍵を使って判読不能な塊に暗号化します。そしてその塊を新しい外側のパケットの中に包みます。外側パケットのヘッダーが外の世界に伝えるのはただ一つ、これはVPNサーバーへ向かう通信だということだけです。あなたの本来の宛先は、暗号化されたペイロードの中に封じ込められています。
これが「トンネル」です。それは物理的な管ではなく、あなたの本物のパケットが新しいパケットの暗号化された積荷になる、このマトリョーシカのような入れ子の仕組みです。あなたのローカルネットワークを監視している誰か——あなたのISP、同じカフェのWi-Fiにいる人、ネットワーク事業者——に見えるのは、VPNサーバーのIPアドレスへと流れていく暗号化されたパケットだけで、その中身も最終的な行き先も分かりません。
元のパケット: あなたの本物の宛先+あなたのデータ——VPNがなければ丸見えです。
暗号化されたペイロード: そのパケット全体を、セッション鍵で撹拌したもの。
新しい外側ヘッダー: VPNサーバー宛てのみ——盗聴者が読めるのはこれだけです。
結果: 観測者にはあなたがVPNを使っていることとデータ量は分かりますが、その中身や最終的な宛先は分かりません。
ステップ4:サーバーでの復号と、帰りの旅
包まれたパケットがVPNサーバーに到達します。サーバーは対応する共通鍵のセッション鍵を持っているので、外側のペイロードを復号し、あなたの元のパケットを取り戻し、その本当の宛先を読み取ります。そして、そのリクエストをあなたに代わって広いインターネットへと転送します——ただし今や、そのリクエストはあなたではなくサーバーのIPアドレスから発信されているように見えます。これがVPNがあなたの見かけ上の所在地を変える理由です。
ウェブサイトはVPNサーバーに返信します。サーバーはその応答を同じセッション鍵で暗号化し、カプセル化し、トンネルを通してあなたのデバイスに送り返し、デバイスがそれを復号します。すべての往復でこれが繰り返されます。暗号化、カプセル化、送信、カプセル解除、復号。共通鍵暗号はハードウェアアクセラレーションされているため、これはわずかなオーバーヘッドしか加えません——あなたが感じる遅延の大半は、演算ではなく、通信がサーバーを経由して物理的に遠回りすることによるものです。
秘匿だけではない:完全性と認証
暗号化はあなたのデータを隠しますが、それだけではデータが改変されずに届いたことを証明しません。高度な攻撃者は、復号することなく暗号文中のビットを反転させて、平文を破壊したり操作したりできる場合があります。安全なVPNは、機密性だけでなく完全性と認証のチェックによってこれに対抗します。
古い設計では、別個のHMAC(ハッシュベースのメッセージ認証コード)を付け足します。パケット全体にわたって計算される暗号学的なタグで、受信者があらゆる改ざんを検知できるようにします。現代の設計はAEAD暗号——Authenticated Encryption with Associated Data(関連データ付き認証暗号)——を使い、暗号化と完全性を一つの処理に統合します。AES-GCMとChaCha20-Poly1305が、2大AEAD構成です。AEADパケットのたった1ビットでも転送中に改変されれば、認証タグの検証が失敗し、そのパケットは信頼されずに破棄されます。
ChaCha20-Poly1305は特筆に値します。WireGuardがこれを専一に使っており、AESハードウェアアクセラレーションを持たないデバイスでは既定の選択肢となるからです——多くのスマートフォンや低消費電力プロセッサでは、ChaCha20のほうがAESよりも高速で、より一定時間に動作します。これはAESより弱いわけではなく、Daniel J. Bernsteinによって設計された、別の、同等に尊重されている現代的な暗号です。
前方秘匿性:盗まれた鍵がマスターキーにならない理由
まじめなVPN設定をずさんなものから分ける、ある性質があります。前方秘匿性(PFS:perfect forward secrecy)です。ハンドシェイク中に導出されるセッション鍵は一時的(ephemeral)——つまり一時限りで、セッションごとに新たに生成され、定期的にローテーションされ、その後破棄されます。これらが長期の秘密としてディスクに書き込まれることは決してありません。
その帰結は重要です。仮に敵対者が今日あなたの暗号化された通信をすべて記録して保存し、それから何年も後にVPNサーバーを侵害してその長期秘密鍵を盗んだとしましょう。前方秘匿性があれば、その盗まれた鍵はあなたの過去のセッションを遡って復号することはできません。なぜなら、実際のセッション鍵は一時的でとうになくなっており——長期鍵だけからは決して導出できなかったからです。各セッションはそれぞれの瞬間の中に封じられています。これこそ、ハンドシェイクが静的な鍵を再利用するのではなく、一時的なDiffie-Hellman(しばしばECDHEと書かれ、末尾のEは「ephemeral(一時的)」を表します)を使う理由なのです。
暗号化が終わる場所:出口ホップが重要
広く信じられている誤解に、VPNはあなたの通信をウェブサイトまでずっと暗号化する、というものがあります。そうではありません。VPNの暗号化が守るのは、あなたのデバイスとVPNサーバーの間の区間だけ——それだけです。いったんサーバーがあなたのパケットを復号して本来の宛先へ転送すれば、あなたのデータは、その宛先が提供するどんな保護のもとであれ、公衆インターネットを進んでいきます。
これが、VPNを使っていてもHTTPSが依然として重要な理由です。https://のサイトを訪れれば、その通信は独立した独自のTLS暗号化をエンドツーエンドで持つので、VPNの出口を過ぎても保護されたままです。しかし平文のhttp://で何かを送れば、それはVPNサーバーから平文で出ていき、サーバーと宛先の間にいる誰にでも読めてしまいます。VPNはあなたの暗号化されていない出口通信を見られる相手を移すだけです——あなたのローカルISPから、VPNプロバイダーとその先のネットワークへと——平文を魔法のように安全にするわけではありません。その立場を託すに足ると思えるプロバイダーを選び、そしてHTTPSを使い続けてください。
よくある神話を正す
「AES-256は破れない」 永遠に破れない本格的なシステムなど存在しませんし、そもそも攻撃が暗号そのものを狙うことはめったにありません——狙われるのは弱い鍵、バグのある実装、漏洩した認証情報、あるいはソフトウェアを使う人間です。数学は最も強い鎖であり、その周りのすべてはより柔らかいのです。
「どうせ総当たりで破られる」 128ビットの鍵を総当たりするのは遅いのではなく——物理的に実行不可能です。その数値は観測可能な宇宙のエネルギーと時間の予算を超えています。本当の侵害は、暗号を打ち破ることではなく、迂回することから生じます。
「量子コンピューターが私のVPNを瞬時に破る」 これは最も過剰に喧伝された主張です。Groverのアルゴリズムは理論上、共通鍵の実効強度を半減させ、AES-256を依然として余裕のある約128ビットのマージンに落とす可能性があります。より大きな長期的懸念は非対称ハンドシェイク(RSA/ECDH)で、これはShorのアルゴリズムが脅かします——だからこそ業界はポスト量子の鍵交換へ移行しつつあります。しかし、これを実行できる量子コンピューターは今日存在せず、「今収集し、後で復号する(harvest now, decrypt later)」は将来のリスクであって、現在の破綻ではありません。
「ビット数が多いほど常により安全」 ある閾値を超えると、鍵長は総当たり攻撃に対して意味を持たなくなります。現実の安全性は、128か256かよりも、プロトコル設計、前方秘匿性、そしてクリーンな実装によってはるかに大きく決まります。
実践的な要点
スローガンを剥ぎ取れば、VPNの暗号化は、きれいでよく理解されたパイプラインです。公開鍵のハンドシェイクが共有の共通鍵を立ち上げ、その鍵がAES-GCMやChaCha20-Poly1305のような高速な認証付き暗号を駆動し、あなたのパケットは暗号化された外側パケットの中にカプセル化され、そして一時的な鍵が、たとえ明日サーバーが侵害されても今日の秘密を秘密のまま保ちます。
暗号(AES-128かAES-256か)が決め手になることはめったにありません——どちらも総当たりのはるか先にあります。
現代的なプロトコル(WireGuard、あるいは適切に設定されたOpenVPN/IKEv2)、認証付きのAEAD暗号化、そして前方秘匿性を優先しましょう。
暗号化はVPNサーバーで終わることを忘れずに——真のエンドツーエンドの保護のためにHTTPSを使い続けましょう。
「軍事レベル」や「破れない」はマーケティングの雑音として扱い、VPNはその実装、鍵の取り扱い、そして運営者に寄せる信頼によって判断しましょう。
よくある質問
「軍事レベルの暗号化」は本物ですか、それとも単なるマーケティングですか?
マーケティングです。公式の「軍事レベル」認証など存在しません。この表現は通常AES-256を指しており、確かに米国NSAは機密データをTOP SECRET(最高機密)まで保護するためにこれを承認しています——が、NSAはSECRETレベルのデータ向けにAES-128も承認しています。暗号は本物で強力ですが、ラベルはそれを包んだ単なる販促用語にすぎません。
AES-256暗号化とは何ですか、簡単に言うと?
AES-256はAdvanced Encryption Standard(高度暗号化標準)を256ビットの鍵で使うものです。これはブロック暗号で、データを128ビットの塊ごとに14ラウンドの数学的変換を通じて撹拌します。「256」は鍵長のみを指し、ブロックサイズを指すのではありません。そして今日使われている暗号の中で最も分析され、信頼されているものの一つです。
VPNのハンドシェイク中には実際に何が起きているのですか?
VPNハンドシェイクは(証明書とデジタル署名を通じて)サーバーを認証し、鍵交換——通常は楕円曲線Diffie-Hellman——を実行します。これにより両者は、鍵をネットワーク越しに一度も送ることなく、同じ秘密の共通鍵を独立して計算します。その共通鍵があなたの実際の通信をすべて暗号化し、低速な公開鍵演算を一度きりの準備ステップにとどめるのです。
VPNのトンネリングはどのように機能するのですか?
VPNトンネリング、すなわちカプセル化は、あなたの元のデータパケットを取り、それを完全に暗号化し、VPNサーバー宛てだけの新しい外側パケットの中に包みます。あなたのローカルネットワーク上の観測者には、サーバーへ向かう暗号化された通信が見えるだけで、その中身も本当の宛先も分かりません。サーバーがそれを開いて復号し、それから本当の宛先へ転送します。
VPNにはAES-256のほうがAES-128より良いのですか?
実際には総当たり攻撃に対する差はごくわずかです——どちらも破るのが計算上実行不可能で、AES-128の2^128の鍵空間でさえ、いかなる現実的な計算能力をも超えているからです。AES-256はより大きな安全マージンと、将来の量子的進歩に対するより良いバッファを提供しますが、現実世界のVPNの安全性は、鍵のサイズよりも、プロトコル設計、前方秘匿性、実装品質にはるかに大きく依存します。
前方秘匿性とは何で、なぜ重要なのですか?
前方秘匿性とは、各セッションが一時的(ephemeral)な鍵を使い、それらが新たに生成されてから破棄されることを意味します。攻撃者が後にVPNサーバーの長期秘密鍵を盗んだとしても、過去に記録されたあなたのセッションを復号することはできません。なぜなら、それらのセッション鍵はもう存在せず、長期鍵だけからは決して導出できなかったからです。あなたの履歴を将来の侵害から守るのです。
VPNは私の通信をウェブサイトまでずっと暗号化してくれますか?
いいえ。VPNの暗号化が守るのは、あなたのデバイスとVPNサーバーの間の区間だけです。いったんサーバーがあなたの通信を復号して先へ転送すれば、保護は宛先しだいになります——HTTPSサイトはエンドツーエンドで暗号化されたままですが、平文のHTTP通信はVPNサーバーから読める平文で出ていきます。だからこそ、VPNを使っていてもHTTPSを使い続けるべきなのです。



