初期化ベクトル(IV)とは
初期化ベクトル(Initialization Vector, IV)は、ブロック暗号の暗号モードで使用されるランダムまたは疑似ランダムな値です。同じ鍵と平文の組み合わせでも、異なるIVを使用することで異なる暗号文が生成されます。
IV vs Nonce
- IV:CBCモードなどで使用。ランダム性が重要
- Nonce:CTR/GCMモードで使用。一意性が重要(Number used ONCE)
暗号モード別の要件
| モード | サイズ | 要件 |
|---|---|---|
| AES-CBC | 128ビット | ランダム、予測不可能 |
| AES-GCM | 96ビット推奨 | 一意(再利用禁止) |
| ChaCha20 | 96ビット | 一意(再利用禁止) |
実装例
import os
from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes
key = os.urandom(32) # AES-256
# CBC:ランダムIV
iv = os.urandom(16) # 128ビット
cipher = Cipher(algorithms.AES(key), modes.CBC(iv))
# GCM:ナンス(一意であればOK)
nonce = os.urandom(12) # 96ビット推奨
cipher = Cipher(algorithms.AES(key), modes.GCM(nonce))
トラブル事例
⚠️ IV/Nonceの再利用
問題:GCMでナンスを再利用すると、認証鍵が漏洩
対策:毎回新しいナンスを生成。カウンターやUUIDを使用可能。
