【AES入門編】ECB・CBC・パディングオラクルの基本攻撃|CTF思考フレームワーク #54
こんにちは、アンペンです!
今回は対称鍵暗号の王様、AESの入門編です。RSAが『公開鍵』なら、AESは『同じ鍵で暗号化も復号もする』対称鍵の代表選手。TLS本体や暗号化ストレージなど、現実世界の暗号化はほぼ全てAESが担っています。
AES自体は数学的に堅牢ですが、『モード(ECB/CBC等)』と『パディング』の使い方で大きく揺らぐのがCTFのポイント。
ここで2つのキーワードを、ざっくり押さえておきましょう。『モード』とは、長いデータを16文字ずつのブロックに切ったあと、“ブロック同士をどうつなぐか”のルール。『パディング』とは、最後のブロックがちょうど埋まらないときに、“余った隙間をどう埋めるか”のルールです。AES本体ではなく、この“つなぎ方”と“埋め方”の選択ミスが、攻撃の入り口になります。

AESって超強い暗号でしょ?それでも破れるの?

AES本体じゃなくて『使い方』を攻めるんだ。ECBはパターン丸見え、CBCはパディングオラクル──モード選択ミスで一発で抜ける。
『AESは世界最強クラスの暗号』——これは本当です。総当たりで鍵を破るのは、現実的な時間では不可能。なのに、なぜCTFで“AESの問題”が解けてしまうのか。答えは、AESの中身(アルゴリズム本体)ではなく、その“使い方”に穴があるからです。どんなに頑丈な金庫でも、扉を開けっぱなしにしたり、合鍵を雑に管理したら意味がない。今回は、その『使い方の穴』を順に見ていきましょう。
AESは128bitブロック単位の対称鍵暗号。安全性はモード選択に大きく依存します。ECBはパターン漏洩、CBC+PKCS#7+エラー差別はパディングオラクル攻撃が可能。CTFでも実装でも、答えは『AES-GCM等のAEAD一択』。CBC単体・ECB・自前パディングは使わないのが鉄則です。
この記事で分かること
- AESの基本(ブロック・鍵長・モード)
- ECBモードの致命的弱点(パターン漏洩)
- パディングオラクル攻撃の原理
- AEAD(GCM等)が解決する問題
📖 はじめてのWebセキュリティ #54|AES入門編
ECB・CBC・パディングオラクルの基本攻撃を扱います。 シリーズ一覧を見る →
⚠️ 大事なお約束
他者の通信や保護されたデータを無断で復号する行為は、業務上の権限や法律に違反します。CTFや公開された練習問題のみで確認してください。
AESは『暗号の中身』より『使い方』が肝
AES本体(ラウンド関数・S-Box)は数学的に堅牢で、現在の計算機では総当たり不能です。問題は『複数ブロックをどう繋ぐか』というモードと、『最後のブロックの空きをどう埋めるか』というパディング。ここに穴が空きます。
もう少し具体的にしましょう。『モード』は、ブロックをただ独立に暗号化するのか(ECB)、前のブロックと混ぜながら鎖のようにつなぐのか(CBC)、で安全性がまるで変わります。『パディング』は、たとえば最後に3文字足りなければ『3』を3個詰める、といったルール。一見どうでもよさそうなこの“隙間の埋め方”が、のちのパディングオラクル攻撃の急所になるんです。
図解:ECB / CBC / GCM の違い
同じAESでも、モードによって安全性が天と地ほど変わります。CTFで重要なのは『ECBはダメ、CBCもパディング次第でダメ、GCMが正解』という結論。
迷ったときの結論を、先に言ってしまいます——『GCMを使え』。これだけ覚えておけば、実務ではまず事故りません。ECBはパターンが透ける、CBCはパディング次第で抜かれる。それに対してGCMは、暗号化と“改ざん検知”をセットでやってくれます。なぜGCMが頭ひとつ抜けているのかは、このあとの『AEAD』の話でハッキリしますよ。

ECBモードでペンギンの画像を暗号化すると、暗号化後もペンギンの輪郭が見えます。これは『同じ平文ブロック→同じ暗号文ブロック』だから。各ブロックを独立に暗号化するため、画像の繰り返しパターン(背景・輪郭)が暗号文にそのまま現れるのです。これがECBの『パターン漏洩』として有名な視覚デモ。

