DES属对称加密——块加密,现在基本不用了,但也没规定不准用了,学学没坏处。你写了放在什么工程实践里,简直酷毙了。
- 密码体系包括明文空间、密文空间、密钥空间、加密算法、解密算法(记住这几个,看参数会理解地容易些)。
- 本代码可再做优化,加密解密只是参数不同,但分开写有利于学习。
- 密钥生成算法没有写,毕竟现在都不用了,而且密钥规定8字节,学习学习就够了,不用深究。
- 解密部分最后结果必须用new String处理返回,用toString和Awarry的string转换是不行的,具体原因回头在另一片文章里写清楚。【toString与new String】
- Base64的具体知识也在另一篇文章里写。base64笔记
代码
package DES;
import com.sun.org.apache.xerces.internal.impl.dv.util.Base64;
import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.NoSuchPaddingException;
import javax.crypto.spec.SecretKeySpec;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
/**
* @创建人
* @创建时间
* @描述 对称加密——DES加密
*/
public class DES {
/**
* DES加密
* @param input 明文
* @param key 秘钥 必须为8字节
* @param transformation 算法
* @param algorthm 加密类型
* @return 经过base64编码处理过的密文,
* base64编码处理的原因:加密后为字节数组,不一定存在于asscii表中,
* 譬如,可能加密后的字节中有-66,此字符在表中不存在
*/
private static String encryptDES(String input, String key, String transformation, String algorthm)
throws NoSuchPaddingException, NoSuchAlgorithmException, InvalidKeyException, BadPaddingException, IllegalBlockSizeException {
//获取Java加密操作的对象Cipher
Cipher cipher = Cipher.getInstance(transformation);
//创建加密规则 参数:秘钥的字节,加密类型
SecretKeySpec secretKeySpec = new SecretKeySpec(key.getBytes(),algorthm);
//调用cipher对象初始化加密模式和算法
//Cipher.ENCRYPT_MODE 为加密模式
//Cipher.DECRYPT_MODE 为解密模式
cipher.init(Cipher.ENCRYPT_MODE,secretKeySpec);
//执行加密操作 返回的是字节数组
byte[] bytes = cipher.doFinal(input.getBytes());
String encode = Base64.encode(bytes);
return encode;
}
/**
* DES解密
* @param encryptDES 密文
* @param key 密钥 必须为8字节
* @param transformation 加密算法
* @param algoryhm 加密类型
* @return 明文字符串
*/
private static String decryptDES(String encryptDES,String key,String transformation,String algoryhm)
throws NoSuchPaddingException, NoSuchAlgorithmException, InvalidKeyException, BadPaddingException, IllegalBlockSizeException {
Cipher cipher = Cipher.getInstance(transformation);
SecretKeySpec secretKeySpec = new SecretKeySpec(key.getBytes(),algoryhm);
cipher.init(Cipher.DECRYPT_MODE,secretKeySpec);
byte[] decode = Base64.decode(encryptDES); //加密时得到的密文是base64编码处理后的字符串
byte[] bytes = cipher.doFinal(decode);
return new String(bytes); //返回值必须是new String处理的字节数组
}
public static void main(String[] args) throws IllegalBlockSizeException, InvalidKeyException, BadPaddingException, NoSuchAlgorithmException, NoSuchPaddingException {
String input = "作曲 : LTN乐队\n" + "\n" + "作词 : LTN乐队\n" + "\n" + "她曾这样穷尽一生\n" + "\n" +
"劝告人们不必认真\n" + "\n" + "那还在回想的爱\n" + "\n" + "深沉\n" + "\n" + "他仍然在倾尽所能\n" +
"\n" + "装满自己失落灵魂\n" + "\n" + "那还在远处的路\n" + "\n" + "清醒\n" + "\n" + "把不带走的已丢尽\n" +
"\n" + "孑然乞讨一丝惊喜\n" + "\n" + "崎岖伴游戏伴四季\n" + "\n" + "聚散存于\n" + "\n" + "失之交臂\n" +
"\n" + "走吧 aaa~\n" + "\n" + "走吧 aaa~\n" + "\n" + " \n" + "\n" + "走吧 haa~\n" + "\n" +
"走吧 haa~\n" + "\n" + " \n" + "\n" + "作词:BAIGANG\n" + "\n" + "作曲:BAIGANG\n" + "\n" +
"编曲:LTN乐队/袁志鹏\n" + "\n" + "混音师:王晨雨\n" + "\n" + "出品方:众乐纪\n";
String key = "12345678";
String transformation = "DES";
String algorthm = "DES";
System.out.println("原文是:" + input);
String encryptDES = encryptDES(input,key,transformation,algorthm);
System.out.println("密文是:" + encryptDES);
String decryptDES = decryptDES(encryptDES,key,transformation,algorthm);
System.out.println("解密后原文是:" + decryptDES);
}
}