ikautak.log

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

暗号理論入門 4.8.3〜4.9

暗号理論入門 原書第3版

暗号理論入門 原書第3版

4.8.3 CFBモード(cipher feedback mode)

CBCモードは、受信者が復号化を始めるには、送信者が暗号文ブロックを全部作り、送信するまで待たなければならない。CFBモードはこの点に関して異なる方法を取る。

初期ベクトル  IV \in \{0, 1\}^{n}自然数 r,\ \ \ 1 \le r \le n が必要であり、平文は長さ r のブロックに分割される。平文ブロック  m_1,\ \ ...,\ \ m_u を暗号する場合、I_1 = IV とおき、 1 \le j \le u に対して以下を実行する。

  1.  O_j = E_k(I_j) を計算
  2.  t_jO_j の最初の r ビットとする
  3. c_j = m_j \oplus t_j を計算
  4.  I_{j+1} = 2^{r} I_j + c_j\ mod\ 2^{n} とする。(I_j は左へ r ビットシフトされ、r ビット分の位置に  c_j が置かれる)

復号化は3.が
  m_j = c_j \oplus t_j   に置き換わる。

受信者も  c_j を知ればビット列 t_{j+1} を求めることができる。鍵 t_1 は送信者と受信者が同時に計算できる。

ブロック長 r が小さければ小さいほど、ブロック暗号化関数をより頻繁に適用する必要があり、計算量が増える。短い暗号文は速く伝送可能なので、最適な r を選ぶ必要がある。

4.8.4 OFBモード(output feedback mode)

CFBモードに似ている。

  1.  O_j = E_k (I_j) を計算
  2.  t_jO_j の最初の r ビットとする
  3.  c_j = m_j \oplus t_j を計算
  4.  I_{j+1} = O_j とおく

復号化のときは3. を
  m_j = c_j \oplus t_j
に置き換える。

暗号文の1つの語の伝送でビットが変化すると、復号ではエラーがただ一箇所のみちょうど全く同じ位置に現れる。
鍵ビット列 t_j は 初期ベクトル I_1 と鍵 k のみに依存しており、それらを送信者と受信者が独立して計算できる。

4.9 ストリーム暗号

平文ブロックの文脈に依存する暗号化法を一般化する。

 \Sigma = \{0, 1\} をアルファベットとし、平文空間と暗号文空間を  \Sigma^{*} とする。自然数 n に対し鍵集合を  \Sigma^{n} とする。
この暗号化は、 k = (k_1,\ \ ...,\ \ k_n) を一つの鍵とし、 w = \sigma_1\ \  ...\ \ \sigma_m \Sigma^{*} の中の長さ m の語とする。鍵ストリーム z_1,\ \ z_2,\ \ ...,\ \ z_m を作るため、
  z_i = k_i,\ \ \ \ 1 \le i \le n
とおき、 m \gt n であれば
  \displaystyle z_i = \sum_{j=1}^{n} c_j z_{i-j}\ \ \ \ mod\ 2,\ \ \ \ n \lt i \le m
とする。 c_1,\ \ ...,\ \ c_n は固定のビットとする。
この方程式をn階の線形漸化式(linear recursion)という。

暗号化関数  E_k と復号化関数 D_k は等式
  E_k(w) = \sigma_1 \oplus z_1,\ \ \ ...,\ \ \ \sigma_m \oplus z_m,\ \ \ \ \ \ \ D_k(w) = \sigma_1 \oplus z_1,\ \ \ ...,\ \ \ \sigma_m \oplus z_m
によって与えられる。

ストリーム暗号はいわゆる線形シフトレジスタによりハードウェアで効率的に実用化できる。