ブロック暗号
ブロック暗号とは、固定された長さの平文のブロックを、同じ長さのブロックに変換する暗号化方式です。ブロック暗号の暗号化関数は、任意の平文に対する1対1の変換(全単射)となります。
ブロック暗号には次の4つの暗号化モードがあります。
- ECBモード(Electric Codebook Mode)
- CBCモード(Chiperblock Chaining Mode)
- CFBモード(Cipher Feedback Mode)
- OFBモード(Output Feedback Mode)
ECBモード
ECBモードでは、同一の平文ブロックは同一の暗号ブロックに変換されるため、平文の規則性は暗号文の規則性となって現れます。
ECBモードは、計算は単純ですが、規則性があるため解読が比較的容易、ブロックの順序を入れ替えられても分からないなどの問題点があります。
暗号化手順
暗号化は、平文を $m_j$ 、暗号文を $c_j$ とすると暗号化鍵 $K$ により、以下の手順で行われます。
- $c_j=K(m_j)$
複合化手順
また、複合化は複合化鍵 $K^{-1}$ により以下の手順で行われます
- $m_j=K^{-1}(c_j)$
ここで $K$ と $K^{-1}$ は置換と逆置換の関係にあり、$K^{-1}K=1$ となります。
例1
文字集合を $S=\{0,1\}$ 、ブロック長を $n=4$ 、平文を $m$ とすると、
$$m=1010 0001 1011 0100$$$$m_1=1010 , m_2=0001 , m_3=1011 , m_4=0100$$
暗号化鍵 $K$(置換)と複合化鍵 $K^{-1}$(逆置換)を以下とします。$K$ は左に1ビット分のシフト、$K^{-1}$ は右に1ビット分のシフトを行います。
$$K=\left(\begin{array}{cc} 1 & 2 & 3 & 4 \\
2 & 3 & 4 & 1 \end{array}\right)$$$$K^{-1}=\left(\begin{array}{cc} 1 & 2 & 3 & 4 \\
4 & 1 & 2 & 3 \end{array}\right)$$
これにより以下のように暗号化されます。
$$c_1=K(m_1)=0101 , c_2=K(m_2)=0010$$$$c_3=K(m_3)=0111 , c_4=K(m_4)=1000$$$$c=0101 0010 0111 1000$$
CBCモード
CBCモードは、ECBモードの問題点を解決するために考案されました。CBCモードでは、対象となる平文ブロックと暗号化ブロックが1対1に対応しているのではなく、先行するブロックにも依存して暗号化されます。
CBCモードは、受信者がブロックの複合化を始められるのは、送信者が暗号化ブロックを送信し終わるまで待つ必要があります。そのため、効率化の面で問題があります。
暗号化手順
暗号化は以下の手順で行われます。尚、$\mathrm{IV}$ は初期ベクトル、$\oplus$ は論理和(XOR)を表します。
- $c_0=\mathrm{IV}$
- $c_j=K(c_{j-1}\oplus m_j)$
複合化手順
複合化は以下の手順で行われます。
- $c_0=\mathrm{IV}$
- $m_j=c_{j-1}\oplus K^{-1}(c_j)$
複合化のステップ2に暗号化のステップ2を代入すると、元に複合化されることが分かります。
$$c_{j-1}\oplus K^{-1}(K(c_{j-1}\oplus m_j))=c_{j-1}\oplus c_{j-1}\oplus m_j=m_j$$
例2
$\mathrm{IV}=0110$ と置いて、例1と同じ平文と暗号化鍵を使うと以下のように暗号化されます。
$j$ | $m_j$ | $c_{j-1}\oplus m_j$ | $c_j$ |
0 | - | - | 0110 |
1 | 1010 | 1100 | 1001 |
2 | 0001 | 1000 | 0001 |
3 | 1011 | 1010 | 0101 |
4 | 0100 | 0001 | 0010 |
$$c=1001 0001 0101 0010$$
CFBモード
CFBモードでは、CBCモードの効率化の問題点を解決するために考案されました。CBCモードでは、暗号文の受信が完了するまで複合化の計算ができませんが、CFBモードでは、送信者側と受信者側はほとんど同時に計算することができます。
暗号化手順
暗号化は以下の手順で行われます。
- $p_1=\mathrm{IV}$
- $q_j=K(p_j)$
- $t_j$ を $q_j$ の上位 $r$ として定義
- $c_j=t_j\oplus m_j$
- $p_{j+1}=2^rp_j+c_j$
ステップ5は、$p_j$ を左へ $r$ ビット分シフトし、その $r$ ビットに $c_j$ が置かれることで $p_{j+1}$ が生成されます。
複合化手順
複合化は以下の手順で行われます。
- $p_1=\mathrm{IV}$
- $q_j=K(p_j)$
- $t_j$ を $q_j$ の上位 $r$ として定義
- $m_j=t_j\oplus c_j$
- $p_{j+1}=2^rp_j+c_j$
暗号化と複合化で、ステップ4が異なるのみで、その他は同じ手順となります。
例3
例1、例2と同じ前提で $r=3$ とすると、以下のように暗号化されます。
$$m=101 000 011 011 010$$
$j$ | $m_j$ | $p_j$ | $q_j$ | $t_j$ | $c_j$ |
1 | 101 | 0110 | 1100 | 110 | 011 |
2 | 000 | 0011 | 0110 | 011 | 011 |
3 | 011 | 1011 | 0111 | 011 | 000 |
4 | 011 | 1000 | 0001 | 000 | 011 |
5 | 010 | 0011 | 0110 | 011 | 001 |
$$c=011 011 000 011 001$$
OFBモード
OFBモードでは、暗号文の伝送でビットが変化すれば、複合では同じ位置にエラーが現れ、それ以外には現れません。
暗号化手順
暗号化は以下の手順で行われます。
- $p_1=\mathrm{IV}$
- $q_j=K(p_j)$
- $t_j$ を $q_j$ の上位 $r$ として定義
- $c_j=t_j\oplus m_j$
- $p_{j+1}=q_j$
CFBモードとはステップ5が異なります。
複合化手順
複合化は以下の手順で行われます。
- $p_1=\mathrm{IV}$
- $q_j=K(p_j)$
- $t_j$ を $q_j$ の上位 $r$ として定義
- $m_j=t_j\oplus c_j$
- $p_{j+1}=q_j$
暗号化と複合化で、ステップ4が異なるのみで、その他は同じ手順となります。
例4
例1、例2、例3と同じ前提とすると、以下のように暗号化されます。
$$m=101 000 011 011 010$$
$j$ | $m_j$ | $p_j$ | $q_j$ | $t_j$ | $c_j$ |
1 | 101 | 0110 | 1100 | 110 | 011 |
2 | 000 | 1100 | 1001 | 100 | 100 |
3 | 011 | 1001 | 0011 | 001 | 010 |
4 | 011 | 0011 | 0110 | 011 | 000 |
5 | 010 | 0110 | 1100 | 110 | 100 |
$$c=011 100 010 000 100$$