NET // communication networks
LESSON 36 / 発展編

共通鍵暗号 ─ AES と動作モードを覗く

基礎編 第8回 で「共通鍵で暗号化する」概念を、前回 第35回 暗号の歴史と OTP で「絶対安全な暗号(OTP) は鍵配送の壁で実用にならない、だから計算量的に強い暗号が必要」 という背景を学びました。本講はその一段奥に踏み込みます。なぜ AES が世界中で使われているのか、その内部の 4 つのラウンド操作 はどう設計されているのか、そして「ただ暗号化するだけ」の ECB がなぜ危険で、CBC・CTR・GCM へと進化したのか。最後に OpenSSL で AES を実際に動かして、ファイルを暗号化・復号するところまで。TLS・WireGuard・Wi-Fi WPA3 など、日常的なすべての暗号通信が依存している土台を可視化します。

学習目標

本講を終えると、以下を達成できるようになります。

本講は 基礎 暗号化、そして前回 第35回 暗号の歴史と OTP を前提とします。「共通鍵暗号 = 同じ鍵で暗号化と復号」「OTP = 絶対安全だが実用不可」という骨格は既知として、具体的アルゴリズムと、暗号文を どう繋げて使うか(動作モード) という運用知識まで踏み込みます。次回 第37回 公開鍵暗号 では「事前共有なしで秘密通信を始める」ための非対称暗号を扱います。続く 第25回 TLS と PKI でこれらが組み合わさる様子を見ます。

このレッスンの目次

01 位置づけ なぜ共通鍵がインターネットの暗号通信の主役なのか… 02 ブロック vs ストリーム 塊で処理するか流しで処理するか。AES はブロック暗号… 03 AES の中身 128 bit ブロック × 10/12/14 ラウンド。中身を観る… 04 動作モード ECB の罠、CBC の連鎖、CTR の並列性、GCM の認証… 05 AEAD 暗号化 + 改ざん検知を一度に。AES-GCM が現代標準… 06 OpenSSL ハンズオン openssl enc で AES-GCM を回す… 07 鍵長と量子耐性 Grover アルゴリズムは鍵長を半分にする… 08 まとめと用語 本講の重要語句を整理 09 確認問題 5 問で理解度をチェック

共通鍵暗号の位置づけ ─ なぜ世界中で使われるのか

共通鍵暗号(対称暗号)は 「同じ鍵で暗号化と復号を行う」 という単純な仕組みです。にもかかわらず、TLS・SSH・VPN・Wi-Fi・ディスク暗号化など、現代の暗号通信のほとんどで 実データの暗号化はすべて共通鍵 が担っています。これは 処理が圧倒的に速い からです。
POINT 共通鍵暗号の特徴:
・暗号化・復号が 非常に高速(公開鍵の 100〜1000 倍)
・鍵長が短くて済む(AES-128 でも安全)
事前に鍵を共有する必要がある ─ ここが最大の弱点 → 公開鍵暗号で解決(次回)
・現代の標準は AES(米 NIST FIPS 197、2001年)

共通鍵 vs 公開鍵 ─ 役割分担

TLS でブラウザが Web サーバと通信するとき、実は両方の暗号方式が 役割分担 しています。最初の鍵交換だけ公開鍵で、本文の暗号化は共通鍵 ─ これが現代の ハイブリッド暗号 の発想です。

性質共通鍵暗号(本講)公開鍵暗号(次回)
鍵の数1 つ(共有)2 つ(公開鍵 + 秘密鍵)
速度高速低速(数百倍重い)
事前共有必要不要
主用途本文の暗号化鍵交換・署名
代表アルゴリズムAES, ChaCha20RSA, ECDH, ECDSA
典型鍵長128〜256 bit2048〜4096 bit(RSA)/ 256 bit(EC)

つながる知識: WireGuard・QUIC・TLS 1.3 はすべて「鍵交換は公開鍵(ECDH)、本文は共通鍵(AES-GCM か ChaCha20-Poly1305)」というパターン。共通鍵の進化を理解せずにこれらのプロトコルは語れません。

