CBC-MAC
ブロック暗号をCBCモードで利用してデータを暗号化する際、初めに初期化ベクトルを導入することは一般的である。初期化ベクトルはランダムに選択され、再使用されるべきではない。これにより、同じ平文を暗号化した場合でも暗号化の結果は異なるものとなり、攻撃者が「同じ暗号結果であるから元の平文は同じである」と推測することはできなくなる。
一方、CBC-MACのようなメッセージ認証符号を計算する際には、初期化ベクトルを使用してはならない。
CBCモードにおいては、平文の最初のブロックは初期化ベクトルとの排他的論理和 ( P 1 ⊕ I V {\displaystyle P_{1}\oplus IV} ) をとられ、これが暗号化される。
しかしながら、暗号化及び復号の際には、初期化ベクトルを平文で送る必要がある(暗号文の最初のブロックの前に平文ブロックとして送られることが多い)。CBC-MACにおいて初期化ベクトルを用いるとしたら、同様に初期化ベクトルを平文で送る必要がある。
初期化ベクトルの値を自由に選択可能な場合、CBC-MACタグを変えることなく平文の最初のブロックが改変される可能性がある。
メッセージ M 1 = P 1 | P 2 | ... {\displaystyle M_{1}=P_{1}|P_{2}|\dots } について考える。初期化ベクトル I V 1 {\displaystyle IV_{1}} を用いてCBC-MACを計算すると仮定すると、MACタグの計算は E K ( I V 1 ⊕ P 1 ) {\displaystyle E_{K}(IV_{1}\oplus P_{1})} から開始されることとなる。
(メッセージ, タグ) のペア ( M 1 , T 1 ) {\displaystyle (M_{1},T_{1})} が得られる。
ここでメッセージ M 2 = P 1 ′ | P 2 | ... {\displaystyle M_{2}=P_{1}'|P_{2}|\dots } を作成する。 P 1 ′ {\displaystyle P_{1}'} の各々のビットは、初期化ベクトル I V 1 ′ {\displaystyle IV_{1}'} を生成するように初期化ベクトルと対応するビットを反転したものである。これのMAC値の計算は E K ( P 1 ′ ⊕ I V 1 ′ ) {\displaystyle E_{K}(P_{1}'\oplus IV_{1}')} から開始されることとなる。平文と初期化ベクトルの対応するビットが反転していることから、この改変はキャンセルされ、 M 1 {\displaystyle M_{1}} の場合と同じビット列が暗号化プロセスに回されることとなる。それ以外に平文に変更を加えないのであれば、異なるメッセージにもかかわらず同じタグが得られることとなる。
初期化ベクトルを自由に選択できないようにし、すべての実装で同じ初期化ベクトルを用いるようにすれば、この攻撃は回避できる。実際の実装では、初期化ベクトルは0とされている。