当使用分组密码时,可以通过CryptSetKeyParam功能指定以下任何密码模式。如果应用程序没有明确指定这些模式之一,则使用密码块链接(CBC)密码模式。
当使用该密码模式时,每个块被单独加密。没有反馈。这意味着任何相同或相同的消息中的明文块或使用相同密钥加密的不同消息将被转换为相同的密文块。
如果要加密的明文包含大量的重复,则密文一次可以被破坏一个块是可行的。此外,不道德的人有可能在没有发现的情况下替代和交换个别的街区。
初始化向量不能与该密码模式一起使用。
如果密文块的单个位是乱码,则整个对应的明文块也将被乱码。
该密码模式引入反馈。在每个明文块被加密之前,它与上一个块的密文进行异或运算。这确保即使明文包含许多相同的块,它们将被加密为不同的密文块。
在块加密之前,初始化向量与第一个明文块进行异或运算。
与Codebook密码模式一样,如果密文块的单个比特乱码,则相应的明文块也将被乱码。另外,在后面的明文块(与原始乱码相同的位置)中会有一点乱码。同步错误是致命的。如果密文中存在额外的或丢失的字节,则明文将从该点起乱码。
当使用Microsoft RSA Base Provider时,这是默认的密码模式。
密码反馈模式允许您将明文的小增量处理为密文,而不是一次处理整个块。这可以是有用的,例如,当加密源自于键盘的数据流时。每个按键都可以进行加密和传输,无需等待整个块的输入。
该模式使用长度为一个块大小的移位寄存器,并分为多个部分。例如,如果块大小是64位,每次处理8位,则移位寄存器将被分成8个区段。
这是每个加密周期的过程:
移位寄存器中的块正常加密。
加密移位寄存器中最左边的8位与明文的下一个8位进行异或运算,作为8位的密文发送。
移位寄存器向左移位8位。
在步骤2中生成的8位密文被放置在移位寄存器的最右边8位。
在CryptoAPI中,通过使用CryptSetKeyParam功能设置加密密钥的KP_MODE_BITS参数来指定一次处理的比特数。此参数通常默认为8。
根据KP_MODE_BITS参数的值,该密码模式基本上比密码块链接模式慢。例如,如果块大小为64位,同时处理8位,则该密码模式是64/8或8倍慢。
在加密过程开始之前,移位寄存器用初始化向量填充。
如果密文中有一点乱码,一个明文位是乱码,移位寄存器被破坏。这导致接下来的几个明文块被乱码,直到坏位从移位寄存器移出。在前面的例子中,9字节的明文将是乱码。这与密码块链接模式相同的错误传播量。同步错误不是致命的,只要滑差是KP_MODE_BITS的倍数。因此,如果KP_MODE_BITS为8,并且密文中存在额外或丢失的字节,则9字节的明文是乱码,明文将具有相同数量的额外或丢失的字节。
该模式类似于密码反馈模式。两种模式之间的唯一区别是移位寄存器的填充方式。
输出反馈(OFB)密码模式使用以下加密周期:
移位寄存器中的块正常加密。
加密移位寄存器中最左边的8位与明文的下一个8位进行异或运算,作为8位的密文发送。
移位寄存器向左移位8位。
步骤2中使用的加密移位寄存器的最左边8位被放置在移位寄存器的最右边的8位中。
与密码反馈模式一样,在加密过程开始之前,移位寄存器填充初始化向量。
如果密文中有一点乱码,明文的相应位也会出现乱码。这比密码反馈模式好得多。但是,同步错误是致命的。如果密文中存在额外的或丢失的位,则明文将从该点开始乱码。
注意根据步态(参见下文),当反馈的位数不同于块大小时,OFB块加密模式具有弱点。因此,建议在使用此密码模式时将KP_MODE_BITS参数设置为块大小。
*J.Gait,“A New Nonlinear Pseudorandom Number Generator”,【IEEE软件工程学报】,v。SE-3,N。1977年9月5日,第359-363.