JAVA加密系列(二)- 对称加密算法 DES、AES
采用单钥密码系统的加密方法,同一个密钥可以同时用作信息的加密和解密,这种加密方法称为对称加密,也称为单密钥加密。
算法介绍
常见算法
- DES(Data Encryption Standard):数据加密标准,速度较快,适用于加密大量数据的场合;
- 3DES(Triple DES):是基于DES,对一块数据用三个不同的密钥进行三次加密,强度更高;
- AES(Advanced Encryption Standard):高级加密标准,是下一代的加密算法标准,速度快,安全级别高,支持128、192、256、512位密钥的加密;
算法特征
- 加密方和解密方使用同一个密钥;
- 加密解密的速度比较快,适合数据比较长时的使用;
- 密钥传输的过程不安全,且容易被破解,密钥管理也比较麻烦;
加密模式
- ECB:电子密本模式
- CBC:密文分组链接模式
- CTR:计算器模式
- CFB:加密反馈模式
- OFB:输出反馈模式
填充方式
- NoPadding:不填充
- PKCS5Padding:缺几个字节就补充几个字节的几
- PKCS7Padding:缺几个字节就补几个字节的0
- ISO10126Padding:填充字符串由一个字节序列组成,此字节序列的最后一个字节填充字节序列的长度,其余字节填充随机数据
java当中支持NoPadding、PKCS5Padding(默认)、ISO10126Padding;
DES
DES-Data Encryption Standard,即数据加密算法。是IBM公司于1975年研究成功并公开发表的。DES算法的入口参数有三个:Key、Data、Mode。其中Key为8个字节共64位,是DES算法的工作密钥;Data也为8个字节64位,是要被加密或被解密的数据;Mode为DES的工作方式,有两种:加密或解密。 DES算法把64位的明文输入块变为64位的密文输出块,它所使用的密钥也是64位。
工具类
public class DESUtil {
//必须8位 否则会报错 偏移量
private static String IV = "12345678";
//钥匙 必须8位
private static String KEY = "87654321";
public static void main(String[] args) {
//字符串编码
System.out.println("编码结果:" + encrypt("hello word"));
//字符串解码
System.out.println("编码结果:" + decrypt("iug3JXsgvoWaRv0QF3cODw=="));
}
//加密
public static String encrypt(String str) {
try {
byte[] bytes = str.getBytes();
IvParameterSpec ivParameterSpec = new IvParameterSpec(IV.getBytes());
SecretKeySpec secretKeySpec = new SecretKeySpec(KEY.getBytes(), "DES");
Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding");
cipher.init(Cipher.ENCRYPT_MODE, secretKeySpec, ivParameterSpec);
bytes = cipher.doFinal(bytes);
bytes = Base64.getEncoder().encode(bytes);
return new String(bytes);
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
//解密
public static String decrypt(String str) {
try {
byte[] bytes = Base64.getDecoder().decode(str);
IvParameterSpec ivParameterSpec = new IvParameterSpec(IV.getBytes());
SecretKeySpec secretKeySpec = new SecretKeySpec(KEY.getBytes(), "DES");
Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding");
cipher.init(Cipher.DECRYPT_MODE, secretKeySpec, ivParameterSpec);
bytes = cipher.doFinal(bytes);
return new String(bytes);
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
}
log
编码结果:iug3JXsgvoWaRv0QF3cODw==
编码结果:hello word
AES
密码学中的高级加密标准(Advanced Encryption Standard,AES),又称Rijndael加密法,是美国联邦政府采用的一种区块加密标准。这个标准用来替代原先的DES,已经被多方分析且广为全世界所使用。
工具类
public class AESUtil {
//必须16位 否则会报错 偏移量
private static String IV ="asdfgh1234567890";
//钥匙 必须16位
private static String KEY = "1234567890asdfgh";
public static void main(String[] args) {
//字符串编码
System.out.println("编码结果:" + encrypt("hello word"));
//字符串解码
System.out.println("编码结果:" + decrypt("UePyU9tACUkzOEHYFMUsNg=="));
}
//加密
public static String encrypt(String str) {
try {
byte[] bytes = str.getBytes();
IvParameterSpec ivParameterSpec = new IvParameterSpec(IV.getBytes());
SecretKeySpec secretKeySpec = new SecretKeySpec(KEY.getBytes(), "AES");
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
cipher.init(Cipher.ENCRYPT_MODE, secretKeySpec, ivParameterSpec);
bytes = cipher.doFinal(bytes);
bytes = Base64.getEncoder().encode(bytes);
return new String(bytes);
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
//解密
public static String decrypt(String str) {
try {
byte[] bytes = Base64.getDecoder().decode(str);
IvParameterSpec ivParameterSpec = new IvParameterSpec(IV.getBytes());
SecretKeySpec secretKeySpec = new SecretKeySpec(KEY.getBytes(), "AES");
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
cipher.init(Cipher.DECRYPT_MODE, secretKeySpec, ivParameterSpec);
bytes = cipher.doFinal(bytes);
return new String(bytes);
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
}
log
编码结果:UePyU9tACUkzOEHYFMUsNg==
编码结果:hello word
总结
java多各种加密算法都有封装,其实DES有很多同胞兄弟,如DESede(TripleDES)、AES、Blowfish、RC2、RC4(ARCFOUR)。这里就不过多阐述了,大同小异,只要换掉ALGORITHM换成对应的值,同时做一个代码替换SecretKey secretKey = new SecretKeySpec(key, ALGORITHM);就可以了,此外就是密钥长度不同了。后面有空再分析加密原理和性能
网友评论