密文窃取

密文窃取（CTS）是密码学中使用分组密码操作模式的通用方法，该操作模式允许处理不能均匀分割成块的消息，而不会延長密文，代价是略為复杂。

一般特性 
密文窃取是一种使用块密码对明文进行加密的技术，但不将信息填充为块大小的倍数，因此密文与明文大小相同。

它通过改变信息最后两个区块的处理过程来实现这一目的。除最后两个区块外，其他所有区块的处理都保持不变，但倒数第二个区块的部分密文会被 "窃取"，以填充最后一个明文区块。然后照常加密经过填充的最后一个区块。

最后两个区块的最终密文由部分倒数第二个区块（省略 "窃取 "部分）和完整的最后一个区块组成，大小与原始明文相同。

解密时需要先解密最后一个区块，然后将窃取的密文还原到倒数第二个区块，然后再像往常一样解密。

原则上，可以使用任何面向区块的区块密码操作模式，但类似流密码的模式已经可以应用于任意长度的信息，而无需填充，因此它们无法从这项技术中受益。与密文窃取相结合的常见操作模式是电子密码本（ECB）和密码块链（CBC）。

ECB 模式的密文窃取要求明文长度超过一个区块。一种可行的变通方法是，当明文长度为一个或更少时，使用类似流密码的块密码操作模式，如 CTR、CFB 或 OFB 模式。

CBC 模式的密文窃取并不一定要求明文长度超过一个区块。在明文长度为一个区块或更短的情况下，初始化向量（IV）可以充当密码文本的前一个区块。在这种情况下，必须向接收方发送修改后的 IV。如果发送方在发送密文时不能自由选择 IV（例如，IV 是一个派生或预先确定的值），则可能无法做到这一点，在这种情况下，CBC 模式的密文窃取只能发生在明文长度超过一个区块的情况下。

要对未知长度的数据进行 CTS 加密或解密，必须延迟处理（和缓冲）最近的两个数据块，以便在数据流结束时对其进行适当处理。

密文格式 
有几种不同的方式来排列密文以便传输。不同排列方式的密文位元數都相同，只是传输顺序不同，因此选择不影響安全性，纯粹是为了方便实现。

这里的编号取自Dworkin所描述的。第三种最流行，由Daemen和Schneier描述；Meyer描述了相关但不兼容的方案（关于位排序和密钥使用）。

CS1 
安排密文传输最顯而易見的方式，不外乎是缩短倒数第二块，後面接着完整的最后一块。但这对接收者来说不方便，原因有二：

 在任何情况下，接收方都必须首先解密最后一块，并且
 这导致最后一块没有按照自然边界对齐，并將硬件复杂化。

这样做的好处是，如果最后的明文块恰好是块大小的倍数，密文就与原始操作模式相同，避免了密文窃取。

CS2 
通常，更方便的方式是交换最后两塊密文块，因此密文結尾先是完整的最后一块，然后是截断的倒数第二块。密文块就会自然对齐。

为了保持与非窃取模式的兼容性，CS2只在窃取密文的数量非零时交换，即原始消息不是块大小的倍数。

这保持了自然的对齐，以及与非窃取模式的兼容性，但是需要以不同的方式处理对齐和不对齐消息大小的情况。

CS3 
最流行的替代方案是无条件交换最后两塊密文块。下面描述了使用该方案的顺序。

窃取密文模式描述CS3 
为了加密或解密数据，对除最后两个数据块外的所有数据块使用标准分组密码操作模式。

下面的步骤描述了如何处理明文的最后两个块，即Pn-1和Pn，其中Pn-1的长度等于以位表示的密码的块大小B；最后一个块的长度Pn是百萬位元（Mbit）；k是正在使用的密钥。M可以范围从1到B，所以Pn可能是一个完整的块。CBC模式描述还使用了就在有关块Cn-2之前的密文块，如果明文适合在两个块内，则该密文块实际上可能是IV。

对于这描述，使用以下函数和操作符：

 Head（data，a）：返回「data」字串第一位。
 Tail（data，a）：返回「data」字串最后一位。
 Encrypt（k，data）：在「data」字串用加密模式的底层块密码，用密钥k。
 Decrypt（k，data）：在「data」字串的解密模式用基础块密码，用密钥k。
 XOR或运算。等价于不用进位的按位加法。
 | |：与运算符。合并运算符两边的字串。
 0^a：一串0位元的字串。

ECB密文窃取 
ECB模式的密文窃取在前两块内引入了块间依赖关系，改变后两块的错误传播行为。

Ecb加密步骤（见图）

参考文献 
 
 
 R. Baldwin; r. Rivest (1996年10月)。 
  
密码算法