攻撃と防御 — 破る側の視点で守りを設計する
暗号は数式が正しいだけでは安全になりません。使い方・実装・運用の隙間を突かれて破られます。ここでは代表的な3つの攻撃 — 認証なき鍵交換への中間者攻撃、パスワードへの総当たり/辞書攻撃、実行時間の漏れを突くタイミング攻撃 — を動かしながら、それぞれの防御がなぜ効くのかを理解します。攻撃を学ぶのは、あくまで守りを設計するためです。
1. なぜ「破る側」の視点で学ぶのか
堅牢なシステムを作る人は、必ず攻撃者の頭で自分の設計を眺めます。「この鍵はどこから漏れうるか」「この比較処理は何を教えてしまうか」と問い続けることで、仕様書には現れない現実の攻撃面(attack surface)が見えてくるからです。防御を学ぶ最短路は、攻撃の原理を知ることにあります。
本章で扱うのは、いずれも原理の可視化です。実際に第三者のシステムへ仕掛けられる具体的な手順やツールは扱いません。攻撃の「かたち」を掴み、それを封じる設計思想を身につけるのが目的です。
2. 中間者攻撃 — 認証なき鍵交換の急所
DH鍵交換は、盗聴者がいても共有鍵を作れる魔法でした。しかしそれは「相手が本人かどうか」を何も保証しません。回線の途中に割り込んだ攻撃者(マロリー)が、アリスにもボブにも「自分が相手だ」と振る舞えば、両側と別々の鍵を結んでしまいます。これが中間者攻撃(MITM)です。
下のデモで「次のステップ」を進めてください。マロリーがアリス⇔マロリー間の鍵 K1 と、マロリー⇔ボブ間の鍵 K2 を別々に握り、中間ですべてを復号・再暗号化できてしまう様子が見えます。次に「証明書で公開鍵を認証」をONにすると、同じ攻撃が検知されてブロックされます。
3. パスワードという弱点 — 総当たりと辞書、そしてソルト
パスワードの強さは、素朴には総当たり(ブルートフォース)で試すべき候補の数で決まります。使える文字の種類を N、長さを L とすると、候補は NL 通り。これを情報量(エントロピー)で測ると L·log2N ビットです。1ビット増えるごとに解読コストは2倍になります。
下のデモで文字種と長さを変え、総当たり空間と推定解読時間がどう激変するかを見てください。「8文字の英数字」と「4単語のパスフレーズ」の比較、そして攻撃シナリオ(試行速度)による解読時間の差にも注目です。
Password2024! は13文字あり、総当たりだけ考えれば強そうに見える。しかし攻撃者はまずよくある単語・人名・流出パスワード・年号・キーボード配列を並べた辞書から試す。辞書に載る語や「単語+数字」のありがちな組み合わせは、長さの割に候補数が桁違いに小さく、実質20ビット前後しかない。強さは長さだけでは決まらない — 予測できないことが本質。無関係な単語を並べた長いパスフレーズが強いのはこのためだ。
4. サイドチャネル — 時間が秘密を漏らす
暗号アルゴリズムが数学的に堅牢でも、それを走らせる物理的な実装が秘密を漏らすことがあります。実行時間・消費電力・電磁波・キャッシュの状態など、本来の入出力の「横(side)」から情報がにじみ出る経路をサイドチャネルと呼びます。
最も直感的なのがタイミング攻撃です。下は、パスワード(トークン)を1文字ずつ比較し、不一致を見つけた瞬間に処理を打ち切る脆弱な照合のトイモデル。合っている文字が多いほど照合に時間がかかるため、応答時間の差から正解の文字が1つずつ絞り込まれていきます(説明のため誇張・単純化したモデルです)。「定数時間比較」をONにすると、常に全文字を比較して時間差を消し、この漏れを塞ぎます。
5. まとめ — 多層防御と、越えてはならない一線
- 中間者攻撃:認証なき鍵交換は無防備。公開鍵を証明書で認証してすり替えを検知する。
- 総当たり・辞書攻撃:強さ=候補数(エントロピー)。長さと文字種で空間を広げ、ソルトで一括攻撃を無効化、ストレッチングで試行速度を落とす。辞書に載る語は長くても弱い。
- サイドチャネル:数学が正しくても実装が漏らす。定数時間比較・定数時間実装で「横からの漏れ」を塞ぐ。
- 多層防御:独立した対策を重ね、一枚破られても全体は守る。