確認: 現代のプロトコルが「本文の暗号化は共通鍵」を採用する最大の理由はどれか。

正解:B。AES-GCM は最新 CPU で数 GB/秒の処理が可能。一方 RSA-2048 は 1 MB のデータをブロック分割して暗号化するだけで数十秒かかる。だから「鍵交換は公開鍵で 1 回 → 本文は共通鍵で延々と」というハイブリッド構成が標準化された。D は誤り(共通鍵こそ鍵配送問題の元凶で、その解決のために公開鍵が登場した)。

ブロック暗号 vs ストリーム暗号

共通鍵暗号は内部の作りで大きく2つに分かれます。ブロック暗号 は固定長の塊(ブロック)を処理する方式、ストリーム暗号 は1ビット〜1バイト単位で連続処理する方式です。
POINTブロック暗号:固定長(AES なら 128 bit = 16 バイト)を 1 単位として暗号化。短いデータでも 16 バイトに揃える(パディング)
ストリーム暗号:鍵から無限長の擬似乱数列を生成し、平文と XOR するだけ。長さの調整が不要
・現代の標準:AES(ブロック)ChaCha20(ストリーム) の二強

2つの方式の動き

ブロック暗号 vs ストリーム暗号 ① ブロック暗号(AES) P1 (16B) P2 (16B) P3 (16B) PAD ↓ AES (鍵 K) C1 C2 C3 C4 塊で処理。短いデータはパディングで 16B 揃える ② ストリーム暗号(ChaCha20) 平文 P(任意長: 何バイトでもよい) 鍵 K + nonce → 擬似乱数列 KS: ⊕ XOR ⊕ XOR ⊕ XOR … 暗号文 C = P ⊕ KS(同じ長さ) パディング不要。XOR だけなので極めて高速

図の見方:ブロック暗号は「16B ずつ箱詰めして暗号化」。短い平文には padding を足す。ストリーム暗号は「鍵から作った擬似乱数を平文と XOR するだけ」で、長さは元の平文と同じ。実装が単純で速い。両者は使い分けではなく、AES が広く普及した時代の終わりに ChaCha20 が補完として登場した、という関係。

ChaCha20 が補完として広まった理由

AES は Intel/AMD の AES-NI 命令 によりハードウェアアクセラレーションで非常に速いですが、モバイル・組込み(古い ARM など)や AES-NI のない環境では遅い。ChaCha20 は 純粋にソフトウェアだけで高速 な設計で、Google Chrome は早期から AES-NI なし環境で ChaCha20-Poly1305 を優先するようになりました。今の TLS 1.3 はサーバ・クライアントの能力に応じて両者を使い分けます。

Q. AES-NI 命令を持たない古いスマートフォンや IoT 機器で TLS 1.3 通信をすると、AES-GCM と ChaCha20-Poly1305 のどちらが選ばれやすいか? その理由は?

AES の中身 ─ 4 つのラウンド操作

AES(Advanced Encryption Standard、FIPS 197、2001) は、前回 第35回 で見た NIST 公開コンペで選ばれた現代標準。128 bit ブロック10/12/14 ラウンド(鍵長 128/192/256 に対応)で暗号化します。本講では「中身がどう動くか」 ─ 1 ラウンドの 4 操作 ─ に踏み込みます。
POINT AES の構造:
1. 平文を 4×4 のバイト行列(state) として配置(16 B = 128 bit)
2. 各ラウンドで 4 つの操作 を順に適用:
    ① SubBytes ─ 各バイトを S-box で置換(非線形性)
    ② ShiftRows ─ 行ごとに左シフト(拡散)
    ③ MixColumns ─ 列ごとに行列乗算(拡散)
    ④ AddRoundKey ─ ラウンド鍵と XOR(鍵注入)
3. 最終ラウンドだけ MixColumns を省略

1 ラウンドの動き

