ブロック暗号

ブロック暗号とは、暗号化の対象を、
とあるサイズごとに分割して、暗号化する暗号化方法です。
とあるサイズのことをブロックサイズと言い、8byteのものが多いです。


8byte : DES 3DES Blowfish
16byte : AES Twofish Serpent
例えば32byteのデータを暗号化する場合
8byteブロック暗号ならば、4つに分割して、
16byteブロック暗号ならば、2つに分割して
暗号化します。
次にブロック暗号は、分割したデータの扱いにいくつかのモードがあります。
一番簡単なのはECBモードです。
よく使われるのは、CBCモードです。

ECBモードは
分割したデータをそれぞれ暗号化し、最後にそれらを単純につなぎ合わせてして暗号化結果とします。

各8byteのデータ ABCDがあるとします。
それぞれ、 A B C D と分割し、それぞれを暗号化し A' B' C' D'としてそれを結合して

A'B'C'D'

として結果を返します。

CBCモードは
最初のブロック化データを暗号化し、その結果と次のブロックとの XOR(排他的論理和)を求め、
それに対して暗号化していきます。
このとき、最初のブロックに XOR するべき ブロックサイズ長のデータが必要ですが、
これは、Initial Vector と言って、最初に設定してあげなければいけません。

各8byteのデータ ABCDがあるとします。
Initial Vector を I とします。

XOR( A, I ) →暗号化→ XOR( A, I )'
XOR( XOR( A, I )', B) →暗号化→ XOR( XOR( A, I )', B )'
XOR( XOR( XOR( XOR( A, I )', B )', C ) →暗号化→ XOR( XOR( XOR( XOR( A, I )', B )', C )'
XOR( XOR( XOR( XOR( XOR( A, I )', B )', C )', D) → 暗号化→ XOR( XOR( XOR( XOR( XOR( A, I )', B )', C )', D)'
とし、
XOR( A, I )' XOR( XOR( A, I )', B )' XOR( XOR( XOR( XOR( A, I )', B )', C )' XOR( XOR( XOR( XOR( XOR( A, I )', B )', C )', D)'

を結果として返します。

他にもモードはありますが、CBCがよく使われるので、端折ります。
ブロック暗号はこんな感じのものです。