作者:玄夜 时间:2018-8-31
前言
算法,永不过时!
· 简介
DES全称为Data Encryption Standard,即数据加密标准,是一种使用密钥加密的块算法,1977年被美国联邦政府的国家标准局确定为联邦资料处理标准(FIPS),并授权在非密级政府通信中使用,随后该算法在国际上广泛流传开来。需要注意的是,在某些文献中,作为算法的DES称为数据加密算法(Data Encryption Algorithm,DEA),已与作为标准的DES区分开来(百度百科抄的)。
· 常用加密模式
ECB:电子密本模式
CBC:密文分组链接模式
CTR:计算器模式
CFB:加密反馈模式
OFB:输出反馈模式
· 填充方式
我看了很多的文章,但是很多都没有详细写上填充方式啊、偏移量什么的,只是简单的将代码贴出来,很容易看得稀里糊涂的,一时心血来潮,就自己也来整理一份了。
NoPadding:不填充
PKCS5Padding:缺几个字节就补充几个字节的几;
PKCS7Padding:缺几个字节就补几个字节的0;
ISO10126Padding:填充字符串由一个字节序列组成,此字节序列的最后一个字节填充字节序列的长度,其余字节填充随机数据;
java当中支持NoPadding、PKCS5Padding(默认)、ISO10126Padding;
· 偏移量
概念就不多解释了,在java的IvParameterSpec中,偏移量必须是8位的,否则直接报错
· 干货
这里重点讲下CBC模式,其他的就不一一讲了,自己可以换下参数:
1、第一步,将数据按照8个字节一组进行分组,A1A2...An,分组不是8的整数倍那就要用到数据填充了;
2、第一组数据A1与向量I异或后的结果进行DES加密得到第一组密文B1(向量I,也叫偏移量,ECB模式是没有的;如果明文中有两个分组的内容相同,ECB会得到完全一样的密文,但CBC则不会);
3、第二组数据A2与第一组的加密结果B1异或以后的结果进行DES加密,得到第二组密文B2,如此类推,把数据串起来最后得到的B1B2B3......Bn就是加密结果。
· 工具类
public class DES {
// 对称加密,这里不用在意为什么写了两行,都是一样的,
private static String encryptKey = "6c12b11d";
private static String decryptKey = "6c12b11d";
// 向量/偏移量
private static String ivStr = "166290ac";
private static byte[] iv = ivStr.getBytes();
//加密
public static String encryptDES(String encryptString) throws Exception {
IvParameterSpec zeroIv = new IvParameterSpec(iv);
SecretKeySpec key = new SecretKeySpec(encryptKey.getBytes(), "DES");
Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding");
cipher.init(Cipher.ENCRYPT_MODE, key, zeroIv);
byte[] encryptedData = cipher.doFinal(encryptString.getBytes());
return Base64.encode(encryptedData);
}
//解密
public static String decryptDES(String decryptString) throws Exception {
byte[] byteMi = new Base64().decode(decryptString);
IvParameterSpec zeroIv = new IvParameterSpec(iv);
SecretKeySpec key = new SecretKeySpec(decryptKey.getBytes(), "DES");
Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding");
cipher.init(Cipher.DECRYPT_MODE, key, zeroIv);
byte decryptedData[] = cipher.doFinal(byteMi);
return new String(decryptedData);
}
}
复制代码
· 执行代码
String text = "中华人民共和国万岁!!!";
String result1 = DES.encryptDES(text);
String result2 = DES.decryptDES(result1);
System.out.println(result1);
System.out.println(result2);
复制代码