✨ なぜ「動作モード」が必要なのか
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を正しく管理しないと安全性が下がる
- ⚠️ 暗号化時の並列処理ができない(※復号時は並列化可能)
- ⚠️ データの長さをブロック単位に合わせるパディングが必要であり、そのパディングオラクル攻撃(POODLE等)に脆弱なケースがある
🔸 CTRモード(Counter):ストリーム暗号的に使う
カウンター値を暗号化してキーストリームを生成し、平文とXORを取るモード。ブロック暗号をストリーム暗号のように使えます。
- ✅ 並列処理が可能(高速)
- ✅ パディング(データ長の調整)が不要
- ✅ 任意の位置からランダムアクセスで復号可能
- ⚠️ 同じIV+カウンターのペアを絶対に使い回してはいけない(キー・ストリームの再利用により、暗号解読が極めて容易になってしまうため)
🔸 GCMモード(Galois/Counter Mode):現在の推奨モード
CTRモードにGalois(ガロア)体の演算による認証タグ(MAC:Message Authentication Code)を加えた認証付き暗号(AEAD)モードです。
✅ GCMが選ばれる理由
- 暗号化と完全性確認(改ざん検知)を同時に行う
- 認証タグが一致しなければ復号自体を拒否する
- 並列処理対応で高速
- TLS 1.3・SSH・QUIC等の現代プロトコルで標準採用
- ハードウェアアクセラレーション(AES-NI)対応
🚨 【重要】DES(64ビットブロック)の限界:限界容量の罠
記事のタイトルにもある「DESの限界」について触れておきます。DESのような64ビットブロック長の暗号を使う場合、CBCやCTRモードで暗号化を続けると、約32GBのデータを処理した時点で「誕生日のパラドックス」によりブロック値が衝突する確率が急増し、暗号が破られます(SWEET32攻撃等)。
現在標準のAES(128ビットブロック)ではこの衝突は起こりませんが、古いDESを現代の各種モードで動作させること自体に既に限界が来ているという事実を忘れないでください。
📌 動作モード比較まとめ
| モード | 並列化 | 改ざん検知 | 推奨度 | 備考 |
|---|---|---|---|---|
| ECB | ✅ | ❌ | ❌ 使用禁止 | パターン漏洩 |
| CBC | 復号のみ | ❌ | ⚠ 非推奨 | パディング攻撃あり |
| CTR | ✅ | ❌ | ⚠ 単体は非推奨 | IV管理が重要 |
| GCM | ✅ | ✅ | ✅ 推奨 | AEAD、TLS 1.3標準 |

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