AES の 1 ラウンド = 4 つのバイト操作 ① SubBytes 各バイトを S-box で置換 19 a0 9a e9 3d f4 c6 f8 e3 e2 8d 48 be 2b 2a 08 d4 e0 b8 1e 27 bf b4 41 11 98 5d 52 ② ShiftRows 行を左にシフト 行0: そのまま 行1: ←1 行2: ←2 行3: ←3 列がシャッフルされる → 拡散効果 ③ MixColumns 列ごとに 4×4 行列乗算 [2 3 1 1] [1 2 3 1] × 列 [1 1 2 3] [3 1 1 2] GF(2^8) 上の演算 → 列方向の拡散 ④ AddRoundKey ラウンド鍵と XOR state ⊕ K_round 鍵スケジュールで 元鍵から派生した 128 bit のサブ鍵 → 鍵への依存

図の見方:1 ラウンドは 非線形(SubBytes)→ 拡散(ShiftRows + MixColumns)→ 鍵注入(AddRoundKey) の流れ。これを 10〜14 回繰り返すことで、平文の 1 ビット変化が暗号文の 約半分のビット をランダムに変える ─ シャノンの「拡散と混合」の原理が体現されています。

もっと詳しく:S-box と GF(2^8)

S-box は 8 bit → 8 bit の固定置換テーブル(256 エントリ)。中身は GF(2^8)(2^8 個の元を持つ有限体)上での 逆元計算 + アフィン変換 という数学的な構造で、線形攻撃・差分攻撃に耐えるように設計されています。MixColumns も GF(2^8) の演算で、これらが「ただランダムな置換」ではなく 数学的に裏付けられた構造 を持つことが、AES の長期的な安全性の根拠になっています。

鍵長と安全性

鍵長ラウンド数用途
AES-12810大半の用途で十分(TLS の標準)
AES-19212中間。あまり使われない
AES-25614政府機密・量子計算耐性を考慮する場合

AES-128 が破られた事例は 2024 年現在 実用的にはない(2^128 通りの全数探索は宇宙の年齢を超える時間がかかる)。AES-256 は「念のため強い方を」という選択肢で、性能差はほとんど無視できる。

確認: AES のラウンド操作のうち、非線形性(代数的に解けない性質) を担っているのはどれか。

正解:D。SubBytes は GF(2^8) 上の逆元計算をベースにした非線形変換で、これがあるから AES は単純な行列計算では解けない。他の 3 操作はすべて線形(行列・XOR)で、SubBytes がなければ全体が線形変換になり、ガウス消去で鍵が復元できてしまう。差分解析・線形解析への耐性も SubBytes の S-Box 設計に依存。

動作モード ─ ECB の罠から GCM へ

AES は 16 バイトの塊を 1 回 暗号化するだけのアルゴリズム。実際のファイル(数 MB〜GB)を暗号化するには「ブロックを連ねてどう繋ぐか」を決める必要があります。これが 動作モード(mode of operation)。選び方を間違えると暗号化していても情報が漏れる ─ 古典的な ECB の悲しい例から見ましょう。
POINT 主な動作モード:
ECB(Electronic Codebook) ─ ブロックごとに独立。使ってはいけない(理由は下図)
CBC(Cipher Block Chaining) ─ 前のブロックの暗号文を XOR してから暗号化。順次処理が必要
CTR(Counter) ─ カウンタを暗号化して鍵ストリームを作り、平文と XOR。並列処理可
GCM(Galois/Counter Mode) ─ CTR + Galois 認証タグ。暗号化 + 改ざん検知 を一度に → 現代の標準

ECB の罠 ─ なぜ使ってはいけないか

ECB は最も単純なモード:平文を 16 B ずつに分け、それぞれを独立に AES で暗号化するだけ。問題は 「同じ平文ブロックは常に同じ暗号文ブロックになる」こと。画像を ECB で暗号化すると、元画像のパターンが暗号文にそのまま透けて見える ─ これが有名な「ECB ペンギン」現象。

① ECB(独立処理 = 危険) P1 P2 P1(同じ) P3 ↓ AES (K) C1 C2 C1(同じ!) C3 同じ平文 → 同じ暗号文 ② CBC(連鎖処理 = OK) P1 P2 P1(同じ) P3 ↓ ⊕前ブロック → AES (K) C1 C2 C3'(違う!) C4 同じ平文でも異なる暗号文

