Feistel構造
Feistel構造(Feistel structure)
ブロック暗号(block cipher) の最も代表的な構造 1977年にIBMのホルスト・ファイステルが開発したDESの構造から、ファイステル構造(Feistel Structure)と呼ばれる。
拡散と攪乱という観点から考案しているらしい
利点
暗号化と復号のルーチンを共通化でき(ラウンド鍵の順番だけを入れ替えればよい)、コードサイズ・回路規模などの点で、ソフトウェアおよびハードウェアでの実装性に優れる
実コード
欠点
1ラウンドあたり攪拌されるのはブロックのうち一部のみである
SPN構造と同様の攪拌性を得るためにはラウンド数を増やす必要がある
ラウンド(round)という暗号化のステップを繰り返す。
暗号化と復号は非常に良く似た処理になる。
ラウンドのステップ
(1)入力されたブロックデータを左右2個のサブブロックに分ける。
(2)右を、そのまま右に送る。
(3)右を、ラウンド関数$ f に送る。
(4)ラウンド関数$ f は、右とラウンド鍵$ k_r により、ランダムに見えるビット列を計算する。
(5)得られたビット列と、左とのXORを計算した結果を暗号化された左とする。
2つのラウンド変数 $ L_{r} , $ R_{r} 、初期入力は$ L_{0}, R_{0} 、ラウンド関数$ f 、ラウンド鍵$ k_r 、初期鍵は$ k_0
暗号化(関数$ F )
$ L_{r+1} = R_{r}
$ R_{r+1} = L_{r} \oplus F(R_{r}, k_{k})
$ F(L_{r+1}, R_{r+1}) = \lparen R_{r},\ L_{r} \oplus f(R_{r}, k_{k}) \rparen
右とラウンド鍵をラウンド関数$ f で計算し、左とのXORを計算する。
復号(関数$ G )
$ L_{i} = R_{i+1} \oplus f(L_{i+1}, k_{i})
$ R_{i} = L_{i+1}
$ G(L_{i}, R_i) = \lparen R_{i+1} \oplus f(L_{i+1}, k_{i}), \ L_{i+1} \rparen
左とラウンド鍵をラウンド関数$ f で計算し、左とのXORを計算する。
F関数の例
$ f(x)=x^2 \pmod n
確認用
Q. Feistel構造
Q. Feistel構造の性質は
Q. ラウンドとは
Q. ラウンドのステップ
Q. ラウンド(暗号化)の処理
Q. ラウンド(復号)の処理
関連
参考