暗号化: $C = \mathrm{E_k}(M)$
復号 : $M = \mathrm{D_k}(C)$
暗号化: $C = M \oplus K$
復号 : $M = C \oplus K$
AES,DES などのブロック暗号を用いる暗号化では,ブロック長より長いメッセージを暗号化する際に入力文 (平文) は固定長のブロックに分割して処理される. このとき,各入力ブロックを順次暗号化する際に用いるアルゴリズムを暗号利用モードと呼ぶ.同じブロック暗号を用いても,暗号利用モードが異なればその処理性能や情報の秘匿性には違いが生じる。
暗号利用モードには,情報の秘匿性を向上させることを目的とする秘匿用の利用モードと情報の完全性確認を目的とする認証用の利用モードがある.
以下の説明で,$\mathrm{E_k}$ を暗号化関数,$\mathrm{D_k}$ を復号関数,平文を $M = {M_1, \cdots, M_n}$,暗号文を $C = {C_1, \cdots, C_n}$ ,初期ベクトルを $IV(=C_0)$ とする($n$ は平文のブロック数).
また,以下の関数を定義する.
・ $\psi_L(X,j)$:$X$の左 $j$ ビット長ブロック
・ $\psi_R(X,j)$:$X$の右 $j$ ビット長ブロック
・ $\xi(X,k-j)$:$X$の左側に $k-j$ ビットの "1" を設定した $k$
ビット長ブロック
このように,ECB と CTR モード以外は最初のブロックの暗号化に初期ベクタと呼ばれるブロック長と同サイズの初期値を指定する(最初のブロックの暗号化時にフィードバックデータを生成するために用いる). 入力文と鍵が同じでも,この初期ベクタ値を変えることにより異なった暗号文が得られる.このため,暗号文解析が難しくなる. なお,初期ベクタ値は暗号化と復号で同一の値を用いるが,鍵と異なり秘密にしなくても安全性は損なわれない.
CFB,OFB,CTR は,ブロック暗号をストリーム暗号として扱うことができる.
主な暗号利用モードを図に示す.
$x^{128} + x^7 + x^2 + x + 1$
ブロック暗号を用いてメッセージを暗号化する場合,メッセージはブロック単位に暗号化される. このとき,メッセージがブロック長に満たない場合,ブロック長に足りない部分へ特定のデータを埋め込んでブロック長にする処理が必要になる.これをパディングと言う.
復号されたデータや署名データから,パディングしたデータを取り除く処理が必要となるが,この処理を曖昧性がなく一意に行なえることが必要である. このようなパディング処理の方法として,幾つかパディングのフォーマットが規定されている.
暗号ライブラリを利用する場合,一般的にはこのパディング方式をパラメータとして指定することになる(あるいは,パディング方式を含んだアルゴリズムを指定する).
以下に,主なパディング方法を示す.
EB = M || PS
パディング文字列 PS は,各々 8 - (|M| mod 8) の値を持つ 8 - (|M| mod 8) 個の文字(バイト)からなる.
EB = M || 01 if |M| mod 8 = 7
EB = M || 0202 if |M| mod 8 = 6
EB = M || 030303 if |M| mod 8 = 5
EB = M || 04040404 if |M| mod 8 = 4
EB = M || 0505050505 if |M| mod 8 = 3
EB = M || 060606060606 if |M| mod 8 = 2
EB = M || 07070707070707 if |M| mod 8 = 1
EB = M || 0808080808080808 if |M| mod 8 = 0
M || 800 ... 0
のように,先頭パディングバイト0x80の後に必要なだけの0バイトを埋める方式である.