编解码工具类——3DES算法

     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。

你可能感兴趣的:(算法,Security)