分组加密工作模式(ECB/CBC/CFB/OFB/CTR)

分组加密工作模式

Rust实现


符号说明

  • \(b\): 分组位长度;
  • \(n\): 明文中分组或分段个数;
  • \(s\): 分段数据的位长度;
  • \(u\): 最后一个明文块或密文块的位长度;
  • \(C_i\): 第\(i\)个密文块(block);
  • \(C_{i}^{\#}\): 第\(i\)个密文段(segment);
  • \(C_{n}^{*}\): 最后一个密文块;
  • \(O_i\): 第\(i\)个输出块;
  • \(P_i\): 第\(i\)个明文块;
  • \(P_{i}^{\#}\): 第\(i\)个明文段;
  • \(P_{n}^{*}\): 最后一个明文块;
  • \(T_i\): 第\(i\)个计数块;
  • \(x\dots y\): y拼接到x之后;
  • \(x\oplus y\): x异或y;
  • \(CIPH_{K}(x)\): 对数据块\(x\)使用密钥\(K\)进行前向加密函数加密;
  • \(CIPH_{K}^{-1}(x)\): 对数据块\(x\)使用密钥\(K\)进行逆加密函数解密;
  • \([x]_{m}\): 非负整数\(x\)按m位二进制表示;
  • \(IV\): 初始化向量, 可通过随机数生成算法生成一个位长度为\(b\)的向量;
  • \(LSB_{m}(x)\): x的最低有效m位;
  • \(MSB_{m}(x)\): x的最高有效n位;

ECB(Electronic Codebook)

ECB加密解密过程数学表达式如下:

\[\begin{aligned} & C_i = CIPH_{K}(P_i), \qquad i = 0\cdots n \\ & P_i = CIPH_{K}^{-1}(C_i), \qquad i = 0\cdots n \end{aligned} \]

CBC(Cipher Block Chaining)

CBC加密解密过程数学表达式如下:

\[\begin{aligned} & C_0 = CIPH_{K}(P_{0}\oplus IV) \\ & C_i = CIPH_{K}(P_{i}\oplus C_{i-1}), \qquad i = 1\cdots n \\ & P_0 = CIPH_{K}^{-1}(C_{0})\oplus IV \\ & P_i = CIPH_{K}^{-1}(C_{i})\oplus C_{i-1}, \qquad i = 1\cdots n \end{aligned} \]

CFB(Cipher Feedback)

CFB加密解密过程数学表达式如下:

\[\begin{aligned} & I_0 = IV \\ & I_i = LSB_{b-s}(I_{i-1})\dots C_{i-1}^{\#}, \qquad i=1\cdots n \\ & O_i = CIPH_{K}(I_i), \qquad i=0\cdots n\\ & C_{i}^{\#} = P_{i}^{\#}\oplus MSB_{s}(O_i), \qquad i=0\cdots n \\ & \quad \\ & I_0 = IV \\ & I_i = LSB_{b-s}(I_{i-1})\dots C_{i-1}^{\#}, \qquad i=1\cdots n \\ & O_i = CIPH_{K}(I_i), \qquad i=0\cdots n \\ & P_{i}^{\#} = C_{i}^{\#} \oplus MSB_{s}(O_i), \qquad i=0\cdots n \end{aligned} \]

OFB(Output Feedback)

OFB加密解密过程数学表达式如下:

\[\begin{aligned} & I_0 = IV \\ & I_i = O_{i-1}, \qquad i=1\cdots n \\ & O_i = CIPH_{K}(I_i), \qquad i=0\cdots n \\ & C_{i} = P_{i}\oplus O_{i}, \qquad i=0\cdots n-1 \\ & C_{n}^{*} = P_{n}^{*} \oplus MSB_{u}(O_n) \\ & \quad \\ & I_0 = IV \\ & I_i = O_{i-1}, \qquad i=1\cdots n \\ & O_i = CIPH_{K}(I_i), \qquad i=0\cdots n \\ & P_i = C_{i}\oplus O_{i}, \qquad i=0\cdots n-1 \\ & P_{n}^{*} = C_{n}^{*}\oplus MSB_{u}(O_n) \end{aligned} \]

CTR(Counter)

CTR加密解密过程数学表达式如下:

\[\begin{aligned} & O_{i} = CIPH_{K}(T_{i}), \qquad i=0\cdots n \\ & C_{i} = P_{i} \oplus O_{i}, \qquad i=0\cdots n-1 \\ & C_{n}^{*} = P_{n}^{*} \oplus MSB_{u}(O_n) \\ & \quad \\ & O_{i} = CIPH_{K}(T_{i}), \qquad i=0\cdots n \\ & P_{i} = C_{i} \oplus O_{i}, \qquad i = 0\cdots n-1 \\ & P_{n}^{*} = C_{n}^{*}\oplus MSB_{u}(O_n) \end{aligned} \]

计数块的生成

CTR加密解密过程需要计数块\(T_{i}\)的参与, 其生成步骤如下:

  • 选定初始化计数块\(T_{0}\);

\(T_i\)的位长度为\(m\), 需保证\(n\lt m\le b\), 在\(2^m\)个数中任意选定一个作为初始值.

  • 递增生成后续计数块\(T_{0\cdots n}\), 那么生成方法如下:

\[T_{i} = (T_{i-1}+1) \mod 2^{m}, \qquad i=1\cdots n \]

参考资料

  • NIST 800-38A;
posted @ 2020-04-15 12:10  mengsuenyan  阅读(1030)  评论(1编辑  收藏  举报