123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461 |
- //package com.ylzb.fjsdermyy.modules.settleaccounts.util;
- //
- //import sun.misc.BASE64Decoder;
- //import sun.misc.BASE64Encoder;
- //
- //import javax.crypto.BadPaddingException;
- //import javax.crypto.Cipher;
- //import javax.crypto.IllegalBlockSizeException;
- //import javax.crypto.NoSuchPaddingException;
- //import javax.crypto.spec.SecretKeySpec;
- //import java.io.IOException;
- //import java.io.UnsupportedEncodingException;
- //import java.security.InvalidKeyException;
- //import java.security.NoSuchAlgorithmException;
- //
- ///**
- // * @Description: AES算法封装
- // */
- //public class AesUtil {
- //
- // /**
- // * 加密算法
- // */
- // private static final String ENCRY_ALGORITHM = "AES";
- //
- // /**
- // * 加密算法/加密模式/填充类型
- // * 本例采用AES加密,ECB加密模式,PKCS5Padding填充
- // */
- // private static final String CIPHER_MODE = "AES/CBC/PKCS5Padding";
- //
- // /**
- // * 设置iv偏移量
- // * 本例采用ECB加密模式,不需要设置iv偏移量
- // */
- // private static final String IV_ = "0102030405060708";
- //
- // /**
- // * 设置加密字符集
- // * 本例采用 UTF-8 字符集
- // */
- // private static final String CHARACTER = "UTF-8";
- //
- // /**
- // * 设置加密密码处理长度。
- // * 不足此长度补0;
- // */
- // private static final int PWD_SIZE = 16;
- //
- // /**
- // * 密码处理方法
- // * 如果加解密出问题,
- // * 请先查看本方法,排除密码长度不足填充0字节,导致密码不一致
- // * @param password 待处理的密码
- // * @return
- // * @throws UnsupportedEncodingException
- // */
- // private static byte[] pwdHandler(String password) throws UnsupportedEncodingException {
- // byte[] data = null;
- // if (password != null) {
- // byte[] bytes = password.getBytes(CHARACTER);
- // if (password.length() < PWD_SIZE) {
- // System.arraycopy(bytes, 0, data = new byte[PWD_SIZE], 0, bytes.length);
- // } else {
- // data = bytes;
- // }
- // }
- // return data;
- // }
- //
- // //======================>原始加密<======================
- //
- // /**
- // * 原始加密
- // * @param clearTextBytes 明文字节数组,待加密的字节数组
- // * @param pwdBytes 加密密码字节数组
- // * @return 返回加密后的密文字节数组,加密错误返回null
- // */
- // public static byte[] encrypt(byte[] clearTextBytes, byte[] pwdBytes) {
- // try {
- // // 1 获取加密密钥
- // SecretKeySpec keySpec = new SecretKeySpec(pwdBytes, ENCRY_ALGORITHM);
- //
- // // 2 获取Cipher实例
- // Cipher cipher = Cipher.getInstance(CIPHER_MODE);
- //
- // // 查看数据块位数 默认为16(byte) * 8 =128 bit
- //// System.out.println("数据块位数(byte):" + cipher.getBlockSize());
- //
- // // 3 初始化Cipher实例。设置执行模式以及加密密钥
- // cipher.init(Cipher.ENCRYPT_MODE, keySpec);
- //
- // // 4 执行
- // byte[] cipherTextBytes = cipher.doFinal(clearTextBytes);
- //
- // // 5 返回密文字符集
- // return cipherTextBytes;
- //
- // } catch (NoSuchPaddingException e) {
- // e.printStackTrace();
- // } catch (NoSuchAlgorithmException e) {
- // e.printStackTrace();
- // } catch (BadPaddingException e) {
- // e.printStackTrace();
- // } catch (IllegalBlockSizeException e) {
- // e.printStackTrace();
- // } catch (InvalidKeyException e) {
- // e.printStackTrace();
- // } catch (Exception e) {
- // e.printStackTrace();
- // }
- // return null;
- // }
- //
- // /**
- // * 原始解密
- // * @param cipherTextBytes 密文字节数组,待解密的字节数组
- // * @param pwdBytes 解密密码字节数组
- // * @return 返回解密后的明文字节数组,解密错误返回null
- // */
- // public static byte[] decrypt(byte[] cipherTextBytes, byte[] pwdBytes) {
- //
- // try {
- // // 1 获取解密密钥
- // SecretKeySpec keySpec = new SecretKeySpec(pwdBytes, ENCRY_ALGORITHM);
- //
- // // 2 获取Cipher实例
- // Cipher cipher = Cipher.getInstance(CIPHER_MODE);
- //
- // // 查看数据块位数 默认为16(byte) * 8 =128 bit
- //// System.out.println("数据块位数(byte):" + cipher.getBlockSize());
- //
- // // 3 初始化Cipher实例。设置执行模式以及加密密钥
- // cipher.init(Cipher.DECRYPT_MODE, keySpec);
- //
- // // 4 执行
- // byte[] clearTextBytes = cipher.doFinal(cipherTextBytes);
- //
- // // 5 返回明文字符集
- // return clearTextBytes;
- //
- // } catch (NoSuchAlgorithmException e) {
- // e.printStackTrace();
- // } catch (InvalidKeyException e) {
- // e.printStackTrace();
- // } catch (NoSuchPaddingException e) {
- // e.printStackTrace();
- // } catch (BadPaddingException e) {
- // e.printStackTrace();
- // } catch (IllegalBlockSizeException e) {
- // e.printStackTrace();
- // } catch (Exception e) {
- // e.printStackTrace();
- // }
- // // 解密错误 返回null
- // return null;
- // }
- //
- // //======================>BASE64<======================
- //
- // /**
- // * BASE64加密
- // * @param clearText 明文,待加密的内容
- // * @param password 密码,加密的密码
- // * @return 返回密文,加密后得到的内容。加密错误返回null
- // */
- // public static String encryptBase64(String clearText, String password) {
- // try {
- // // 1 获取加密密文字节数组
- // byte[] cipherTextBytes = encrypt(clearText.getBytes(CHARACTER), pwdHandler(password));
- //
- // // 2 对密文字节数组进行BASE64 encoder 得到 BASE6输出的密文
- // BASE64Encoder base64Encoder = new BASE64Encoder();
- // String cipherText = base64Encoder.encode(cipherTextBytes);
- //
- // // 3 返回BASE64输出的密文
- // return cipherText;
- // } catch (UnsupportedEncodingException e) {
- // e.printStackTrace();
- // } catch (Exception e) {
- // e.printStackTrace();
- // }
- // // 加密错误 返回null
- // return null;
- // }
- //
- // /**
- // * BASE64解密
- // * @param cipherText 密文,带解密的内容
- // * @param password 密码,解密的密码
- // * @return 返回明文,解密后得到的内容。解密错误返回null
- // */
- // public static String decryptBase64(String cipherText, String password) {
- // try {
- // // 1 对 BASE64输出的密文进行BASE64 decodebuffer 得到密文字节数组
- // BASE64Decoder base64Decoder = new BASE64Decoder();
- // byte[] cipherTextBytes = base64Decoder.decodeBuffer(cipherText);
- //
- // // 2 对密文字节数组进行解密 得到明文字节数组
- // byte[] clearTextBytes = decrypt(cipherTextBytes, pwdHandler(password));
- //
- // // 3 根据 CHARACTER 转码,返回明文字符串
- // return new String(clearTextBytes, CHARACTER);
- // } catch (UnsupportedEncodingException e) {
- // e.printStackTrace();
- // } catch (IOException e) {
- // e.printStackTrace();
- // } catch (Exception e) {
- // e.printStackTrace();
- // }
- // // 解密错误返回null
- // return null;
- // }
- //
- // //======================>HEX<======================
- //
- // /**
- // * HEX加密
- // * @param clearText 明文,待加密的内容
- // * @param password 密码,加密的密码
- // * @return 返回密文,加密后得到的内容。加密错误返回null
- // */
- // public static String encryptHex(String clearText, String password) {
- // try {
- // // 1 获取加密密文字节数组
- // byte[] cipherTextBytes = encrypt(clearText.getBytes(CHARACTER), pwdHandler(password));
- //
- // // 2 对密文字节数组进行 转换为 HEX输出密文
- // String cipherText = byte2hex(cipherTextBytes);
- //
- // // 3 返回 HEX输出密文
- // return cipherText;
- // } catch (UnsupportedEncodingException e) {
- // e.printStackTrace();
- // } catch (Exception e) {
- // e.printStackTrace();
- // }
- // // 加密错误返回null
- // return null;
- // }
- //
- // /**
- // * HEX解密
- // * @param cipherText 密文,带解密的内容
- // * @param password 密码,解密的密码
- // * @return 返回明文,解密后得到的内容。解密错误返回null
- // */
- // public static String decryptHex(String cipherText, String password) {
- // try {
- // // 1 将HEX输出密文 转为密文字节数组
- // byte[] cipherTextBytes = hex2byte(cipherText);
- //
- // // 2 将密文字节数组进行解密 得到明文字节数组
- // byte[] clearTextBytes = decrypt(cipherTextBytes, pwdHandler(password));
- //
- // // 3 根据 CHARACTER 转码,返回明文字符串
- // return new String(clearTextBytes, CHARACTER);
- // } catch (UnsupportedEncodingException e) {
- // e.printStackTrace();
- // } catch (Exception e) {
- // e.printStackTrace();
- // }
- // // 解密错误返回null
- // return null;
- // }
- //
- // /*字节数组转成16进制字符串 */
- // public static String byte2hex(byte[] bytes) { // 一个字节的数,
- // StringBuffer sb = new StringBuffer(bytes.length * 2);
- // String tmp = "";
- // for (int n = 0; n < bytes.length; n++) {
- // // 整数转成十六进制表示
- // tmp = (java.lang.Integer.toHexString(bytes[n] & 0XFF));
- // if (tmp.length() == 1) {
- // sb.append("0");
- // }
- // sb.append(tmp);
- // }
- // return sb.toString().toUpperCase(); // 转成大写
- // }
- //
- // /*将hex字符串转换成字节数组 */
- // private static byte[] hex2byte(String str) {
- // if (str == null || str.length() < 2) {
- // return new byte[0];
- // }
- // str = str.toLowerCase();
- // int l = str.length() / 2;
- // byte[] result = new byte[l];
- // for (int i = 0; i < l; ++i) {
- // String tmp = str.substring(2 * i, 2 * i + 2);
- // result[i] = (byte) (Integer.parseInt(tmp, 16) & 0xFF);
- // }
- // return result;
- // }
- //
- // public static void main(String[] args) {
- // String test = encryptHex("test", "1234567800000000");
- // System.out.println(test);
- //
- // System.out.println(decryptHex(test, "1234567800000000"));
- // }
- //}
- package com.yihu.jw.utils;
- /**
- * Created by hdwang on 2019/1/17.
- */
- import org.slf4j.Logger;
- import org.slf4j.LoggerFactory;
- import javax.crypto.Cipher;
- import javax.crypto.spec.IvParameterSpec;
- import javax.crypto.spec.SecretKeySpec;
- /**
- * 加密工具类
- */
- public class AesUtil {
- private static final Logger logger = LoggerFactory.getLogger(AesUtil.class);
- private static final String KEY_ALGORITHM = "AES";
- /**
- * 默认的加密算法
- */
- public static final String DEFAULT_CIPHER_ALGORITHM = "AES/CBC/PKCS5Padding";
- /**
- * AES 加密操作
- *
- * @param content 待加密内容
- * @param password 加密密码
- * @param iv 使用CBC模式,需要一个向量iv,可增加加密算法的强度
- * @return 加密数据
- */
- public static String encrypt(String content, String password, String iv) {
- try {
- //创建密码器
- Cipher cipher = Cipher.getInstance(DEFAULT_CIPHER_ALGORITHM);
- //密码key(超过16字节即128bit的key,需要替换jre中的local_policy.jar和US_export_policy.jar,否则报错:Illegal key size)
- SecretKeySpec keySpec = new SecretKeySpec(password.getBytes("utf-8"),KEY_ALGORITHM);
- //向量iv
- IvParameterSpec ivParameterSpec = new IvParameterSpec(iv.getBytes("utf-8"));
- //初始化为加密模式的密码器
- cipher.init(Cipher.ENCRYPT_MODE,keySpec,ivParameterSpec);
- //加密
- byte[] byteContent = content.getBytes("utf-8");
- byte[] result = cipher.doFinal(byteContent);
- // 2 对密文字节数组进行 转换为 HEX输出密文
- String cipherText = byte2hex(result);
- return cipherText;
- } catch (Exception ex) {
- logger.error(ex.getMessage(),ex);
- }
- return null;
- }
- /**
- * AES 解密操作
- *
- * @param content 密文
- * @param password 密码
- * @param iv 使用CBC模式,需要一个向量iv,可增加加密算法的强度
- * @return 明文
- */
- public static String decrypt(byte[] content, String password, String iv) {
- try {
- //创建密码器
- Cipher cipher = Cipher.getInstance(DEFAULT_CIPHER_ALGORITHM);
- //密码key
- SecretKeySpec keySpec = new SecretKeySpec(password.getBytes("utf-8"),KEY_ALGORITHM);
- //向量iv
- IvParameterSpec ivParameterSpec = new IvParameterSpec(iv.getBytes("utf-8"));
- //初始化为解密模式的密码器
- cipher.init(Cipher.DECRYPT_MODE,keySpec,ivParameterSpec);
- //执行操作
- byte[] result = cipher.doFinal(content);
- return new String(result,"utf-8");
- } catch (Exception ex) {
- logger.error(ex.getMessage(),ex);
- }
- return null;
- }
- /**
- * 字节数组转成16进制字符串,不转为大写
- * @param bytes
- * @return
- */
- public static String byte2hex(byte[] bytes) {
- // 一个字节的数
- StringBuffer sb = new StringBuffer(bytes.length * 2);
- String tmp = "";
- for (int n = 0; n < bytes.length; n++) {
- // 整数转成十六进制表示
- tmp = (Integer.toHexString(bytes[n] & 0XFF));
- if (tmp.length() == 1) {
- sb.append("0");
- }
- sb.append(tmp);
- }
- return sb.toString();
- }
- /*将hex字符串转换成字节数组 */
- public static byte[] hex2byte(String str) {
- if (str == null || str.length() < 2) {
- return new byte[0];
- }
- str = str.toLowerCase();
- int l = str.length() / 2;
- byte[] result = new byte[l];
- for (int i = 0; i < l; ++i) {
- String tmp = str.substring(2 * i, 2 * i + 2);
- result[i] = (byte) (Integer.parseInt(tmp, 16) & 0xFF);
- }
- return result;
- }
- /**
- * Convert hex string to byte[]
- *
- * @param hexString the hex string
- * @return byte[]
- */
- public static byte[] hexStringToBytes(String hexString) {
- if (hexString == null || hexString.equals("")) {
- return null;
- }
- hexString = hexString.toUpperCase();
- int length = hexString.length() / 2;
- char[] hexChars = hexString.toCharArray();
- byte[] d = new byte[length];
- for (int i = 0; i < length; i++) {
- int pos = i * 2;
- d[i] = (byte) (charToByte(hexChars[pos]) << 4 | charToByte(hexChars[pos + 1]));
- }
- return d;
- }
- public static byte charToByte(char c) {
- return (byte)"0123456789ABCDEF".indexOf(c);
- }
- }
|