午前I問題

暗号学的ハッシュ関数の性質に関する記述として、誤っているものはどれか。

ア)任意長のメッセージから固定長のハッシュ値を生成し、元のメッセージをハッシュ値から逆算することが計算上困難である(原像計算困難性)。

イ)同一のハッシュ値を持つ2つの異なるメッセージを発見することが計算上困難である(衝突困難性)。

ウ)ハッシュ値が同一であれば、元のメッセージも必ず同一である。

エ)メッセージが1ビットでも変化すると、生成されるハッシュ値は大きく変化する(雪崩効果)。

午前I の解答・解説を見る

正解:

解説: ハッシュ関数の出力長は固定(例: SHA-256は256ビット)ですが、入力は無限に存在します。鳩の巣原理により、異なるメッセージが同一ハッシュ値を持つ衝突は必ず存在します。「衝突困難性」とは衝突を発見することが計算上困難であるという性質であり、「衝突が存在しない」という意味ではありません。ア)は原像計算困難性、イ)は衝突困難性、エ)は雪崩効果の正しい説明です。

性質意味
原像計算困難性h → m が困難
第二原像計算困難性m1 から H(m1)=H(m2)m2 発見が困難
衝突困難性任意の m1≠m2H(m1)=H(m2) の発見が困難

午前II問題

ブロック暗号の利用モードに関する記述として、適切なものはどれか。

ア)ECB(Electronic Codebook)モードでは、同一の平文ブロックから異なる暗号文ブロックが生成されるため、パターン漏洩のリスクがなく安全に使用できる。

イ)CBC(Cipher Block Chaining)モードでは、各ブロックの暗号化に前のブロックの暗号文をXORするため、暗号化は逐次処理となるが、復号は並列処理が可能である。

ウ)CTR(Counter)モードでは、カウンタ値を暗号化した値と平文をXORするため、ブロック暗号をストリーム暗号として使用でき、復号時に同じ鍵と同一のカウンタ初期値を再利用しても安全である。

エ)GCM(Galois/Counter Mode)モードは、暗号化と認証タグ生成を独立して行うため、機密性は確保できるが完全性(改ざん検知)は保証されない。

午前II の解答・解説を見る

正解:

解説: CBCモードは前ブロックの暗号文をXORしてから暗号化するため、暗号化は逐次(順番に)処理する必要があります。一方、復号は各ブロックが独立して前ブロックの暗号文を参照できるため、並列処理が可能です。ア)ECBは同一平文から常に同一暗号文が生成されパターン漏洩が発生します。ウ)CTRで同一の鍵+カウンタ初期値を再利用すると同じ鍵ストリームが生成され平文が漏洩します(Two-Time Pad攻撃)。エ)GCMはAEAD(Authenticated Encryption with Associated Data)であり、機密性と完全性の両方を提供します。

モード並列暗号化並列復号認証主な用途
ECB非推奨
CBCTLS 1.2以前
CTRストリーム用途
GCMTLS 1.3・推奨

午後問題

B社はECサイトを運営しており、会員の個人情報と決済情報をデータベースに保存している。開発部門のC氏がソースコードを調査したところ、以下の実装が発見された。

# 会員パスワードの保存処理
def save_password(user_id, password):
    hashed = md5(password)          # (A)
    db.save(user_id, hashed)

# クレジットカード番号の暗号化処理
def encrypt_card(card_number):
    key = "SuperSecretKey!!"        # (B) 固定鍵(16バイト)
    iv  = b'\x00' * 16             # (C) IV を全ゼロ固定
    cipher = AES_CBC(key, iv)
    return cipher.encrypt(card_number)

# 外部APIとの通信
def call_external_api(data):
    response = requests.get(API_URL, data=data, verify=False)  # (D)
    return response

セキュリティ部門のD氏はこのコードに複数の問題があると指摘し、改修を求めた。

設問1

コード中の (A)(C) それぞれの問題点を、セキュリティ上のリスクとあわせて各40字以内で答えよ。

設問1の解答・解説を見る

正解例(A): MD5は衝突耐性が破られており、レインボーテーブル攻撃でパスワードが解読されるリスクがある。

正解例(C): IVが固定のため同一平文から常に同一暗号文が生成され、平文パターンが推測されやすくなるリスクがある。

解説: パスワード保存にはハッシュ化だけでなく「ソルト+ストレッチング」が必須です。MD5は高速すぎるため総当たり攻撃にも弱く、bcrypt・argon2・scryptへの置き換えが必要です。IVは暗号論的乱数で毎回生成することでCBCの初期XOR値を一意にし、パターン漏洩を防ぎます。

採点基準(各4点):

  • (A)「MD5は脆弱」+「レインボーテーブル/総当たり」への言及
  • (C)「IVが固定」の問題+「パターン漏洩/解読リスク」への言及

設問2

(B) の固定鍵と (D)verify=False について、それぞれ適切な対策を具体的に答えよ。

設問2の解答・解説を見る

正解例(B): ハードコードされた鍵を廃止し、AWS KMS・HashiCorp Vaultなどの鍵管理システム(KMS)や環境変数から実行時に取得する。また鍵を定期的にローテーションする運用を設ける。

正解例(D): TLS証明書の検証を有効にする(verify=True)。自己署名証明書が必要な場合はCA証明書バンドルのパスを verify="/path/to/ca-bundle.crt" で明示的に指定し、MITM攻撃を防ぐ。

解説: verify=False はTLS証明書の検証を無効にするため、中間者攻撃(MITM)により通信内容の盗聴・改ざんが可能になります。開発環境の利便性のために設定されたまま本番環境に流出するケースが多く、SC試験でも頻出の実装ミスです。

採点基準(各3点):

  • (B)「KMS/環境変数での鍵管理」+「ローテーション」への言及
  • (D)「verify=True に変更」+「MITM攻撃防止」への言及

重要キーワード

用語説明
衝突困難性同一ハッシュ値を持つ異なる2つのメッセージを発見することが計算上困難な性質
レインボーテーブル攻撃事前計算したハッシュ値の対応表を用いてパスワードを解読する攻撃
AEAD暗号化と認証を同時に提供する方式(例: AES-GCM)。機密性・完全性・真正性を保証
Two-Time Pad攻撃ストリーム暗号で同一鍵ストリームを2回使用した際に平文が漏洩する攻撃
ソルトパスワードハッシュ化時に付加するランダム値。レインボーテーブル攻撃を無効化する
KMS鍵管理システム。暗号鍵の生成・保管・ローテーションを安全に管理するサービス

まとめ

  • 午前I視点: ハッシュ関数の3つの困難性(原像・第二原像・衝突)と雪崩効果を正確に区別する。衝突は「存在しない」のではなく「発見が困難」
  • 午前II視点: ECB/CBC/CTR/GCMの並列処理可否と認証機能の有無を表で整理する。TLS 1.3ではGCMが標準
  • 午後視点: MD5・固定IV・ハードコード鍵・verify=Falseはコードレビューで頻出の実装脆弱性。問題点とセットで対策を答えられるようにする