図の見方:ECB は同じ入力 → 同じ出力なので、平文のパターンがそのまま見える。CBC は 「前のブロックの暗号文と XOR してから暗号化」 するので、同じ平文ブロックでも前後関係で結果が変わり、パターンが崩れる。最初のブロックだけは前がないので IV(initialization vector) を使う。

CTR モード ─ 並列処理を可能にする

CBC は前のブロックを待つので 逐次的。大ファイルの暗号化や復号は並列化できません。CTR モードはこれを解決:カウンタ(0, 1, 2, 3, ...)を AES で暗号化して鍵ストリームを生成し、それを平文と XOR。各ブロックは独立に計算できるので並列化可能。

CTR モードの動作:
   nonce | counter:0  →  AES(K)  →  KS_0  →  C_0 = P_0 ⊕ KS_0
   nonce | counter:1  →  AES(K)  →  KS_1  →  C_1 = P_1 ⊕ KS_1
   nonce | counter:2  →  AES(K)  →  KS_2  →  C_2 = P_2 ⊕ KS_2
   ...

並列処理: 全 KS_i を独立に計算可能
復号も同じ操作: P_i = C_i ⊕ KS_i

CTR の 大原則:同じ鍵で同じ nonce を 絶対に再利用してはいけない。再利用すると、2 つの暗号文を XOR するだけで両方の平文が漏れる ─ これは前回 第35回 で見た OTP の two-time pad 攻撃 とまったく同じ原理(C1⊕C2 = P1⊕P2 で鍵が消える)。CTR / GCM が事実上「鍵 + nonce で生成した擬似乱数列で OTP する」構造である以上、OTP の鍵再利用が致命的なのと同じ理由で、nonce の再利用も致命的になります。

4 モードの比較

モード並列化パターン漏洩認証現代の評価
ECBあり(致命的)なし使用禁止
CBC暗号化:×
復号:○
なしなしレガシー TLS、徐々に廃止
CTRなしなし(別途必要)GCM の中で使用
GCMなしあり(GHASH)現代の標準(TLS 1.3)

Q. ECB モードで「同じ平文ブロック → 同じ暗号文ブロック」になる、という性質がなぜ実用上致命的なのか? Linux のペンギン画像(Tux)を ECB で暗号化したらどう見えるか想像せよ。

AEAD ─ 暗号化と改ざん検知をワンパッケージで

暗号化(機密性)だけでは不十分です。攻撃者は 暗号文のビットを書き換える ことで、復号後の平文を意図的に変えられる場合があります(復号時に「失敗」と気づかない)。これを防ぐには 認証タグ(MAC) を別途付ける必要がありました。AEAD(Authenticated Encryption with Associated Data) は、暗号化と認証を 一体型 で行う現代的な仕組みです。
POINT AEAD の入出力:
暗号化:plaintext + key + nonce + AD → ciphertext + tag
復号:ciphertext + tag + key + nonce + AD → plaintext または認証エラー

主な AEAD 方式:
AES-GCM:CTR モード + Galois ハッシュ認証 ─ ハードウェア(AES-NI) で速い
ChaCha20-Poly1305:ChaCha20 + Poly1305 MAC ─ ソフト実装で速い・モバイル/古い CPU に強い
AES-CCM:Wi-Fi WPA2/WPA3 で使用

AD(Associated Data)とは

AEAD の "AD" は 「暗号化はしないが認証はしたい」追加データ。例えば TLS の場合、ヘッダ部(レコードタイプ・バージョン・長さ)は平文のまま 流す必要があるが、改ざんされたら困る。これを AD として渡すことで、暗号文と一緒に認証タグの計算に含められる。

AEAD 暗号化のイメージ:
   plaintext = "Hello"
   AD        = "from=alice&to=bob"   ← 暗号化しない、でも改ざんされたら検出
   key       = (32 byte の AES-256 鍵)
   nonce     = (96 bit のユニーク値、毎回変える)

   ↓ AES-GCM
   ciphertext = (5 バイトの暗号文)
   tag        = (16 バイトの認証タグ)

