DES暗号とFeistel構造について
この記事について
DES暗号の仕組みについて,素人が学んだことをメモします.内容は世の中に溢れている記事と大差ないのですが,もしそれで理解できなかった場合にご参考にしてください.
記法と前提
平文を
平文や鍵は
Feistel構造について
DES暗号はFeistel構造と呼ばれている構造をしています.この節ではFeistel構造について説明します.
Festel構造では,平文を
と言ってもよく分からないので,具体的に見ていきましょう.Feistel構造は以下の図のような方式をとります.構造の話をしているので,抽象的な内容ですが,お付き合いください.
巡回鍵の生成
Feistel構造では,一つの鍵
暗号化には,共通鍵
暗号化について
- はじめに平文を左右二つに分けます.これを
とおきます.L_0, R_0 - 暗号化関数
を用いて,E_k と暗号化します.ここで,暗号化関数の添え字c = E_{k}(L_0, R_0) は共通鍵k を用いていることを意味しますが,実質的にはk 個の巡回鍵r を使用しています.\{k_1, \ldots, k_r\}
暗号化関数
各ラウンドで重要になってくるのは
復号化について
暗号化の処理を後ろから追っていくだけです.
次に,
f の非線形性について
DES暗号について
さて,DES暗号はFeistel構造をしています.DES暗号では,ラウンド数
DES暗号がFeistel構造から拡張されている点
DES暗号は,上記で説明したFeistel構造と二点の違いがあります.Feistel構造の最初と最後に処理が加わっています.
- 平文
を直接p に分割するのではなく,置換(L_0, R_0) を通してから分割を行います.つまり,IP となります.(L_0, R_0) = IP(p) -
によって出力されたE_k を暗号文(R_r, L_r) とするのではなく,置換c を通してから暗号文として出力しまう.つまりIP^{-1} となります.c = IP^{-1}((R_r, L_r))
ここでの置換
ここからは,巡回鍵の生成方法と暗号化関数
巡回鍵の生成方法
※画像はWikipediaから引用
-
鍵
から,縮小転置k によって28ビット×2のビット列PC1 を生成します.(C_0, D_0) = PC1(k) でやっていることは,PC1 用にC_0 から28ビットを選び,同様にk 用にD_0 から28ビットを選んでいるという作業です.k -
について,以下の処理を順番に繰り返し,1 \le i \le 16 を生成します.K_{1}, \ldots, K_{16} -
を(C_i, D_i) から良い感じに計算します.具体的には,i=1, 2, 9, 16のときは左に1ビット,それ以外のときは左に2ビット巡回させます.(C_{i-1}, D_{i-1}) - 縮小転置PC2を用いて,
として生成します.K_{i} = PC2((C_i, D_i))
-
PC2では,56ビットの
PC1, PC2はDES暗号で共通のものであり,全世界に公開されています.
(私見)縮小転置を使っているので,仮に
f_{K_i}(R_{i-1}) について
一番大事なところの説明がめんどくさくなってきてしまいました…
復習をします.
※画像はWikipediaから引用したものを一部改変
- まずは拡大置換
を使ってE からR_{i-1} \in \{0, 1\}^{32} を作ります.拡大置換は32文字から重複ありで48文字を選んで並べる処理です.E(R_{i-1}) \in \{0, 1\}^{48} -
によって,鍵との和をとります.B = E(R_{i-1}) \oplus K_i -
という風にB = (B_1, B_2, \ldots, B_8) を6ビット×8に分割する.B - Sボックス
によって,1 \le l \le 8, S_{l}: \{0, 1\}^{6} \to \{0, 1\}^{4} を生成する.c_l = S_l(B_l) - 最後に置換
によってP: \{0, 1\}^{32} \to \{0, 1\}^{32} を出力するf_{K_i}(R_{i-1}) = P((c_1, \ldots, c_8))
拡大置換
Sボックスについて
この説明は完全に力尽きてしまいました…書籍とかを適宜参照してください…
Sボックスは6ビットのものを4ビットに変換する関数です.Sボックスは文字数を減らしているため単射ではなく,非線形になっており,強度のために非常に重要だとされています.
その他
鍵
どういうことでしょうか?鍵
具体的に見てみましょう.
ここで,例えば一つ目に注目すると10000110の各ビット列の和は3であり,確かに奇数であることが分かります.もし,伝送時にどこかのビットが欠けて10?00110となったとしても,和が奇数であるということから,不明な部分が埋められるということです(今回は?以外の和が3であるので,?が0だとわかる).
実際,巡回鍵の生成方法で用いられたPC1を見てみると,8, 16, 24, ..., 64は捨てられています.これらの文字は暗号鍵というよりもパリティビットであるためです.
Discussion