JAVA實現DES的ECB/CBC的加密算法

1.在這裏先說下關於DES算法的ECB模式,單DES加密需要的密鑰長度必須是8個字節,則就是長度爲16的十六進制字符串,下面自是其中的一種方式
public static String encrypt(String key, String data) {
// 將傳過來的key和data轉換爲byte型
byte[] bKey = HexConversionUtil.hexToByte(key);
int k = 0;
byte[] bData = HexConversionUtil.hexToByte(data);
String ds = “”;
// 創建一個DESKeySpec對象
SecretKeySpec spec = new SecretKeySpec(bKey, “DES”);
// Cipher對象實際完成加密操作
try {
Cipher cipher = Cipher.getInstance(“DES/ECB/NoPadding”);
// 實例化cipher
cipher.init(Cipher.ENCRYPT_MODE, spec);
// 真正的開始加密
byte[] cData = cipher.doFinal(bData);
// 將加密後的數據,轉化爲16進制
ds = HexConversionUtil.Bytes2HexString(cData);
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
} catch (NoSuchPaddingException e) {
e.printStackTrace();
} catch (InvalidKeyException e) {
e.printStackTrace();
} catch (IllegalBlockSizeException e) {
e.printStackTrace();
} catch (BadPaddingException e) {
e.printStackTrace();
}
return ds;
}
2.接下來,我將的是ECB模式的3DES算法,這個算法密鑰長度爲24字節,其中,16字節的密鑰是將前面的8個字節截取出來做後面8個字節,比如:00112233445566778899AABBCCDDEEFF就是將0011223344556677截取出來做後面8字節密鑰的。
而且,該算法是就是通過前面8字節(0011223344556677),先進行ECB模式的加密;
在用8899AABBCCDDEEFF這8位進行,ECB模式的解密;
最後在用0011223344556677進行ECB模式的加密。
public static String threeECBEncrypt(String key, String data){
data = encrypt(key.substring(0,16), data);
data = decrypt(key.substring(16), data);
data = encrypt(key.substring(0,16), data);
return data;
}
3.在這裏附上ECB模式的解密算法,其實和加密算法沒有太大的區別
public static String decrypt(String key, String data) {
// 將傳過來的key和data轉換爲byte型
byte[] bKey = HexConversionUtil.hexToByte(key);
int k = 0;
byte[] bData = HexConversionUtil.hexToByte(data);
String ds = “”;
// 創建一個DESKeySpec對象
SecretKeySpec spec = new SecretKeySpec(bKey, “DES”);
// Cipher對象實際完成加密操作
try {
Cipher cipher = Cipher.getInstance(“DES/ECB/NoPadding”);
// 實例化cipher,這裏的Cipher.DECRYPT_MODE=2
cipher.init(Cipher.DECRYPT_MODE, spec);
// 真正的開始解密
byte[] cData = cipher.doFinal(bData);
// 將加密後的數據,轉化爲16進制
ds = HexConversionUtil.Bytes2HexString(cData);
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
} catch (NoSuchPaddingException e) {
e.printStackTrace();
} catch (InvalidKeyException e) {
e.printStackTrace();
} catch (IllegalBlockSizeException e) {
e.printStackTrace();
} catch (BadPaddingException e) {
e.printStackTrace();
}
return ds;
}
4.現在開始說CBC模式的加密算法,3DES,該模式的算法不向ECB模式的3DES算法,加密數據之間有聯繫,ECB可以將數據分割後,使用加密算法後,拼接起來,與數據一起加密結果不變。具體實現如下:
public static String threeEncrypt(String key, String data) {
byte[] start = new byte[8];
//這裏必須將16字節的密鑰變爲24字節的密鑰,方法如ECB的處理方法一樣
if (key.length() == 32) {
key = key +key.substring(0,16);
}
// 將傳過來的key和data轉換爲byte型
byte[] bKey = HexConversionUtil.hexToByte(key);
int k = 0;
byte[] bData = HexConversionUtil.hexToByte(data);
String ds = “”;
// 創建一個DESKeySpec對象
SecretKeySpec spec = new SecretKeySpec(bKey, “DESede”);
// Cipher對象實際完成加密操作
try {
Cipher cipher = Cipher.getInstance(“DESede/CBC/NoPadding”);//三DES算法這裏必須使用DESede,單DES可以使用DES但必須是ECB模式
// 實例化cipher
cipher.init(Cipher.ENCRYPT_MODE, spec,new IvParameterSpec(start));
// 真正的開始加密
byte[] cData = cipher.doFinal(bData);
// 將加密後的數據,轉化爲16進制
ds = HexConversionUtil.Bytes2HexString(cData);
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
} catch (NoSuchPaddingException e) {
e.printStackTrace();
} catch (InvalidKeyException e) {
e.printStackTrace();
} catch (IllegalBlockSizeException e) {
e.printStackTrace();
} catch (BadPaddingException e) {
e.printStackTrace();
} catch (InvalidAlgorithmParameterException e) {
e.printStackTrace();
}
return ds;
}
好了,我就把JAVA DES相關的加密算法寫到這裏,下次寫RSA的算法,這個算法比較麻煩,當然用起來不麻煩,關鍵是有些細節,別人都沒有說,下次我將詳細說說RSA算法使用的一些細節。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章