/**base64工具类*/
import org.apache.commons.codec.binary.Base64;引入的包
public class Base64Utils {
public static byte[] getFromBASE64(String s) {
byte[] b = null;
if (s != null) {
Base64 decoder = new Base64();
b = decoder.decode(s.getBytes());
}
return b;
}
}
/**
* 解密微信用户的个人信息
* @param encryptedData
* @param iv
* @param sessionKey
* @return
* @throws Exception
*/
public static JSONObject decrypt(String encryptedData, String iv ,String sessionKey) throws Exception {
String jsonStr = new String("");
JSONObject jsonObject = new JSONObject();
try {
//maven打包时会报错,最好使用org.apache.commons.codec.binary.Base64
//BASE64Decoder base64Decoder = new BASE64Decoder();
/**
* 小程序加密数据解密算法
* https://developers.weixin.qq.com/miniprogram/dev/api/signature.html#wxchecksessionobject
* 1.对称解密的目标密文为 Base64_Decode(encryptedData)。
* 2.对称解密秘钥 aeskey = Base64_Decode(session_key), aeskey 是16字节。
* 3.对称解密算法初始向量 为Base64_Decode(iv),其中iv由数据接口返回。
*/
// byte[] encryptedByte = base64Decoder.decodeBuffer(encryptedData);
// byte[] sessionKeyByte = base64Decoder.decodeBuffer(sessionKey);
// byte[] ivByte = base64Decoder.decodeBuffer(iv);
System.out.println(1);
byte[] encryptedByte = Base64Utils.getFromBASE64(encryptedData);
byte[] sessionKeyByte = Base64Utils.getFromBASE64(sessionKey);
byte[] ivByte = Base64Utils.getFromBASE64(iv);
/**
* 以下为AES-128-CBC解密算法
*/
SecretKeySpec skeySpec = new SecretKeySpec(sessionKeyByte, "AES");
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
IvParameterSpec ivParameterSpec = new IvParameterSpec(ivByte);
cipher.init(Cipher.DECRYPT_MODE, skeySpec, ivParameterSpec);
byte[] original = cipher.doFinal(encryptedByte);
jsonStr = new String(original);
jsonObject = JSON.parseObject(jsonStr);
} catch (Exception ex) {
throw new Exception("Illegal Buffer");
}
return jsonObject;
}