DES加密解密是一种比较常用的对称加密算法,即加密和解密使用相同密钥的算法,DES使用一个 56 位的密钥以及附加的 8 位奇偶校验位,产生最大 64 位的分组大小。因为使用56位密钥,以现代机器的计算能力,24小时内即可被破解(现在有了更安全效率更高的AES)。但是在平时安全性要求不是特别高的情景或者是之前的老项目中用的还是很多的。最近在公司项目中网络请求链接用到的就是des加密,下面简单做一个总结。废话不多说直接上代码:
package com.meskal.test;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
import java.security.spec.InvalidKeySpecException;
import java.util.Base64;
import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.NoSuchPaddingException;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.DESKeySpec;
public class DesUtil {
/**
* 加密
*
* @param key
* 密钥(任意字符,密钥长度必须是8的倍数)
* @param data
* 待加密的字符串
* @return 加密后的字符串
*/
public static String encrypt(String code, String str) {
String result = "";
byte[] data = str.getBytes();
// 拿到密钥工厂并利用约定好的加密/解密密钥生成加密用的key
SecretKeyFactory skf;
try {
skf = SecretKeyFactory.getInstance("DES");
DESKeySpec dks = new DESKeySpec(code.getBytes());
SecretKey secretKey = skf.generateSecret(dks);
SecureRandom secureRandom = new SecureRandom();
// 拿到加密工具
Cipher cipher = Cipher.getInstance("DES");
cipher.init(Cipher.ENCRYPT_MODE, secretKey, secureRandom);
// 加密
data = cipher.doFinal(data);
result = Base64.getEncoder().encodeToString(data);
} catch (NoSuchAlgorithmException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InvalidKeyException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InvalidKeySpecException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalBlockSizeException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (BadPaddingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (NoSuchPaddingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return result;
}
/**
* 解密
*
* @param code
* 密钥(任意字符,密钥长度必须是8的倍数)
* @param str
* 待解密字符串
* @return 解密后字符串
*/
public static String decrypt(String code, String str) {
String result = "";
byte[] data = str.getBytes();
try {
// 利用工厂模式生成解密密匙
SecretKeyFactory skf = SecretKeyFactory.getInstance("DES");
DESKeySpec dks = new DESKeySpec(data);
SecretKey secretKey = skf.generateSecret(dks);
SecureRandom secureRandom = new SecureRandom();
Cipher cipher = Cipher.getInstance("DES");
cipher.init(Cipher.DECRYPT_MODE, secretKey, secureRandom);
data = cipher.doFinal(data);
result = Base64.getDecoder().decode(data).toString();
} catch (NoSuchAlgorithmException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InvalidKeyException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InvalidKeySpecException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (NoSuchPaddingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalBlockSizeException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (BadPaddingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return result;
}
}
这就是java中的DES加密解密工具类,在Android中实现类似,只是Base64实现和方法不一样,现在的项目中推荐使用目前最流行的AES加密,等有时间了在撸一下AES吧。