View Javadoc
1   package com.foxinmy.weixin4j.wxa;
2   
3   import java.security.AlgorithmParameters;
4   import java.security.Key;
5   import java.security.Security;
6   
7   import javax.crypto.Cipher;
8   import javax.crypto.spec.IvParameterSpec;
9   import javax.crypto.spec.SecretKeySpec;
10  
11  import org.bouncycastle.jce.provider.BouncyCastleProvider;
12  
13  /**
14   * @since 1.8
15   */
16  final class AESUtils {
17  
18  	private static boolean initialized = false;
19  
20  	private AESUtils() {
21  	}
22  
23  	/**
24  	 * AES解密
25  	 *
26  	 * @param content 密文
27  	 * @param keyByte key
28  	 * @param ivByte 初始向量
29  	 * @return 明文
30  	 */
31  	static byte[] decrypt(byte[] content, byte[] keyByte, byte[] ivByte) {
32  		initialize();
33  		try {
34  			Cipher cipher = Cipher.getInstance("AES/CBC/PKCS7Padding");
35  			Key sKeySpec = new SecretKeySpec(keyByte, "AES");
36  
37  			cipher.init(Cipher.DECRYPT_MODE, sKeySpec, generateIV(ivByte)); // 初始化
38  			byte[] result = cipher.doFinal(content);
39  			return result;
40  		} catch (Exception e) {
41  			throw new RuntimeException(e);
42  		}
43  	}
44  
45  	private static synchronized void initialize() {
46  		if (initialized) {
47  			return;
48  		}
49  
50  		Security.addProvider(new BouncyCastleProvider());
51  		initialized = true;
52  	}
53  
54  	private static AlgorithmParameters generateIV(byte[] iv) throws Exception {
55  		AlgorithmParameters params = AlgorithmParameters.getInstance("AES");
56  		params.init(new IvParameterSpec(iv));
57  		return params;
58  	}
59  
60  }