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算法使用的一些细节。

你可能感兴趣的:(JAVACARD,JAVA)