密码系列5-分组密码的运行模式
0x00 填充模式
在讲解分组密码的运行模式之前,先科普下分组密码的填充模式。填充模式是当我们在使用分组密码时,对于输入的明文不是分组长度的倍数的情况提出的一种解决方案,以DES为例。
DES输入明文不是64比特倍数怎么办?,这是就需要填充,下面介绍几种常用(大家都在用)的填充模式,当然你也可以自定义你自己的填充模式(但关键是别人不用啊)
Zeros填充算法
需要填充的7个字节全部填充为0,例子(其中斜体加粗为填充的数据):
第一个消息分组:
F1 F2 F3 F4 F5 F6 F7 F8
第二个消息分组:
F9 00 00 00 00 00 00 00
注意:即使消息长度恰好是8的整数倍,仍需填充8字节的全0
X923填充算法
需要填充的7个字节中前6个字节填充0,最后一个字节记录填充的总字节数,例子(其中斜体加粗为填充的数据):
第一个消息分组:
F1 F2 F3 F4 F5 F6 F7 F8
第二个消息分组:
F9 00 00 00 00 00 00 07
注意:即使消息长度恰好是8的整数倍,仍需填充8字节的全0。因为,若不如此,对于 前7字节全0,最后1字节为01 的消息 00 00 00 00 00 00 00 01与7字节的全0消息,由于需要填充一个字节,但又是最后一个字节只能记录填充的字节数 所以填 01。 从而与上面的8字节消息相同。因此出现 00 00 00 00 00 00 00 01时,你分辨不出它应该是哪种情况。
PKCS7填充算法
需要填充的7个字节中的每一个字节填充需要填充的总字节数,分组结果为:
第一个消息分组:
F1 F2 F3 F4 F5 F6 F7 F8
第二个消息分组:
F9 07 07 07 07 07 07 07
ISO10126填充算法
需要填充的7个字节中前6个字节填充随机字节序列,最后一个字节记录填充的总字节数,分组结果为:
第一个消息分组:
F1 F2 F3 F4 F5 F6 F7 F8
第二个消息分组:
F9 7D 2A 75 EF F8 EF 07
0x01 分组密码的运行模式
分组密码在加密时, 明文分组的长度是固定的, 而实际应用中待加密消息的数据量是不定的, 数据格式可能是多种多样的。为了能在各种应用场合使用DES, 美国在FIPSPUS 74 和81 中定义了DES 的4 种运行模式, 如下表 所示。这些模式也可用于其他分组密码, 下面以DES 为例来介绍这4 种模式。
电码本(ECB-Electronic Code Book)模式
ECB模式是将明文的各个分组独立地使用同一密钥k加密。由于这种工作模式类似于电报密码本中指定码字的过程,所以被形象地称为电码本模式
优点:
- 实现简单;
- 不同明文分组的加密可并行实施,尤其是硬件实现时速度很快.
缺点:
不同的明文分组之间的加密独立进行,故保留了单表代替缺点,造成相同明文分组对应相同密文分组,因而不能隐蔽明文分组的统计规律和结构规律,不能抵抗替换攻击.
ECB 在用于短数据(如加密密钥)时非常理想。比如,用于随机数的加密保护、用于单分组明文的加密。
密码分组链接(CBC)模式
可以看出,ECB是有安全缺陷的,为了解决ECB 的安全缺陷, 可以让重复的明文分组产生不同的密文分组, CBC( cipher block chaining)模式就可满足这一要求。
它一次对一个明文分组加密, 每次加密使用同一密钥, 加密算法的输入是当前明文分组和前一次密文分组的异或, 因此加密算法的输入不会显示出与这次的明文分组之间的固定关系, 所以重复的明文分组不会在密文中暴露出这种重复关系。加密与解密的过程如上图所示,核心就是异或的可逆性。
在产生第1 个密文分组时, 需要有一个初始向量IV 与第1 个明文分组异或。解密时, I V 和解密算法对第1 个密文分组的输出进行异或以恢复第1 个明文分组。I V 对于收发双方都应是已知的, 为使安全性最高, I V 应像密钥一样被保护, 可使用ECB 加密模式来发送I V。保护IV 的原因如下: 如果敌手能欺骗接收方使用不同的I V值, 敌手就能够在明文的第1 个分组中插入自己选择的比特值, 这是因为:
C1 = EK [ IV xor P1 ]P1 = IV xor DK [ C1 ]用X( i)表示64 比特分组X 的第i 个比特, 那么P1 ( i) = I V( i)xor DK [ C1 ] ( i) , 由异或的性质得P1 ( i)′= IV( i)′xor DK [ C1 ] ( i)其中撇号表示比特补。上式意味着如果敌手篡改IV 中的某些比特, 则接收方收到的P1中相应的比特也发生了变化。由于CBC 模式的链接机制, CBC 模式对加密长于64 比特的消息非常合适。CBC 模式除能够获得保密性外, 还能用于认证。
总结下CBC模式的特点:
- 明文块的统计特性得到了隐蔽。这是由于在密文CBC模式中,各密文块不仅与当前明文块有关,而且还与以前的明文块及初始化向量有关,从而使明文的统计规律在密文中得到了较好的隐蔽。
- 具有有限的(两步)错误传播特性。一个密文块的错误将导致两个密文块不能正确脱密.
密码反馈(CFB )模式
若待加密消息需按字符、字节或比特处理时,可采用CFB模式。并称待加密消息按 j 比特处理的CFB模式为 j 比特CFB模式。适用于每次处理 j比特明文块的特定需求的加密情形,能灵活适应数据各格式的需要.例如,数据库加密要求加密时不能改变明文的字节长度,这时就要以明文字节为单位进行加密.
加密时, 加密算法的输入是64 比特移位寄存器, 其初值为某个初始向量I V。加密算法输出的最左( 最高有效位) j 比特与明文的第一个单元P1 进行异或, 产生出密文的第1个单元C1 , 并传送该单元。然后将移位寄存器的内容左移j 位并将C1 送入移位寄存器最右边( 最低有效位) j 位。这一过程继续到明文的所有单元都被加密为止。
解密时, 将收到的密文单元与加密函数的输出进行异或。注意这时仍然使用加密算法而不是解密算法, 原因如下:设Sj ( X)是X 的j 个最高有效位, 那么C1 = P1 xor Sj ( E( I V) ) , 因此P1 = C1 xor Sj ( E( IV) )可证明以后各步也有类似的这种关系。CFB 模式除能获得保密性外, 还能用于认证。
优点:
- 适用于每次处理 j比特明文块的特定需求的加密情形;
- 具有有限步的错误传播,可用于认证;
- 可实现自同步功能:该工作模式本质上是将分组密码当作序列密码使用的一种方式,但乱数与明文和密文有关!该模式适应于数据库加密、无线通信加密等对数据格式有特殊要求或密文信号容易丢失或出错的应用环境。
缺点:加密效率低
输出反馈(OFB)模式
OFB(output feedback)模式的结构类似于CFB, 如下图。
不同之处如下: OFB 模式是将加密算法的输出反馈到移位寄存器, 而CFB 模式中是将密文单元反馈到移位寄存器。
优点:
- 这是将分组密码当作序列密码使用的一种方式,但乱数与明文和密文无关!
- 不具有错误传播特性!只要密文在传输过程中不丢信号,即使信道不好,也能将明文的大部分信号正常恢复。例如C1 中出现1 比特错误, 在解密结果中只有P1 受到影响, 以后各明文单元则不受影响。而在CFB 中, C1 也作为移位寄存器的输入, 因此它的1 比特错误会影响解密结果中各明文单元的值。
缺点:
- 不能实现报文的完整性认证。
- 乱数序列的周期可能有短周期现象。
- 比CFB 模式更易受到对消息流的篡改攻击, 比如在密文中取1 比特的补, 那么在恢复的明文中相应位置的比特也为原比特的补。因此使得敌手有可能通过对消息校验部分的篡改和对数据部分的篡改, 而以纠错码不能检测的方式篡改密文。
适用范围:
明文的冗余度特别大,信道不好但不易丢信号,明文错些信号也不影响效果的情形。如图象加密,语音加密等。
0x02 总结
4种工作模式比较
下篇介绍其他较为著名的分组密码。。。