✨ なぜ「動作モード」が必要なのか
DES・AESは固定サイズのブロック(DES=64ビット、AES=128ビット)を暗号化するアルゴリズムです。実際のデータはそれより長いため、「データをどのようにブロックに分けて処理するか」を定める動作モード(Mode of Operation)が必要です。
🔸 ECBモード(Electronic Codebook):最も危険なモード
各ブロックを独立して同じ鍵で暗号化します。シンプルですが致命的な欠点があります。
❌ ECBペンギン問題
平文の同じブロックは常に同じ暗号文ブロックになる。Linuxのペンギン画像(Tux)をECBで暗号化すると、同じ色の領域が同じ暗号文になるためペンギンの輪郭がそのまま見えてしまう。現実の暗号化データも同様にパターンが漏れる。
→ ECBは機密データの暗号化に使ってはいけない
🔸 CBCモード(Cipher Block Chaining)
各ブロックを暗号化する前に、前のブロックの暗号文とXORを取る方式。最初のブロックにはランダムな値(IV: 初期化ベクトル)を使います。
- ✅ 同じ平文でも異なる暗号文が生成される
- ✅ ECBのパターン漏洩問題を解決
- ⚠️ IVを正しく管理しないと安全性が下がる
- ⚠️ 並列処理(暗号化)ができない——順次処理が必要
- ⚠️ PKCS#7パディングオラクル攻撃(POODLE等)に脆弱なケースがある
🔸 CTRモード(Counter):ストリーム暗号的に使う
カウンター値を暗号化してキーストリームを生成し、平文とXORを取るモード。ブロック暗号をストリーム暗号のように使えます。
- ✅ 並列処理が可能(高速)
- ✅ 任意の位置からランダムアクセスで復号可能
- ⚠️ 同じIV+カウンターを2回絶対に使ってはいけない(Two-Time Pad問題:平文が丸見えになる)
🔸 GCMモード(Galois/Counter Mode):現在の推奨モード
CTRモードにGalois(ガロア)体の演算による認証タグ(MAC)を加えた認証付き暗号(AEAD)モードです。
✅ GCMが選ばれる理由
- 暗号化と完全性確認(改ざん検知)を同時に行う
- 認証タグが一致しなければ復号自体を拒否する
- 並列処理対応で高速
- TLS 1.3・SSH・QUIC等の現代プロトコルで標準採用
- ハードウェアアクセラレーション(AES-NI)対応
📌 動作モード比較まとめ
| モード | 並列化 | 改ざん検知 | 推奨度 | 備考 |
|---|---|---|---|---|
| ECB | ✅ | ❌ | ❌ 使用禁止 | パターン漏洩 |
| CBC | 復号のみ | ❌ | ⚠ 非推奨 | パディング攻撃あり |
| CTR | ✅ | ❌ | ⚠ 単体は非推奨 | IV管理が重要 |
| GCM | ✅ | ✅ | ✅ 推奨 | AEAD、TLS 1.3標準 |

もふねこ
AES-GCMが現代の標準ね。「暗号化+改ざん検知」が一度にできるから、実装ミスも減らせるよ🐾 独自に実装せず、ライブラリのデフォルトを使うのが一番安全ね!