ikautak.log

C/C++, Python, CUDA, Android, Linux kernel, Network, etc.

暗号理論入門 6章

暗号理論入門 原書第3版

暗号理論入門 原書第3版

第6章 DESアルゴリズム

DESは長年世界中で使われてきたが、もはや十分に安全ではない。安全な改良版として三重DES方式がある。

6.1 Feistel暗号

DESアルゴリズムはいわゆるFeistel暗号である。

アルファベットとして  \{0,\ 1\}t をブロックの長さとする。
K に対する暗号化関数を f_{K} とする。
Feistel暗号は次のように構成される。
ブロックの長さが 2t 、アルファベットとして \{0,\ 1\} をもつ。
鍵空間 K を固定する。
巡回数 r \ge 1 も固定し、鍵 k \in K より巡回鍵  K_1\ ,\ \ ...,\ \ k_r の列を構成する。

 k \in K に対するFeistel暗号の暗号化関数は E_k は次のように定義される。
p を長さ 2t の平文とする。これを長さ t の左右二つの平文に分け、p =(L_0\ ,\ \ R_0) と表す。ここで L_0 を左半分、R_0 を右半分とする。
系列 ( (L_{i}\ ,\ \ R_{i}))\ \ \ \ \ 0 \le i \le r
 (L_{i},\ \ R_{i}) = (R_{i-1},\ L_{i-1} \oplus f_{K_{i}}(R_{i-1}))\ ,\ \ \ \ 1 \le i \le r
と構成する。

復号化は
  (R_{i-1},\ \ L_{i-1}) = (L_{i},\ \ R_{i} \oplus f_{K_{i}}(L_{i}),\ \ \ \ \ \ \ \ 1 \le i \le r
である。鍵列 ( K_{r},\ \ K_{r-1},\ \ ...,\ \ K_{1})r 回の巡回(round)で適用することにより暗号文 (R_{r},\ \ L_{r}) から (R_{0},\ \ L_{0}) を得る。

6.2 DESアルゴリズム

DES暗号化法は、アルファベット \{0,\ 1\} とブロック長 64をもつFeistel暗号を少し修正したものである。

平文空間と鍵空間

DESの平文空間と鍵空間は P = C = \{0,\ 1\}^{64} である。
DES鍵は長さ64bitで、bit列をbyteに分けて、各byteの八つのbit総和が奇数になるように、8bit目を設定する。(1bitの格納誤差・伝送誤差の補正が可能)
よって、ひとつのDES鍵では56bitまで、自由に選べる。

初期置換

平文の一つの語 p は三段階にわたって入力される。
最初の段階で初期置換(initial permutation)IPを適用する。初期置換はこの方式のために固定されている。

内部ブロック暗号

アルファベットは \{0,\ 1\} 、ブロック長は32で鍵空間は \{0,\ 1\}^{48} である。
データRが拡大関数(Expansion function)によって \{0,\ 1\}^{48} に拡大される。(E(R))
E(R) \oplus K が作られ、長さ6の8個のブロックに分解される。
次の段階でSボックスという関数が使われる。

Sボックス

Sボックスは4行16列の表で表される。 bit1とbit6を行(row index)、bit2,3,4,5を列指数(column index)と考え、表に当てはめた値を2進展開した値を出力とする。

巡回鍵

DES鍵 k \in \{0,\ 1\}^{64} から長さ48の巡回鍵 K_{i},\ \ \ \ 1 \le i \le 16 を生成する方法。省略。

6.4 DES暗号の安全性

DESを攻撃する特殊な方法として差分暗号解読と線形暗号解読がある。(wikipedia)
しかし、最も成果の上がっている攻撃法は総当たり法である。

現在のところ、三重暗号化が使われたときのみ安全と言われている。