public class DesUtil {
//向量 可与字符串互转,比如这个数组转字符串就是"1234567890abcdef"
private static byte[] iv = { 0x12, 0x34, 0x56, 0x78, (byte) 0x90,
(byte) 0xAB, (byte) 0xCD, (byte) 0xEF };
public static String decode(String key, String aaa) throws Exception {
try {
byte[] byteMi = Base64Utils.decode(aaa);
//DESKeySpec 有两个构造函数:
//DESKeySpec(byte[] key) 创建一个 DESKeySpec 对象,使用 key 中的前 8 个字节作为 DES 密钥的密钥内容。
//DESKeySpec(byte[] key, int offset) 创建一个 DESKeySpec 对象,使用 key 中始于且包含 offset 的前 8 个字节作为 DES-EDE 密钥的密钥内容。
//也就是说你不管多长的key,这步之后,只留前8位了
DESKeySpec dks = new DESKeySpec(key.getBytes("utf-8"));
//私密密钥工厂,用来将密钥(类型Key的不透明加密密钥)转换为密钥规范,反之亦然
//只对秘密(对称)密钥进行操作
SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
// 根据提供的密钥规范(密钥材料)生成 SecretKey 对象。
//返回:秘密密钥
//抛出: InvalidKeySpecException - 如果给定密钥规范不适合生成秘密密钥的秘密密钥工厂
Key secretKey = keyFactory.generateSecret(dks);
//针对加解密的密码cipher功能:Cipher.getInstance("算法/模式/填充方式")
Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding");
//使用iv中的字节创建一个IvParameterSpec对象
IvParameterSpec iv1 = new IvParameterSpec(iv);
//加密参数的(透明)规范。此接口不包含任何方法或常量。仅用于将所有参数规范分组,并为其提供类型安全。所有参数规范都必须实现此接口
AlgorithmParameterSpec paramSpec = iv1;
//用密钥和一组算法参数初始化此cipher
cipher.init(Cipher.DECRYPT_MODE, secretKey, paramSpec);
//按单部分操作加密或解密数据,或者结束一个多部分操作
byte[] bytes = cipher.doFinal(byteMi);
return new String(bytes, "utf-8");
} catch (Exception e) {
throw new Exception(e);
}
}
/**
* DES算法,加密
*
* @param data 待加密字符串
* @param key 加密私钥,长度不能够小于8位
* @return 加密后的字节数组,一般结合Base64编码使用
* @throws CryptException 异常
*/
public static String encode(String key,String data) throws Exception
{
try
{
DESKeySpec dks = new DESKeySpec(key.getBytes("utf-8"));
SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
//key的长度不能够小于8位字节
Key secretKey = keyFactory.generateSecret(dks);
Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding");
IvParameterSpec iv1 = new IvParameterSpec(iv);
AlgorithmParameterSpec paramSpec = iv1;
cipher.init(Cipher.ENCRYPT_MODE, secretKey,paramSpec);
byte[] bytes = cipher.doFinal(data.getBytes("utf-8"));
return Base64Utils.encode(bytes);
} catch (Exception e)
{
throw new Exception(e);
}
}
}
等下会再写一篇基于以上内容的 鸿蒙版的DES加解密>>>