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);就可以了,此外就是密鑰長度不同了。後面有空再分析加密原理和性能