hi,你们好,上一节咱们详细介绍了对称加密算法DES的基本内容,因为明文的长度不固定,而加密算法只能处理特定长度的一块数据,因此就须要对比较长的明文进行分组后再加密,可是分组后,最后一组的长度可能又会出现位数长度不够的状况,因此就又须要根据填充模式来对最后一组报文进行填充。html
对称加密一共有五种分组模式,下面咱们来介绍一下。git
优势:github
缺点:算法
特性:segmentfault
最后一个明文分组必需要填充数组
优势:安全
缺点:微信
特性:并发
最后一个明文分组须要填充post
须要一个初始化向量 - 一个数组
优势:
缺点:
特性: 明文分组是和一个数据流进行的按位异或操做, 最终生成了密文
须要一个初始化向量 - 一个数组
优势:
缺点:
特性: 密文没有规律,明文分组是和一个数据流进行的按位异或操做,最终生成了密文
须要一个初始化向量 - 一个数组
特性:
以上五种分组模式中,ECB模式很容易被破解,现在已经不多再使用,其他四种分组模式各有千秋。
但极力推荐CBC模式和CTR模式,尤为是CTR模式,不须要填充,代码实现起来很方便。并且加密和解密的方法是同样的,而且能够实现并发分组,效率高,安全性也有保障。
关于CBC模式中的向量:
在CBC(不光是DES算法)模式下,向量iv经过随机数(或伪随机)机制产生是一种比较常见的方法。iv的做用主要是用于产生密文的第一个block,以使最终生成的密文产生差别(明文相同的状况下),使密码攻击变得更为困难,除此以外iv并没有其它用途。最大的好处是,即便相同的明文,相同的密钥,也能产生不一样的密文。
数据填充常见的通常有四种,分别是:
API或算法自己不对数据进行处理,加密数据由加密双方约定填补算法。例如若对字符串数据进行加解密,能够补充\0或者空格,解密后对数据进行trim 处理。
PKCS5Padding 、PKCS7Padding分别为Java和.Net中的默认填充方式,PKCS5Padding和PKCS7Padding实际只是协议不同,根据相关资料说明,PKCS5Padding明肯定义了加密块是8字节,PKCS7Padding加密块能够是1-255之间。可是封装的DES算法默认都是8字节,因此能够认为他们是同样的。数据补位实际是在数据不满8字节的倍数,才补充到8字节的倍数的填充过程。
加密前:数据字节长度对8取余,余数为m,若m>0,则补足8-m个字节,字节数值为8-m,即差几个字节就补几个字节,字节数值即为补充的字节数,若为0则补充8个字节的8
解密后:取最后一个字节,值为m,则从数据尾部删除m个字节,剩余数据即为加密前的原文
好比:加密字符串为为AAA,差5个字节,则补位为AAA55555;加密字符串为BBBBBB,差2个字节,则补位为BBBBBB22;加密字符串为CCCCCCCC,差0个字节,则补位为CCCCCCCC88888888。
0填充,顾名思义就是全部不足8位的均补0,不过0填充协议并无在加密算法中标准化,并且0填充可能会有问题,当明文自己有一个或多个0字节结尾时,就很难区分是填充的0仍是原报文。
例如:下面是一个以8字节为单位的加密块,最后四个字节不足位时,使用0来填充
... | DD DD DD DD DD DD DD DD | DD DD DD DD 00 00 00 00 |
ISO 10126 的填充模式定义了在报文最后一个字节填充以前的字节均可以随机填充,在最后一个字节填充总共补充的字节数。
例如: 下面例子,最后一共须要补充4个字节,前三个字节都是随机填充的字节,最后一个字节须要填充4,表示该填充总共填充了4字节。
... | DD DD DD DD DD DD DD DD | DD DD DD DD 81 A6 23 04 |
观察分组模式的图示能够看出,加密后再进行亦或操做的不须要填充,而先进性亦或操做再加密的则不须要填充,这是由于亦或操做须要两个相同长度的数据,一一对比计算!
以上五种分组模式中,ECB模式很容易被破解,现在已经不多再使用,其他四种分组模式各有千秋。
但极力推荐CBC模式和CTR模式,尤为是CTR模式,不须要填充,代码实现起来很方便。并且加密和解密的方法是同样的,而且能够实现并发分组,效率高,安全性也有保障
1,对称加密算法经常使用的五种分组模式(ECB/CBC/CFB/OFB/CTR)