作者:玄夜 時間: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);
複製程式碼