復号側:
   AES-GCM_decrypt(ciphertext, tag, key, nonce, AD)
   → plaintext または認証エラー
      ・暗号文 ciphertext が 1 ビットでも書き換わっていたらエラー
      ・AD が変わっていたらエラー
      ・nonce が間違っていたらエラー

つながる知識: TLS 1.3 では 暗号アルゴリズムは AEAD のみ に制限されました。それ以前(TLS 1.2 以下)は CBC + HMAC の「Encrypt-then-MAC」方式も使えましたが、パディングオラクル攻撃 など歴史的に多くの脆弱性を生んでいました。AEAD はこれらを構造的に排除する設計です。

確認: AEAD(AES-GCM など)が単純な「暗号化 → MAC を別計算」方式に対して持つ 本質的な利点 はどれか。

正解:C。CBC + HMAC を別々に組むと「Encrypt-then-MAC か MAC-then-Encrypt か」「順序を間違えるとどう脆弱になるか」を実装者が判断する必要があり、ここから パディングオラクル攻撃(Lucky13 等)が多発した。AEAD は API レベルで encrypt(key, nonce, plaintext, aad) → (ciphertext, tag) と一体化しているため、誤実装の余地が消える。これが「正しい設計は誤って使えないようにする」という暗号工学の典型例。

OpenSSL ハンズオン ─ 実際に AES-GCM を回す

openssl コマンドで実際に AES 暗号化を試してみましょう。OpenSSL 3.x が前提です(openssl version で確認)。

1. テキストファイルを AES-256-GCM で暗号化

# テストファイル作成
echo "secret message from alice" > plain.txt

# 鍵と IV(nonce)をランダム生成
KEY=$(openssl rand -hex 32)   # 256 bit 鍵 (64 hex chars)
IV=$(openssl rand -hex 12)    # 96 bit nonce (24 hex chars)
echo "KEY=$KEY"
echo "IV=$IV"

# 暗号化(AES-256-GCM)
openssl enc -aes-256-gcm \
    -K "$KEY" -iv "$IV" \
    -in plain.txt -out cipher.bin

# 暗号文を hex で確認
xxd cipher.bin

2. 復号して元に戻す

# 復号
openssl enc -aes-256-gcm -d \
    -K "$KEY" -iv "$IV" \
    -in cipher.bin -out decrypted.txt

cat decrypted.txt
# → secret message from alice
注意: 上記は学習用です。openssl enc は GCM 認証タグの自動付与に対応していない場合があるため、本番では Python の cryptography ライブラリや言語ネイティブの AEAD API を使うのが標準です。

3. パスワードベース暗号化(より実用的)

# パスワードから鍵を派生(PBKDF2)
openssl enc -aes-256-cbc -salt -pbkdf2 \
    -in plain.txt -out cipher.enc
# パスワード入力プロンプトが出る

# 復号
openssl enc -aes-256-cbc -d -pbkdf2 \
    -in cipher.enc -out decrypted.txt

パスワードから直接 AES 鍵を作るのは 弱い(辞書攻撃に弱い)ため、-pbkdf2 オプションで PBKDF2 という鍵導出関数を通します。これにより総当たり攻撃のコストが意図的に高くなります。

4. Python での AEAD 例

# pip install cryptography
from cryptography.hazmat.primitives.ciphers.aead import AESGCM
import os

key = AESGCM.generate_key(bit_length=256)
nonce = os.urandom(12)
aesgcm = AESGCM(key)

plaintext = b"secret message"
aad = b"to=bob&from=alice"

# 暗号化
ciphertext = aesgcm.encrypt(nonce, plaintext, aad)

# 復号(AAD が違うと InvalidTag 例外が飛ぶ)
recovered = aesgcm.decrypt(nonce, ciphertext, aad)
print(recovered)  # → b"secret message"

鍵長と量子計算への耐性

