一、Electronic Code Book (ECB)
就是每个明文分组直接过加密算法出密文块,最后再拼起来,这样虽然可以支持并行加密,但是会有一个问题,那就是相同的明文块会产生相同的密文块,黑客可以统计密文块的统计特征来进行破译。如果可以再进一步混淆和扩散就好了。
二、Cipher Block Chaining (CBC)
顾名思义就是用密文块来吧每一块串起来,那就是每一步都需要用前一个密文块。
加密就是用明文块和上一个明文块的结果做异或,然后再过加密算法,得出该明文块相对应的密文块。这样每个密文块都与他前面所有的密文块相关联,做到了很好的扩散。对于第一个明文块需要有一个初始的向量和他做异或。这样就不好并行处理了。
来看解密
对于每个密文块的解密,只需要先把他过一遍解密算法,然后再和他的前一个密文块做异或就好了,所以解密是支持并行处理的。同时还有一个问题,那就是解密需要用到初始向量C0,所以这个向量如何保存和传播也是个问题。
三、Cipher feedback mode(CFB)
这个首先要对一个初始向量加密,然后把这个加密的结果放入一个移位寄存器,这个结果的高s位和我需要加密的明文块,这里也就是s位来做异或,异或的结果推入这个移位寄存器的右边,移位寄存器左移,然后再加密,再和明文异或,一直循环。
这样的话,明文块的大小可以任意规定。
这样,同样是通过密文来连接在了一起,不过与CBC不同的是,CBC是对明文加密,与向量异或,而CFB是对向量加密,与明文异或。这里的向量除了第一次是初始化向量,后面都是密文块(或移位寄存器移位后的)。
这样支持随机访问解密,为什么,想想解密需要什么,需要那块明文对应的密文,这个肯定可以随机访问,还需要当时移位寄存器的状态,这个由什么决定,由初始向量、当前轮数(索引)、以及上一块(或多块)的密文决定,而这些信息都是可以直接获得的,所以解密也可以并行执行,支持随机访问。
四、Output feedback mode (OFB)
这个跟刚才CFB很像,不过CFB叫cipher,用的是密文来传播扩散,这个OFB是用output来传播扩散,output就是初始向量加密后的结果。
所以这个整体的流程就是,初始向量加密之后,干两件事,一件事是传播到下一个明文块作为向量去了,另一件事是和本明文块做异或得到本密文块。
解密就是从初始向量开始,过解密算法,然后和密文异或,就出来了明文。
所以这里看,我只要有了初始向量,我就可以预先把所有的虚线框里的过程走一遍,得到每一个相当于是新的key的东西,明文来了就可以并行异或来出结果了。解密也是同理。
而且这个没有错误传递,因为密文的错误只会影响他那个密文块,甚至只有错误bit会被影响。
五、Counter mode (CTR)
这个跟上一个很像,都是上面虚线部分为每个明文块产生一个新key,用这个新key来和明文异或来产生密文。只不过这个的虚线部分进加密算法的是一个计数器的值。
它具有上面的所有优点:
1.可以预处理
2.支持更高程度的并行,因为每轮的计数器的值是可以随机访问的
3.支持随机访问
4.没有错误传播