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。