对称加密/DES加密
对称加密
采用单钥密码系统的加密方法,加密和解密使用的是同一个**
分类:
- DES[ Data Encryption Standard]数据加密标准
- AES[Advanced Encryption Standard]高级加密标准
特点:
- 加密速度快,可以加密大文件
- 密文不可逆,一旦**文件泄漏,就会导致数据暴露
- 加密后编码表找不到对应的字符,出现乱码
- 一般结合Base64使用
DES加密
– 准备工作:
- 设置原文
String input = “对称加密算法”; - 定义key [如果使用des进行加密,那么**必须是8个字节]
String key = “12345678”; - 设置DES算法
String transformation = “DES”; - 加密的类型
String algorithm = “DES”;
//加密
String encryptDES= encryptDES(input, key, transformation, algorithm);
System.out.println("加密" + encryptDES);
//解密
String s1 = decryptDES(encryptDES, key, transformation, algorithm);
System.out.println("解密"+s1);
–开始解读代码–!!!
Cipher类为加密和解密提供密码功能。它构成了Java Cryptographic Extension(JCE)框架的核心。这些核心操作需要通过Cipher类来实现。
(1)创建一个Cipher对象,调用它的getInstance()方法,返回实现指定转换的 Cipher对象,需要传入一个参数String transformation的格式是“算法/工作模式/填充模式”,不同的算法支持不同的工作模式以及填充模式,所以我们在准备工作时已经设置好了变量;
(2)将cipher 对象进行初始化。通过这两个常量来完成用于加密或是解密操作的初始化,(“加密模式或者解密模式”,“加密规则”)。
加密模式:Cipher.ENCRYPT_MODE
解密模式:Cipher.DECRYPT_MODE
接下来我们去new一个加密规则,即new SecretKeySpec ()需要两个参数,第一个参数为**key的字节,是通过key.getBytes()得到,第二个参数为加密的类型DSE,我们在准备工作已定义了这个变量;
(3).通过cipher.doFinal()去调用加密方法,参数为一个字节数组,即可调用input.getBytes()将String转化为byte数组。
将得到的字节数组bytes进行Base64编码,使用 Base64.encode(bytes),否则直接调用new String(bytes)会出现乱码,因为ASCII没有负数,解析不出来,所以显示乱码。
(4).将 String encode = Base64.encode(bytes); 返回encode就ok了!
所以DES加密函数算法需要传的参数是原文input,**key,加密规则transformation,加密类型algorithm
private static String encryptDES(String input, String key, String transformation, String algorithm) throws Exception {
//创建加密对象
Cipher cipher = Cipher.getInstance(transformation);
//创建加密规则
//第一个参数:表示key的字节
//第二个参数:加密的类型
SecretKeySpec secretKeySpec = new SecretKeySpec(key.getBytes(), algorithm);
//进行加密初始化
//第一个参数表示模式,加密模式,解密模式
//第二个参数表示:加密规则
cipher.init(Cipher.ENCRYPT_MODE, secretKeySpec);
//调用加密方法
byte[] bytes = cipher.doFinal(input.getBytes());
String encode = Base64.encode(bytes);
// for (byte aByte : bytes) {
// //打印出负数,在字符码表找不到
// System.out.println(aByte);
// }
// //如果直接打印密文会直接打印乱码
// //System.out.println(new String(bytes));
return encode;
}
DES解密算法
准备工作:
同加密算法一样,这里就不再重复辣
–开始解读代码–!!!
(1).创建一个Cipher ,通过getInstance()工厂方法来实例化对象cipher ,参数为transformation,即DEC;
(2).对cipher对象初始化,第一个参数为解密模式Cipher.DECRYPT_MODE,第二个参数为加密规则,new一个SecretKeySpec,而它也需要两个参数。第一个参数为**的字节数组,可通过key.getBytes()得到,第二个参数为解密类型,即为“DES”
(3).调用cipher.doFinal()方法进行解密,传入一个参数,使用Base64解码密文,即Base64.decode(encryptDES),返回的是一个字节数组bytes;
(4).最后通过返回return new String (btyes)就ok辣!!!
需要注意的是,往DES解密函数传入的是密文而不是原文哦!!
所以DES加密函数算法需要传的参数是密文s,**key,加密规则transformation,加密类型algorithm
private static String decryptDES(String encryptDES,String key,String transformation, String algorithm)throws Exception{
Cipher cipher = Cipher.getInstance(transformation);
SecretKeySpec secretKeySpec = new SecretKeySpec(key.getBytes(), algorithm);
//解密规则
cipher.init(Cipher.DECRYPT_MODE,secretKeySpec);
byte[] bytes = cipher.doFinal(Base64.decode(encryptDES));
return new String(bytes);
}