三、DES解密
idea中使用 ctrl + alt + m 快捷键抽取代码
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; /** * @author JsonHao😋 * @date 2020年9月11日 下午9:22:52 */ public class DesDemo { // DES加密算法,key的大小必须是8个字节 public static void main(String[] args) throws Exception { String input ="硅谷"; // DES加密算法,key的大小必须是8个字节 String key = "12345678"; String transformation = "DES"; // 9PQXVUIhaaQ= // 指定获取密钥的算法 String algorithm = "DES"; String encryptDES = encryptDES(input, key, transformation, algorithm); System.out.println("加密:" + encryptDES); String s = decryptDES(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: 解密模式 // 初始化加密模式和算法 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 decryptDES(String input, String key, String transformation, String algorithm) throws Exception { // 1,获取Cipher对象 Cipher cipher = Cipher.getInstance(transformation); // 指定密钥规则 SecretKeySpec sks = new SecretKeySpec(key.getBytes(), algorithm); cipher.init(Cipher.DECRYPT_MODE, sks); // 3. 解密,上面使用的base64编码,下面直接用密文 byte[] bytes = cipher.doFinal(Base64.decode(input)); // 因为是明文,所以直接返回 return new String(bytes); } }
四、base64补等号测试
package com.atguigu; import com.sun.org.apache.xml.internal.security.utils.Base64; /** * @author JsonHao😋 * @date 2020年9月11日 下午9:30:20 */ public class TestBase64 { public static void main(String[] args) { // 1:MQ== 表示一个字节,不够三个字节,所以需要后面通过 == 号补齐 System.out.println(Base64.encode("1".getBytes())); System.out.println(Base64.encode("12".getBytes())); System.out.println(Base64.encode("123".getBytes())); // // 硅谷:中文占6个字节,6 * 8 = 48 ,刚刚好被整除,所以没有等号 System.out.println(Base64.encode("硅谷".getBytes())); } }
五、AES加密解密
AES 加密解密和 DES 加密解密代码一样,只需要修改加密算法就行,拷贝 ESC 代码
package com.atguigu.desaes; import com.sun.org.apache.xml.internal.security.utils.Base64; import javax.crypto.Cipher; import javax.crypto.spec.SecretKeySpec; /** * @author JsonHao😋 * @date 2020年9月11日 下午9:34:48 */ public class AesDemo { // DES加密算法,key的大小必须是8个字节 public static void main(String[] args) throws Exception { String input ="硅谷"; // AES加密算法,比较高级,所以key的大小必须是16个字节 String key = "1234567812345678"; String transformation = "AES"; // 9PQXVUIhaaQ= // 指定获取密钥的算法 String algorithm = "AES"; // 先测试加密,然后在测试解密 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: 解密模式 // 初始化加密模式和算法 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); cipher.init(Cipher.DECRYPT_MODE, sks); // 3. 解密 byte[] bytes = cipher.doFinal(Base64.decode(input)); return new String(bytes); } }
运行结果是
MM#WLAN#Uc+9lGbR6e5N9hrtm7CA+A==#646465698#399900003000 [B@1540e19d
哪一个是正确的?为什么?
这里应该用new String()的方法,因为Base64加解密是一种转换编码格式的原理
toString()与new String ()用法区别
str.toString是调用了这个object对象的类的toString方法。一般是返回这么一个String:[class name]@[hashCode]
new String(str)是根据parameter是一个字节数组,使用java虚拟机默认的编码格式,将这个字节数组decode为对应的字符。若虚拟机默认的编码格式是ISO-8859-1,按照ascii编码表即可得到字节对应的字符。
什么时候用什么方法呢?
new String()一般使用字符转码的时候,byte[]数组的时候
toString()对象打印的时候使用