将来的に 大規模な量子コンピュータ が実用化されると、現在の暗号は弱体化します。共通鍵暗号の場合、Grover アルゴリズム によって全数探索が √N の時間 でできるようになります(古典では N)。これは「実効的な鍵長が半分になる」と等価です。
POINT 量子計算下での暗号強度:
・AES-128 → Grover で実効 64 bit → 2030 年代以降は不十分かも
・AES-256 → Grover で実効 128 bit → 引き続き安全
・対策:長期データを暗号化するなら AES-256 を選ぶ
・公開鍵暗号(次回扱う RSA・ECDH) は Shor アルゴリズムで 完全に破綻 ─ こちらの方が深刻

共通鍵 vs 公開鍵 ─ 量子の脅威の差

暗号種別古典での安全性量子計算下対策
AES-128安全実効 64 bit に低下AES-256 に切り替え
AES-256安全実効 128 bit ─ 安全そのまま使える
RSA-2048安全Shor で 1 日で破られるPQC(Kyber 等)へ移行(第37回)
ECDH-P256安全Shor で完全破綻PQC へ移行

つながる知識: 量子計算機が「いつ来るか」は不明ですが、攻撃者が 今のうちに暗号文を保存しておき、将来の量子計算機で復号する(Harvest Now, Decrypt Later)というシナリオが現実視されています。長期機密(国防・医療記録)では今すぐ AES-256 + PQC への移行が始まっています。詳細は次回の公開鍵暗号で。

確認: Grover アルゴリズムが量子計算機で動いた場合、AES-128 と AES-256 の安全性はどう変わるか。

正解:B。Grover アルゴリズムは無構造探索を √N 倍に高速化する。鍵総数 2^k の全数探索が 2^(k/2) 回の量子操作で済むため、AES-128 は事実上 64 bit 強度(現代の古典計算機でも厳しい)、AES-256 は 128 bit 強度(依然として実用安全)になる。だから 共通鍵は鍵長を倍にすれば量子耐性が確保できる。一方 RSA・ECDSA は Shor アルゴリズムで多項式時間に潰されるので「鍵を伸ばせば済む」世界ではない ─ これが PQC が公開鍵だけ必要な理由。

まとめと用語チェック

SUMMARY 1. 共通鍵暗号は 同じ鍵で暗号化・復号。高速だが事前共有が必要
2. 現代の標準は AES(ブロック暗号、128 bit ブロック、10/12/14 ラウンド)と ChaCha20(ストリーム暗号)
3. AES の 1 ラウンド = SubBytes → ShiftRows → MixColumns → AddRoundKey
4. 動作モード がデータ全体の安全性を決める。ECB は禁止、現代は GCM(AEAD)
5. AEAD は暗号化 + 改ざん検知を一体化。TLS 1.3 はこれのみ
6. nonce 再利用は致命的(two-time pad)
7. 量子計算では Grover で鍵長半減 → AES-256 を選べば安全

用語チェック

用語1行説明
共通鍵暗号 / 対称暗号同じ鍵で暗号化・復号。高速だが事前共有が必要
AESFIPS 197 (2001)。128 bit ブロック、10/12/14 ラウンド
ChaCha20ストリーム暗号。ソフト実装が速くモバイル向き
S-boxAES の SubBytes で使う 8→8 bit 非線形置換テーブル
動作モード(mode of operation)ブロック暗号で長いデータを処理する繋ぎ方
ECB独立処理。同じ平文 → 同じ暗号文(使用禁止)
CBC前ブロックの暗号文と XOR してから暗号化(直列)
CTRカウンタを暗号化して鍵ストリーム生成。並列可
GCMCTR + Galois 認証タグ。AEAD の代表例
AEAD暗号化と認証を一体化。AES-GCM・ChaCha20-Poly1305
nonce / IV毎回変える初期値。再利用は致命的
AD(Associated Data)暗号化はしないが認証に含める追加データ
PBKDF2パスワードから鍵を導出する関数(辞書攻撃を遅くする)
Grover アルゴリズム量子計算で全数探索を √N に高速化(対策:鍵長 2 倍)
NEXT: 次回 第37回 公開鍵暗号 では、共通鍵の最大の弱点「事前共有が必要」を解決する 非対称暗号 を扱います。RSA・Diffie-Hellman・楕円曲線、そして量子計算がもたらす脅威と PQC(Kyber/Dilithium)まで踏み込みます。

