ブロック暗号
ブロック暗号とは、暗号化の対象を、
とあるサイズごとに分割して、暗号化する暗号化方法です。
とあるサイズのことをブロックサイズと言い、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がよく使われるので、端折ります。
ブロック暗号はこんな感じのものです。