package com.haogrgr.test.util; import java.io.UnsupportedEncodingException; import java.security.spec.AlgorithmParameterSpec; import java.util.Base64; import javax.crypto.Cipher; import javax.crypto.KeyGenerator; import javax.crypto.SecretKey; import javax.crypto.spec.IvParameterSpec; import javax.crypto.spec.SecretKeySpec; import javax.xml.bind.DatatypeConverter; /** * AES加密解密工具类,该工具只依赖JDK * * @author desheng.tu * @since 2015年4月13日 上午11:48:10 */ public class AESUtils { public static final String ALGORITHM = "AES"; public static final String TRANSFORMATION = "AES/CBC/PKCS5Padding"; public static void main(String[] args) { String secretkey = "XvQL99XfFuotkxjQ"; String input = "haogrgrgrgrgrgrgrgrgrg"; System.out.println(encryptToHex(input, secretkey)); System.out.println(hexDecrypt((encryptToHex(input, secretkey)), secretkey)); } /** * AES加密 * @param whatToEncrypt 要加密的内容 * @param secretkey AES secret key * @return 加密后的内容(Base64) */ public static String encryptToBase64(String whatToEncrypt, String secretkey) { byte[] result = encrypt(UTF8Bytes(whatToEncrypt), newKey(UTF8Bytes(secretkey)), newDefaultIV()); return Base64.getEncoder().encodeToString(result); } /** * AES加密 * @param whatToEncryptHex 要加密的内容 * @param secretkey AES secret key * @return 加密后的内容Hex */ public static String encryptToHex(String whatToEncrypt, String secretkey) { byte[] result = encrypt(UTF8Bytes(whatToEncrypt), newKey(UTF8Bytes(secretkey)), newDefaultIV()); return toHexString(result); } /** * AES加密 * @param whatToEncrypt 要加密的内容 * @param secretkey AES secret key * @param ivspec 向量 * @return 加密后的字节 */ private static byte[] encrypt(byte[] whatToEncrypt, SecretKeySpec secretkey, AlgorithmParameterSpec ivspec) { try { Cipher cipher = Cipher.getInstance(TRANSFORMATION); cipher.init(Cipher.ENCRYPT_MODE, secretkey, ivspec); return cipher.doFinal(whatToEncrypt); } catch (Exception e) { throw new RuntimeException("加密失败", e); } } /** * AES解密 * @param whatToDecrypt 要解密的内容 * @param secretkey AES secret key * @return 解密后的utf8串 */ public static String base64Decrypt(String whatToDecryptBase64, String secretkey) { byte[] result = decrypt(Base64.getDecoder().decode(whatToDecryptBase64), newKey(UTF8Bytes(secretkey)), newDefaultIV()); return UTF8Str(result); } /** * AES解密 * @param whatToDecryptHex 要解密的内容(hex) * @param secretkey AES secret key * @return 解密后的utf8串 */ public static String hexDecrypt(String whatToDecryptHex, String secretkey) { byte[] result = decrypt(toByteArray(whatToDecryptHex), newKey(UTF8Bytes(secretkey)), newDefaultIV()); return UTF8Str(result); } /** * AES解密 * @param whatToDecrypt 要解密的内容 * @param secretkey AES secret key * @param ivspec 向量 * @return 解密后的字节 */ private static byte[] decrypt(byte[] whatToDecrypt, SecretKeySpec secretkey, AlgorithmParameterSpec ivspec) { try { Cipher cipher = Cipher.getInstance(TRANSFORMATION); cipher.init(Cipher.DECRYPT_MODE, secretkey, ivspec); return cipher.doFinal(whatToDecrypt); } catch (Exception e) { throw new RuntimeException("解密失败", e); } } /** * 创建128位的加密key */ public static byte[] getAesKey() throws Exception { // Higher than 128-bit encryption requires a download of additional provider implementations for the JDK. KeyGenerator kgen = KeyGenerator.getInstance("AES"); kgen.init(128); SecretKey skey = kgen.generateKey(); return skey.getEncoded(); } /** * 字节数组转换为Hex字符串 */ public static String toHexString(byte[] data) { return DatatypeConverter.printHexBinary(data); } /** * Hex字符串转换为字节数组 */ public static byte[] toByteArray(String hexStr) { return DatatypeConverter.parseHexBinary(hexStr); } /** * str.getBytes("UTF-8")异常转换为运行时异常 */ public static byte[] UTF8Bytes(String str) { try { return str.getBytes("UTF-8"); } catch (UnsupportedEncodingException e) { throw new RuntimeException("不支持的编码(" + str + ")", e); } } /** * new String(buf, "UTF-8")异常转换为运行时异常 */ public static String UTF8Str(byte[] buf) { try { return new String(buf, "UTF-8"); } catch (UnsupportedEncodingException e) { throw new RuntimeException(e); } } /** * 获取默认的向量 */ private static AlgorithmParameterSpec newDefaultIV() { byte[] iv = { 10, 1, 11, 5, 12, 4, 15, 7, 13, 9, 23, 3, 2, 14, 8, 12 }; return new IvParameterSpec(iv); } /** * 获取SecretKeySpec对象, key.getByte(); */ private static SecretKeySpec newKey(byte[] key) { return new SecretKeySpec(key, ALGORITHM); } }