3DES(http://baike.baidu.com/view/350958.htm)是DES加密算法的一种模式,它使用3条56位的密钥对数据进行三次加密。数据加密标准(DES)是美国的一种由来已久的加密标准,它使用对称密钥加密法,并于1981年被ANSI组织规范为ANSI X.3.92。DES使用56位密钥和密码块的方法,而在密码块的方法中,文本被分成64位大小的文本块然后再进行加密。比起最初的DES,3DES更为安全。
/**
* 3DES编码
* @param in 待编码值
* @param mode 反馈模式,如“CBC”
* @param padding 填充方案,如“PKCS7Padding”
* @param keyValue 密锁
* @param iv 初始化向量,该值为十六进制字符串
* @return 已编码值
*/
public static byte[] tripleDESEncode(String in, String mode, String padding, String keyValue, String iv) {
Validate.notEmpty(mode);
Validate.notEmpty(padding);
byte[] out = null;
try {
out = in.getBytes(CHARSET);
} catch (UnsupportedEncodingException e) {
logger.error("3DES编码出错!", e);
}
return tripleDES(Cipher.ENCRYPT_MODE, out, mode, padding, keyValue, iv, "3DES编码出错!");
}
/**
* 3DES解码
* @param in 待解码值
* @param mode 反馈模式,如“CBC”
* @param padding 填充方案,如“PKCS7Padding”
* @param keyValue 密锁
* @param iv 初始化向量,该值为十六进制字符串
* @return 已解码值
*/
public static String tripleDESDecode(byte[] in, String mode, String padding, String keyValue, String iv) {
String out = null;
Validate.notEmpty(mode);
Validate.notEmpty(padding);
byte[] value = tripleDES(Cipher.DECRYPT_MODE, in, mode, padding, keyValue, iv, "3DES解码出错!");
try {
out = new String(value, CHARSET);
} catch (UnsupportedEncodingException e) {
logger.error("3DES解码操作,不支持字符集" + CHARSET + "!");
}
return out;
}
/**
*
* 3DES算法
*
* @param opMode 操作模式;Cipher.ENCRYPT_MODE:编码;Cipher.DECRYPT_MODE:解码
* @param in 待编/解码值
* @param mode 反馈模式
* @param padding 填充方案
* @param keyValue 密锁
* @param iv 初始化向量,该值为十六进制字符串
* @param errorTip 错误信息
* @return 已编/解码值
*/
private static byte[] tripleDES(int opMode, byte[] in, String mode, String padding, String keyValue, String iv,
final String errorTip) {
byte[] out = null;
final StringBuilder transformation = new StringBuilder(TRIPLE_DES_ALGORITHM).append("/").append(mode).append(
"/").append(padding);//算法参数
try {
Security.addProvider(new BouncyCastleProvider());
Cipher cipher = Cipher.getInstance(transformation.toString(), TRIPLE_DES_PROVIDER);
Key key = new SecretKeySpec(Hex.decode(keyValue), TRIPLE_DES_ALGORITHM);
AlgorithmParameterSpec params = new IvParameterSpec(Hex.decode(iv));
cipher.init(opMode, key, params);
out = cipher.doFinal(in);
} catch (NoSuchAlgorithmException e) {
logger.error(errorTip, e);
} catch (NoSuchProviderException e) {
logger.error(errorTip, e);
} catch (NoSuchPaddingException e) {
logger.error(errorTip, e);
} catch (InvalidKeyException e) {
logger.error(errorTip, e);
} catch (InvalidAlgorithmParameterException e) {
logger.error(errorTip, e);
} catch (IllegalBlockSizeException e) {
logger.error(errorTip, e);
} catch (BadPaddingException e) {
logger.error(errorTip, e);
}
return out;
}
该方法中的密码获取实例功能代码段——Cipher.getInstance(...),较费时,本地测试大约0.8s。
该方法引用了bcprov-jdk15-145.jar。