认证模式加密模式,3.加密模式与填充模式
认证模式加密模式,3.加密模式与填充模式String transformation = "DES/CBC/PKCS5Padding"; 运行 ,报错,需要添加一个参数修改成 CBC 加密 模式加密模式和填充模式AES/CBC/NoPadding (128) AES/CBC/PKCS5Padding (128) AES/ECB/NoPadding (128) AES/ECB/PKCS5Padding (128) DES/CBC/NoPadding (56) DES/CBC/PKCS5Padding (56) DES/ECB/NoPadding (56) DES/ECB/PKCS5Padding (56) DESede/CBC/NoPadding (168) DESede/CBC/PKCS5Padding (168) DESede/ECB/NoPadding (168) DESede/ECB/PKCS5Padding
- 1.3.1.加密模式
加密模式:https://docs.oracle.com/javase/8/docs/api/javax/crypto/Cipher.html
ECBECB : Electronic codebook 电子密码本. 需要加密的消息按照块密码的块大小被分为数个块,并对每个块进行独立加密
- 优点 : 可以并行处理数据
- 缺点 : 同样的原文生成同样的密文 不能很好的保护数据
- 同时加密,原文是一样的,加密出来的密文也是一样的
CBC : Cipher-block chaining 密码块链接. 每个明文块先与前一个密文块进行异或后,再进行加密。在这种方法中,每个密文块都依赖于它前面的所有明文块
- 优点 : 同样的原文生成的密文不一样
- 缺点 : 串行处理数据.
- 1.3.2.当需要按块处理的数据 数据长度不符合块处理需求时 按照一定的方法填充满块长的规则
- 不填充.
- 在DES加密算法下 要求原文长度必须是8byte的整数倍
- 在AES加密算法下 要求原文长度必须是16byte的整数倍
数据块的大小为8位 不够就补足
Tips- 默认情况下 加密模式和填充模式为 : ECB/PKCS5Padding
- 如果使用CBC模式 在初始化Cipher对象时 需要增加参数 初始化向量IV : IvParameterSpec iv = new IvParameterSpec(key.getBytes());
加密模式和填充模式
AES/CBC/NoPadding (128)
AES/CBC/PKCS5Padding (128)
AES/ECB/NoPadding (128)
AES/ECB/PKCS5Padding (128)
DES/CBC/NoPadding (56)
DES/CBC/PKCS5Padding (56)
DES/ECB/NoPadding (56)
DES/ECB/PKCS5Padding (56)
DESede/CBC/NoPadding (168)
DESede/CBC/PKCS5Padding (168)
DESede/ECB/NoPadding (168)
DESede/ECB/PKCS5Padding (168)
RSA/ECB/PKCS1Padding (1024 2048)
RSA/ECB/OAEPWithSHA-1AndMGF1Padding (1024 2048)
RSA/ECB/OAEPWithSHA-256AndMGF1Padding (1024 2048)
加密模式和填充模式例子
package com.atguigu.desaes;
import com.sun.org.apache.xml.internal.security.utils.Base64;
import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
public class DesDemo {
// DES加密算法 key的大小必须是8个字节
public static void main(String[] args) throws Exception {
String input ="硅谷";
// DES加密算法,key的大小必须是8个字节
String key = "12345678";
// 指定获取Cipher的算法 如果没有指定加密模式和填充模式 ECB/PKCS5Padding就是默认值
// String transformation = "DES"; // 9PQXVUIhaaQ=
//String transformation = "DES/ECB/PKCS5Padding"; // 9PQXVUIhaaQ=
// CBC模式 必须指定初始向量 初始向量中密钥的长度必须是8个字节
//String transformation = "DES/CBC/PKCS5Padding"; // 9PQXVUIhaaQ=
// NoPadding模式 原文的长度必须是8个字节的整倍数 ,所以必须把 硅谷改成硅谷12
String transformation = "DES/CBC/NoPadding"; // 9PQXVUIhaaQ=
// 指定获取密钥的算法
String algorithm = "DES";
String encryptDES = encryptDES(input key transformation algorithm);
System.out.println("加密:" encryptDES);
// String s = dncryptDES(encryptDES key transformation algorithm);
// System.out.println("解密:" s);
}
/**
* 使用DES加密数据
*
* @param input : 原文
* @param key : 密钥(DES 密钥的长度必须是8个字节)
* @param transformation : 获取Cipher对象的算法
* @param algorithm : 获取密钥的算法
* @return : 密文
* @throws Exception
*/
private static String encryptDES(String input String key String transformation String algorithm) throws Exception {
// 获取加密对象
Cipher cipher = Cipher.getInstance(transformation);
// 创建加密规则
// 第一个参数key的字节
// 第二个参数表示加密算法
SecretKeySpec sks = new SecretKeySpec(key.getBytes() algorithm);
// ENCRYPT_MODE:加密模式
// DECRYPT_MODE: 解密模式
// 初始向量,参数表示跟谁进行异或,初始向量的长度必须是8位
// IvParameterSpec iv = new IvParameterSpec(key.getBytes());
// 初始化加密模式和算法
cipher.init(Cipher.ENCRYPT_MODE sks);
// 加密
byte[] bytes = cipher.doFinal(input.getBytes());
// 输出加密后的数据
String encode = Base64.encode(bytes);
return encode;
}
/**
* 使用DES解密
*
* @param input : 密文
* @param key : 密钥
* @param transformation : 获取Cipher对象的算法
* @param algorithm : 获取密钥的算法
* @throws Exception
* @return: 原文
*/
private static String dncryptDES(String input String key String transformation String algorithm) throws Exception {
// 1 获取Cipher对象
Cipher cipher = Cipher.getInstance(transformation);
// 指定密钥规则
SecretKeySpec sks = new SecretKeySpec(key.getBytes() algorithm);
// IvParameterSpec iv = new IvParameterSpec(key.getBytes());
cipher.init(Cipher.DECRYPT_MODE sks);
// 3. 解密
byte[] bytes = cipher.doFinal(Base64.decode(input));
return new String(bytes);
}
}
运行程序:
修改成 CBC 加密 模式
String transformation = "DES/CBC/PKCS5Padding";
运行 ,报错,需要添加一个参数
修改加密代码:
运行程序
修改填充模式
String transformation = "DES/CBC/NoPadding";
运行报错 NoPadding 这种填充模式 原文必须是8个字节的整倍数
修改运行
在测试 AES 的时候需要注意,key需要16个字节,加密向量也需要16个字节 ,其他方式跟 DES 一样