ここで覚える用語:パディングオラクル攻撃
CBCモードで暗号文を不正に改造して送ったとき、サーバが『パディング不正エラー』と『他のエラー』を区別して返す挙動を悪用します。攻撃者は1バイトずつ書き換えて『パディングが通った』瞬間を観察し、1ブロックあたり最大256×16=4096回の試行で平文を完全復号できます。鍵を一切知らなくても、です。
主要モードの長所と短所
ECB / CBC / CTR / GCM の使い分け
- ECB:ブロックを独立暗号化。絶対使うな。パターン漏洩・改ざん容易
- CBC:前のブロックとXORで連鎖。IV必須・パディングオラクル要注意
- CTR:ストリーム化(カウンタを暗号化してXOR)。Nonce再利用で即死
- GCM:CTR + 認証タグ(GHASH)。現代の第一選択(AEAD)
- CCM / ChaCha20-Poly1305:GCMの代替AEAD。状況により採用
『AEAD(Authenticated Encryption with Associated Data)』は暗号化と完全性検証を同時に行う仕組み。CBCを使う限り後付けで何かしても、AEADの安心感には届きません。
『AEAD』という言葉、いかつい略語ですが、意味はシンプルです。『暗号化』と『封印(改ざんされていないかのチェック)』を、1つの操作でまとめてやってくれる仕組みのこと。CBC単体だと、暗号化はできても“中身がいじられたか”までは分からない。だから攻撃者に暗号文を改造される隙が生まれます。AEADは封蝋(ふうろう)付きの封筒のようなもので、開けようとした形跡があれば即バレる。だから後付けの工夫では届かない安心感があるんです。
パディングオラクル攻撃の流れ
CBC+PKCS#7+エラー差別(=サーバが『パディング不正』と『その他エラー』で異なる挙動を見せる)が揃うと、攻撃者は暗号文を改造して送りつつエラー応答を観察することで、鍵なしで全平文を復号できます。
この攻撃、最初は『鍵も知らないのに、なぜ中身が読めるの?』と不思議に感じます。カギは“サーバの反応”です。攻撃者が暗号文をちょっと書き換えて送ると、サーバはつい『パディングが変です』『それ以外のエラーです』と、違う反応を返してしまう。この反応の差が“ヒント”になり、1バイトずつ正解を絞り込めるんです。たとえるなら、相手の表情の変化だけを頼りに金庫の番号を当てるようなもの。だからこそ『エラーは常に同じ顔で返す』ことが、決定的に大事になります。
- 標的:CBC で暗号化されたCookie/Token等(Webアプリで頻出)
- 典型実装ミス:エラーメッセージで『Bad padding』を返す/HTTPステータスを変える/応答時間が変わる
- 定番ツール:
padbuster/python-paddingoracle - 1ブロック復号に数千リクエスト必要だが、自動化されていれば現実的

CTFでやってみよう:ECBペンギンとPadding Oracle
ECBの危険性とCBCパディングオラクルを体感
目的は『同じAESでもモードで結果が全然違う』を視覚と手で体感することです。
- BMP形式のペンギン画像をAES-128-ECBで暗号化、再表示してペンギンの輪郭が見えることを確認
- 同じ画像をCBCで暗号化、ノイズになることを確認(IVランダム前提)
- ローカルで『PKCS#7検証→エラー返す』Webアプリを立てる(故意の脆弱実装)
padbusterで暗号化Cookieを復号できることを試す- 同じアプリをAES-GCMに置き換え、Padding Oracleが効かなくなることを確認
守る側:『AES = GCM』と思考停止する
暗号設計に迷う時間があるなら、『AES-GCM(あるいはChaCha20-Poly1305)を使う』で大半の問題は解決します。
『思考停止でGCM』と聞くと乱暴に思えるかもしれませんが、これは実はプロの知恵です。暗号は“選択肢が多いほど事故る”世界。モードはどれ、パディングはどう、認証は付けるか…と悩むほど、どこかでミスが混じります。だから最初から『AEAD(GCMかChaCha20-Poly1305)一択』と決め打ちして、悩む余地そのものを消してしまう。選択肢を減らすことが、そのまま安全につながるわけです。
- 暗号モードはAES-GCM / ChaCha20-Poly1305(AEAD)を選ぶ
- ECBは絶対に使わない
- CBCを使う場合はHMACで完全性検証(Encrypt-then-MAC)
- IV/Nonceは毎回ランダム/カウンタで生成、絶対に使い回さない
- エラー応答は常に同じ(エラーメッセージ・ステータス・応答時間すべて統一)
- 標準ライブラリ(libsodium/Tink等)に任せる

『AESを使ってます!』は安心の言葉じゃないんだね。

そう。『何モードで、IVは?認証は?』まで聞いて初めて安心。次回はブロック暗号応用編で、Bit-flip攻撃やNonce再利用といったもう一段深い攻撃を扱うよ。
ここまでをひと言でまとめると、AESは『本体は無敵、でも使い方で台無し』。攻める側はモードやパディングの“使い方ミス”を探し、守る側はそのミスを作らないようGCMに寄せる。暗号アルゴリズムの名前だけ聞いて安心せず、『どう使っているか』まで見る——この習慣が、攻守どちらでも効いてきます。
まとめ:『AES本体は強い、モードが弱い』
- AES本体は堅牢、モードとパディングが弱点
- ECB=パターン漏洩、CBC=パディングオラクル
- 正解はAES-GCM等のAEAD
- IV/Nonceは絶対に使い回さない
今日の持ち帰りは『“AES使ってます”は、まだ何も言っていないのと同じ』。本当に大事なのは、その先の『何モードで、IVは毎回変えていて、改ざん検知は付いているか』です。金庫の銘柄より、扉の閉め方。この視点を持てるかどうかが、暗号を“なんとなく安全”から“ちゃんと安全”に変える分かれ目になります。
次回はブロック暗号応用編。Bit-flip攻撃・Padding Oracle詳細・Nonce再利用といった、もう一段深い攻撃を扱います。
