1.Electronic CodeBlock(ECB)
块加密模式是最简单的加密模式。信息被分割成单独的块,每一块单独加密。
算法特点:
1.因为每一块单独加密,所以不能很好的隐藏数据的模式,特别是在加密bitmap图像数据时。
2.每次Key、明文、密文的长度都必须是64位。
2.Cipher Block Chaining(CBC)
每一块明文在加密前会和前一块明文进行异或处理。为了使每个信息独一无二,第一个块信息会被一个初始化向量(initialization vector)
ECB加密算法可表示为:
C0 = Enc(Key, XOR(IV, P0)
Ci = Enc(Key, XOR(Ci-1, Pi)
ECB解密算法可以表示为:
P0 = XOR(IV, Dec(Key, C0))
Pi = XOR(Ci-1, Dec(Key,Ci))
算法特点:
- 每次加密的密文长度为64位(8个字节);
- 当相同的明文使用相同的密钥和初始向量的时候CBC模式总是产生相同的密文;
- 密文块要依赖以前的操作结果,所以,密文块不能进行重新排列,同时不能并行加密,但是,很明显解密可以并行处理;
- 可以使用不同的初始化向量来避免相同的明文产生相同的密文,一定程度上抵抗字典攻击;
- 一个错误发生以后,当前和以后的密文都会被影响;
3.Cipher Feedback(CFB)
CFB模式和CBC模式相似,使块加密变成一个自同步的流加密。操作也十分相似,特别的是,CFB模式加密几乎是倒置的CBC模式加密。
Ci = Ek(Ci-1) XOR Pi
Pi = Ek(Ci-1) XOR Ci
Co = IV
注:Ci表示第i块数据块的密文,Ek表示加密过程,Pi表示第i块明文,IV 表示初始化向量
扩展:根据一个自同步密码的定义:如果有一部分密文丢失(例如:传输错误),只会出现一部分的原内容错误,并且在执行一段解密步骤后能继续正常解密。使用CFB模式加密后,解密将不再向CBC一样可以自同步。只有在一整数据块密文丢失时,CBC和CFB可以自同步;但是在丢失一个字节或者一个比特位时将会彻底是解密崩溃。为了解决好这种情况,需要依次加密一个字节或比特位。连通一个移位寄存器,CFB可以实现自同步。
标注:Si表示移位寄存器的第i次状态值;a<<x 表示a左移x位;head(a, x)表示a的高x位,n表示IV的比特位数。
算法特点:
- 加密不能并行处理,解密可以并行处理;
- 算法是自同步密码;
- 在解密时,一个比特为错误会影响两个数据块的正确性。
- 信息大小不必是加(解)密块的倍数;
4.Output Feedback(OFB)
与CFB模式不同之处在于,加密移位寄存器与密文无关了,仅与加密key和加密算法有关;做法不再是将密文输入到加密移位寄存器中,而是把输出的分组密文(Oi)输入到移位寄存器中。
特点:
- 与CFB类似,以下都是不同之处;
- 因为密文没有参与链操作,所以使得OFB模式更容易受到攻击;
- 不会进行错误传播,某位密文发生错误,只会影响该位对应的明文,而不会影响别的位;
- 不是自同步的,如果加密和解密两个操作失去同步,那么系统需要重新初始化;
- 每次重新同步时,应使用不同的初始向量。可以避免产生相同的比特流,避免”已知明文”攻击 ;
互联网程序中加密模式的使用:
ECB是不推荐的方式,Key相同时,相同的明文在不同的时候产生相同的明文,容易遭到字典攻击;
CBC由于加入了向量参数,一定程度上抵御了字典工具,但缺点也随之而来,一旦中间一个数据出错或丢失,后面的数据将受到影响;
CFB与CBC类似,好处是明文和密文不用是8bit的整数倍,中间一个数据出错,只影响后面的几个块的数据;
OFB比CFB方式,一旦一个数据出错,不会影响后面的数据,但安全性降低;
因此,推荐使用CFB方式,但每个数据包单独加密,否则一个数据包丢失,需要做很多容错处理;
当然,具体问题也要具体分析,对于只需要”特定安全性”①,不需要”计算安全性”以上的软件,也可以使用ECB模式;
参考文献:
wiki:http://en.wikipedia.org/wiki/Block_cipher_mode_of_operation
sianblog:http://blog.sina.com.cn/s/blog_4c6e822d0102dwfd.html