確認問題

問1. AES の 1 ラウンドの 4 操作の 順序 として正しいものはどれか。

次の選択肢から最も適切なものを選択してください。
A. AddRoundKey → SubBytes → MixColumns → ShiftRows
B. ShiftRows → MixColumns → SubBytes → AddRoundKey
C. SubBytes → ShiftRows → MixColumns → AddRoundKey
D. MixColumns → AddRoundKey → SubBytes → ShiftRows
正解:C
AES の 1 ラウンドは SubBytes(非線形置換)→ ShiftRows(行シフト)→ MixColumns(列拡散)→ AddRoundKey(鍵注入) の順。最終ラウンドだけ MixColumns を省略する。

問2. ECB モードを画像に適用すると、暗号化後も 元画像のパターンが見える 現象が起こる。これはなぜか。

次の選択肢から最も適切なものを選択してください。
A. AES の鍵長が短すぎるから
B. SubBytes が線形なので拡散しないから
C. パディングが画像構造を保つから
D. ECB は同じ平文ブロックに対して常に同じ暗号文ブロックを出力するから
正解:D
ECB はブロックごとに独立処理。同じ 16 バイトの入力 → 常に同じ 16 バイトの出力。画像の同じ色領域が同じ暗号文ブロックに変換され、輪郭がそのまま透けて見える。これが ECB を使ってはいけない最大の理由。

問3. AEAD(Authenticated Encryption with Associated Data) の特徴として、最も適切なものはどれか。

次の選択肢から最も適切なものを選択してください。
A. 公開鍵暗号と組み合わせて使う必要がある
B. 暗号化と改ざん検知(認証)を一体型で提供する
C. 鍵を不要にする
D. 量子計算耐性がある
正解:B
AEAD は 暗号化と認証(改ざん検知)を一度に行う 暗号方式。AES-GCM と ChaCha20-Poly1305 が現代の代表。TLS 1.3 では AEAD アルゴリズムのみが許可されている。鍵は当然必要(A・C は誤り)、量子計算耐性は別の話(D は誤り)。

問4. CTR / GCM モードで「同じ鍵 + 同じ nonce」を再利用してはいけない理由として、最も適切なものはどれか。

次の選択肢から最も適切なものを選択してください。
A. 同じ鍵ストリームが生成され、暗号文同士の XOR で平文が漏洩する(two-time pad 攻撃)
B. AES のブロック構造が壊れる
C. CPU 負荷が高くなる
D. nonce サイズが足りなくなる
正解:A
CTR モードの暗号文は 平文 XOR 鍵ストリーム。同じ鍵+nonce を 2 回使うと、2 つの暗号文を XOR するだけで P1 ⊕ P2 が露出。片方の平文が既知なら、もう片方も完全に復元できる(古典的 two-time pad 攻撃)。これがあるため nonce は 絶対に再利用しない ことが鉄則。

問5. 量子計算機の登場が共通鍵暗号(AES) に与える影響について、最も適切なものはどれか。

次の選択肢から最も適切なものを選択してください。
A. AES は完全に破られる
B. 影響はまったくない
C. Grover アルゴリズムにより実効鍵長が半分になる(AES-128 → 実効 64 bit、AES-256 → 実効 128 bit)
D. 暗号化速度が 100 倍速くなる
正解:C
共通鍵暗号への量子の影響は Grover アルゴリズム による全数探索の高速化。古典での 2^N 通り探索が量子では 2^(N/2) で済む = 実効鍵長が半分。AES-128 は実効 64 bit となり長期使用は危ういが、AES-256 は実効 128 bit で十分安全。完全破綻するのは公開鍵(RSA・ECDH)の方で、Shor アルゴリズムが原因(A は誤り、B も誤り)。
← PREV
第35回 暗号の歴史と OTP
NEXT →
第37回 公開鍵暗号(RSA・ECC)