package com.common.util; import java.security.InvalidAlgorithmParameterException; import java.security.InvalidKeyException; import java.security.NoSuchAlgorithmException; import java.security.spec.InvalidKeySpecException; import javax.crypto.BadPaddingException; import javax.crypto.Cipher; import javax.crypto.IllegalBlockSizeException; import javax.crypto.NoSuchPaddingException; import javax.crypto.SecretKey; import javax.crypto.SecretKeyFactory; import javax.crypto.spec.DESKeySpec; import javax.crypto.spec.IvParameterSpec; import com.common.exception.PasswordException; /** * 字符串加密工具类。 * * @author tgl */ public class PasswordUtil { /** * 使用3Des进行加密。 * * @param string 待加密的字符串 * @param key 密钥 * @return 加密后的字符串 * @throws PasswordException 如果发送错误 */ public static String tripleEncrypt(String string, String key) throws PasswordException { if (key.length() >= 48) { byte[] bytK1 = StringUtil.hexString2byteArray(key.substring(0, 16)); byte[] bytK2 = StringUtil.hexString2byteArray(key.substring(16, 32)); byte[] bytK3 = StringUtil.hexString2byteArray(key.substring(32, 48)); byte[] bytP = string.getBytes(); byte[] ep = encrypt(encrypt(encrypt(bytP, bytK1), bytK2), bytK3); return StringUtil.byteArray2HexString(ep); } else { throw new PasswordException("密钥长度错误,无法进行3DES加密"); } } /** * 使用3Des进行解密。 * * @param string 待解密的字符串 * @param key 密钥 * @return 解密后的字符串 * @throws PasswordException 如果发送错误 */ public static String tripleDecrypt(String string, String key) throws PasswordException { if (key.length() >= 48) { byte[] bytK1 = StringUtil.hexString2byteArray(key.substring(0, 16)); byte[] bytK2 = StringUtil.hexString2byteArray(key.substring(16, 32)); byte[] bytK3 = StringUtil.hexString2byteArray(key.substring(32, 48)); byte[] bytP = StringUtil.hexString2byteArray(string); byte[] dp = decrypt(decrypt(decrypt(bytP, bytK3), bytK2), bytK1); return new String(dp); } else { throw new PasswordException("密钥长度错误,无法进行3DES加密"); } } /** * 用密钥进行DES加密。 * * @param bytE 待加密的字节数组 * @param key 密钥 * @return 加密以后的字节数组 * @throws PasswordException 如果发送错误 */ public static byte[] encrypt(byte[] bytP, byte[] key) throws PasswordException { return crypt(bytP, key, Cipher.ENCRYPT_MODE); } /** * 用密钥进行DES解密。 * * @param bytE 待解密的字节数组 * @param key 密钥 * @return 解密以后的字节数组 * @throws PasswordException 如果发送错误 */ public static byte[] decrypt(byte[] bytE, byte[] key) throws PasswordException { return crypt(bytE, key, Cipher.DECRYPT_MODE); } /** * 用密钥进行DES加密解密。 * * @param bytE 待加密解密的字节数组 * @param key 密钥 * @param mode 加密或者解密控制符 * @return 加密解密以后的字节数组 * @throws PasswordException 如果发送错误 */ private static byte[] crypt(byte[] bytP, byte[] key, int mode) throws PasswordException { try { Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding"); DESKeySpec desKeySpec = new DESKeySpec(key); SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES"); SecretKey secretKey = keyFactory.generateSecret(desKeySpec); IvParameterSpec iv = new IvParameterSpec(key); cipher.init(mode, secretKey, iv); return cipher.doFinal(bytP); } catch (NoSuchAlgorithmException e) { throw new PasswordException(e); } catch (NoSuchPaddingException e) { throw new PasswordException(e); } catch (InvalidKeyException e) { throw new PasswordException(e); } catch (InvalidKeySpecException e) { throw new PasswordException(e); } catch (InvalidAlgorithmParameterException e) { throw new PasswordException(e); } catch (BadPaddingException e) { throw new PasswordException(e); } catch (IllegalBlockSizeException e) { throw new PasswordException(e); } } }
最近下载更多
小白queen LV1
2022年12月22日
xxxxsssss LV1
2020年3月28日
xuyongff LV24
2019年11月4日
qq1824250669 LV1
2019年8月26日
maojingxin LV1
2019年5月15日
czp1068894 LV8
2018年6月2日
wenMN1994 LV13
2017年11月4日
你高冷1 LV1
2017年10月11日
xiao_cui LV1
2017年8月11日
ooeel LV12
2015年8月28日
最近浏览更多
uid0901 LV2
3月14日
微信网友_6486629696049152
2023年5月22日
暂无贡献等级
月之氏族 LV23
2023年5月16日
wuziayng1232 LV10
2023年2月20日
小白queen LV1
2022年12月22日
熊猫烧香 LV1
2022年7月16日
3199625134 LV10
2022年4月23日
ljl1129 LV2
2022年2月20日
你脚上银铃响了 LV1
2021年10月27日
kuangrezhi
2021年6月28日
暂无贡献等级