需要加密的消息按照块密码的块大小被分为数个块,并对每个块进行独立加密
优点:可以并行处理数据
缺点:安全性差,同样的原文生成同样的密文, 不能很好的保护数据
CBC[Cipher-block chaining, 密码块链接]每个明文块先与前一个密文块进行异或后,再进行key加密。在这种方法中,每个密文块都依赖于它前面的所有明文块.
优点:同样的原文生成密文不一样,安全性较强
缺点:执行速度慢,串行处理数据
当需要按块处理的数据,数据长度不符合块处理需求时,按照一定的方法去填充块长的规则
-分类:
NoPadding
–不填充
–在DES加密算法下,要求原文的长度必须是8字节整数倍
–在AES加密算法下,要求原文的长度必须是16字节整数倍
PKCS5Padding
–数据块的大小为8位, 不够就补足
tips:
默认情况下,加密模式和填充模式为:ECB/PKCS5Padding如果使用CBC模式,在初始化Cipher对象时, 需要增加参数, 初始化向量IV : IvParameterSpec iv = new IvParameterSpec(key.getBytes());== 举个例子(代码同上一篇的对称加密代码一致,这里只是讲解关于加密模式和填充模式部分)===
开始的默认情况下:
String input = “对称加密算法”;
String transformation = “DES”;
输出密文: qDhh3hjbd+/TESXcV0YxC4ArDlFR1Mor
String input = “对称加密算法”;
String transformation = “DES/ECB/PKCS5Padding”;
输出密文: qDhh3hjbd+/TESXcV0YxC4ArDlFR1Mor
String input = “对称加密算法”;
String transformation = “DES/CBC/PKCS5Padding”;
因为CBC加密模式需要指定初始向量,初始向量中密钥的长度必须是8个字节
所以我们在加密算法代码中来创建一个iv变量,传入的参数为字节数组
IvParameterSpec iv = new IvParameterSpec(“12345678”.getBytes());
cipher.init(Cipher.ENCRYPT_MODE, secretKeySpec,iv);
同样,我们在加密算法代码引入vi向量,也要在解密算法代码中引入vi向量
在解密算法中来创建一个vi向量
IvParameterSpec iv = new IvParameterSpec(key.getBytes());
cipher.init(Cipher.DECRYPT_MODE,secretKeySpec,iv);
加密:o7WeYG/HJv7o0QMm2jut9MtU48kqqB1F 解密:对称加密算法
如果使用的是不填充的模式,那么原文必须是8个字节的整数倍,否则报错
在UTF-8下,一个中文对应3个字节
String input = “对称12”;
String transformation = “DES/CBC/NoPadding”;
加密:vSYB34GyAes= 解密:对称12