网站开发报告,小程序商城页面设计,网站js文件夹,海南网站开发公司hi#xff0c;大家好#xff0c;上一节我们详细介绍了对称加密算法DES的基本内容#xff0c;由于明文的长度不固定#xff0c;而加密算法只能处理特定长度的一块数据#xff0c;所以就需要对比较长的明文进行分组后再加密#xff0c;但是分组后#xff0c;最后一组的长度…hi大家好上一节我们详细介绍了对称加密算法DES的基本内容由于明文的长度不固定而加密算法只能处理特定长度的一块数据所以就需要对比较长的明文进行分组后再加密但是分组后最后一组的长度可能又会出现位数长度不够的情况所以就又需要根据填充模式来对最后一组报文进行填充。
对称加密的分组模式
对称加密一共有五种分组模式下面我们来介绍一下。
1. ECB - Electronic Code Book, 电子密码本模式
优点
简单效率高有利于并行计算误差不会被传送
缺点 密文有规律容易被破解 可能对明文进行主动攻击
特性
最后一个明文分组必须要填充 des/3des - 最后一个分组填充满8字节aes - 最后一个分组填充满16字节 不需要初始化向量 2. CBC - Cipher Block Chaining, 密码块链模式推荐使用
优点
不容易被攻击安全性好适合传输长度长的报文是SSL、IPSec的标准
缺点
不利于并行计算误差会传递需要初始化向量
特性:
最后一个明文分组需要填充 des/3des - 最后一个分组填充满8字节aes - 最后一个分组填充满16字节 需要一个初始化向量 - 一个数组 数组的长度: 与明文分组相等数据来源: 负责加密的人的提供的加解密使用的初始化向量值必须相同 3. CFB - Cipher FeedBack, 密文反馈模式
优点
隐藏了明文模式密文没有规律分组密码转化为流模式可以及时加密传送小于分组的数据
缺点
不利于并行计算误差传递一个明文单一损坏影响多个单元需要初始化向量
特性: 明文分组是和一个数据流进行的按位异或操作, 最终生成了密文
需要一个初始化向量 - 一个数组 数组的长度: 与明文分组相等数据来源: 负责加密的人的提供的加解密使用的初始化向量值必须相同 不需要填充 4. OFB - Output-Feedback输出反馈模式
优点
隐藏了明文模式分组密码转化为流模式可以及时加密传送小于分组的数据
缺点
不利于并行计算对明文的主动攻击是可能的误差传送一个明文单元的损坏影响多个单元
特性: 密文没有规律明文分组是和一个数据流进行的按位异或操作最终生成了密文
需要一个初始化向量 - 一个数组 数组的长度: 与明文分组相等数据来源: 负责加密的人的提供的加解密使用的初始化向量值必须相同 不需要填充 5. CTR - CounTeR计数器模式重点推荐使用
特性
密文没有规律明文分组是和一个数据流进行的按位异或操作最终生成了密文不需要初始化向量不需要填充 以上五种分组模式中ECB模式很容易被破解如今已经很少再使用其余四种分组模式各有千秋。 但极力推荐CBC模式和CTR模式尤其是CTR模式不需要填充代码实现起来很方便。而且加密和解密的方法是一样的并且可以实现并发分组效率高安全性也有保障。 关于CBC模式中的向量 在CBC不光是DES算法模式下向量iv通过随机数或伪随机机制产生是一种比较常见的方法。iv的作用主要是用于产生密文的第一个block以使最终生成的密文产生差异明文相同的情况下使密码攻击变得更为困难除此之外iv并无其它用途。最大的好处是即使相同的明文相同的密钥也能产生不同的密文。 对称加密的填充模式
数据填充常见的一般有四种分别是
NoPaddingPKCS5Padding (PKCS7Padding)Zero PaddingISO 10126 Padding
NoPadding
API或算法本身不对数据进行处理加密数据由加密双方约定填补算法。例如若对字符串数据进行加解密可以补充\0或者空格解密后对数据进行trim 处理。
PKCS5Padding PKCS7Padding
PKCS5Padding 、PKCS7Padding分别为Java和.Net中的默认填充方式PKCS5Padding和PKCS7Padding实际只是协议不一样根据相关资料说明PKCS5Padding明确定义了加密块是8字节PKCS7Padding加密块可以是1-255之间。但是封装的DES算法默认都是8字节所以可以认为他们是一样的。数据补位实际是在数据不满8字节的倍数才补充到8字节的倍数的填充过程。
加密前数据字节长度对8取余余数为m若m0,则补足8-m个字节字节数值为8-m即差几个字节就补几个字节字节数值即为补充的字节数若为0则补充8个字节的8
解密后取最后一个字节值为m则从数据尾部删除m个字节剩余数据即为加密前的原文
比如加密字符串为为AAA差5个字节则补位为AAA55555加密字符串为BBBBBB差2个字节则补位为BBBBBB22加密字符串为CCCCCCCC差0个字节则补位为CCCCCCCC88888888。
Zero Padding
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
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
2DES填充方式与初始向量IV的作用
3DES算法的几种加密模式和填补方式
欢迎大家关注「我是开发者FTD」公众号微信号ForTheDevelopers
也欢迎大家添加我的个人微信交流微信号ForTheDeveloper
关注开发更关注开发者