1 packagecom.sun.mall.util;2
3 importjava.math.BigInteger;4
5 importjavax.crypto.Cipher;6 importjavax.crypto.KeyGenerator;7 importjavax.crypto.spec.SecretKeySpec;8
9 importorg.apache.commons.codec.binary.Base64;10
11 importcom.sun.mall.constants.IResultCode;12 importcom.xiaoleilu.hutool.util.StrUtil;13
14 importsun.misc.BASE64Decoder;15
16 /**
17 * AES的加密和解密18 * @ClassName: AesUtil19 *@authorsunt20 * @date 2017年11月30日21 *@versionV1.022 */
23 public classAesUtil {24
25 //算法
26 private static final String ALGORITHMSTR = "AES/ECB/PKCS5Padding";27
28 /**
29 * aes解密30 *@paramencrypt 内容31 *@return
32 *@throwsException33 */
34 public staticString aesDecrypt(String encrypt) {35 try{36 returnaesDecrypt(encrypt, IResultCode.AES_KEY);37 } catch(Exception e) {38 e.printStackTrace();39 return "";40 }41 }42
43 /**
44 * aes加密45 *@paramcontent46 *@return
47 *@throwsException48 */
49 public staticString aesEncrypt(String content) {50 try{51 returnaesEncrypt(content, IResultCode.AES_KEY);52 } catch(Exception e) {53 e.printStackTrace();54 return "";55 }56 }57
58 /**
59 * 将byte[]转为各种进制的字符串60 *@parambytes byte[]61 *@paramradix 可以转换进制的范围,从Character.MIN_RADIX到Character.MAX_RADIX,超出范围后变为10进制62 *@return转换后的字符串63 */
64 public static String binary(byte[] bytes, intradix){65 return new BigInteger(1, bytes).toString(radix);//这里的1代表正数
66 }67
68 /**
69 * base 64 encode70 *@parambytes 待编码的byte[]71 *@return编码后的base 64 code72 */
73 public static String base64Encode(byte[] bytes){74 returnBase64.encodeBase64String(bytes);75 }76
77 /**
78 * base 64 decode79 *@parambase64Code 待解码的base 64 code80 *@return解码后的byte[]81 *@throwsException82 */
83 public static byte[] base64Decode(String base64Code) throwsException{84 return StrUtil.isEmpty(base64Code) ? null : newBASE64Decoder().decodeBuffer(base64Code);85 }86
87
88 /**
89 * AES加密90 *@paramcontent 待加密的内容91 *@paramencryptKey 加密密钥92 *@return加密后的byte[]93 *@throwsException94 */
95 public static byte[] aesEncryptToBytes(String content, String encryptKey) throwsException {96 KeyGenerator kgen = KeyGenerator.getInstance("AES");97 kgen.init(128);98 Cipher cipher =Cipher.getInstance(ALGORITHMSTR);99 cipher.init(Cipher.ENCRYPT_MODE, new SecretKeySpec(encryptKey.getBytes(), "AES"));100
101 return cipher.doFinal(content.getBytes("utf-8"));102 }103
104
105 /**
106 * AES加密为base 64 code107 *@paramcontent 待加密的内容108 *@paramencryptKey 加密密钥109 *@return加密后的base 64 code110 *@throwsException111 */
112 public static String aesEncrypt(String content, String encryptKey) throwsException {113 returnbase64Encode(aesEncryptToBytes(content, encryptKey));114 }115
116 /**
117 * AES解密118 *@paramencryptBytes 待解密的byte[]119 *@paramdecryptKey 解密密钥120 *@return解密后的String121 *@throwsException122 */
123 public static String aesDecryptByBytes(byte[] encryptBytes, String decryptKey) throwsException {124 KeyGenerator kgen = KeyGenerator.getInstance("AES");125 kgen.init(128);126
127 Cipher cipher =Cipher.getInstance(ALGORITHMSTR);128 cipher.init(Cipher.DECRYPT_MODE, new SecretKeySpec(decryptKey.getBytes(), "AES"));129 byte[] decryptBytes =cipher.doFinal(encryptBytes);130 return newString(decryptBytes);131 }132
133
134 /**
135 * 将base 64 code AES解密136 *@paramencryptStr 待解密的base 64 code137 *@paramdecryptKey 解密密钥138 *@return解密后的string139 *@throwsException140 */
141 public static String aesDecrypt(String encryptStr, String decryptKey) throwsException {142 return StrUtil.isEmpty(encryptStr) ? null: aesDecryptByBytes(base64Decode(encryptStr), decryptKey);143 }144
145 /**
146 * 测试147 * 前端js将参数加密提交到后台如何解密148 * 首先获取服务端的私钥:将客户端的公钥加密后获得的结果149 * 通过服务端的私钥和客户端传递的加密字符串即可实现解密150 */
151 public static void main(String[] args) throwsException {152 String content = "456";153 System.out.println("加密前:" +content);154 System.out.println("加密密钥和解密密钥:" +IResultCode.AES_KEY);155 String encrypt =aesEncrypt(content, IResultCode.AES_KEY);156 System.out.println("加密后:" +encrypt);157 String decrypt =aesDecrypt(encrypt, IResultCode.AES_KEY);158 System.out.println("解密后:" +decrypt);159 //js加密后的字符串: lkqsgKHH7OkhIa0tISMtuQ==
160 String jsData = aesDecrypt("lkqsgKHH7OkhIa0tISMtuQ==", IResultCode.AES_KEY);161 System.out.println("前端数据解密后的值:" +jsData);162
163 }164 }