中間一致攻撃
攻撃者は平文 P {\displaystyle P} とそれに対応する暗号文 C {\displaystyle C} を知っているものとする。ここで、 E {\displaystyle E} を暗号化関数、 K 1 {\displaystyle K_{1}} と K 2 {\displaystyle K_{2}} をそれぞれ異なる鍵とすると、暗号化処理は以下のように記述できる。
C = E K 2 ( E K 1 ( P ) ) {\displaystyle C=E_{K_{2}}(E_{K_{1}}(P))}
まず、攻撃者は全ての鍵候補 K 1 {\displaystyle K_{1}} に対して E K 1 ( P ) {\displaystyle E_{K_{1}}(P)} を計算しておき、その結果をメモリ上に保存しておく。次に、攻撃者は全ての鍵候補 K 2 {\displaystyle K_{2}} を使って暗号文の復号を行い( D {\displaystyle D} を復号関数とすると、 D K 2 ( C ) {\displaystyle D_{K_{2}}(C)} を計算する)、その結果をメモリに保存しておく。
この2つの計算結果の中に合致するものがあれば、その計算に使用した2つの鍵 ( K 1 , K 2 ) {\displaystyle (K_{1},K_{2})} がおそらく正しい鍵であると言える。この処理を高速化する方法としては、まず E K 1 ( P ) {\displaystyle E_{K_{1}}(P)} の結果と暗号化に使用した鍵 K 1 {\displaystyle K_{1}} のペアをインメモリのルックアップテーブルに保存しておき、次に D K 2 ( C ) {\displaystyle D_{K_{2}}(C)} の結果を使用してルックアップテーブルから鍵候補を検索する方法が考えられる。計算結果から合致するものが見つかったら、別の暗号文と平文を使用すれば検証が行える。
鍵のサイズを n {\displaystyle n} ビットとしたとき、この攻撃方法では 2 n + 1 {\displaystyle 2^{n+1}} の試行回数で攻撃が行える(ただし、 O ( 2 n ) {\displaystyle O(2^{n})} の記憶領域を必要とする)。一方、単純な攻撃方法では 2 2 n {\displaystyle 2^{2n}} 回の試行を必要とする(記憶領域は O ( 1 ) {\displaystyle O(1)} で済む)。