微信的解析加密信息encrypted 中的坑.
1.需要注意得是微信端传入vi与encryptedData 的一致性 .spingboot的后台默认接收json的数据格式.传输值中可能"+"加号,后台接收的值,servlet自动转成" "空格,导致解析失败.希望后续开发者不要在这个问题上耽搁太久.
,我目前的做法是直接把接收值中的空格替换成加号,"+"
encryptedData = encryptedData.replace(" ", "+");
iv = iv.replace(" ", "+");
暂时没有发现问题.
更好的做法是直接把传输值转换成加密数据.后台再次解密可以避免.
public static JSONObject getDecryptMsg(String encryptedData, String iv, String sessionKey) { byte[] dataByte = Base64.decode(encryptedData); byte[] keyByte = Base64.decode(sessionKey); byte[] ivByte = Base64.decode(iv); try { int base = 16; if (keyByte.length % base != 0) { int groups = keyByte.length / base + (keyByte.length % base != 0 ? 1 : 0); byte[] temp = new byte[groups * base]; Arrays.fill(temp, (byte) 0); System.arraycopy(keyByte, 0, temp, 0, keyByte.length); keyByte = temp; } Security.addProvider(new BouncyCastleProvider()); Cipher cipher = Cipher.getInstance("AES/CBC/PKCS7Padding", "BC"); SecretKeySpec spec = new SecretKeySpec(keyByte, "AES"); AlgorithmParameters parameters = AlgorithmParameters.getInstance("AES"); parameters.init(new IvParameterSpec(ivByte)); cipher.init(Cipher.DECRYPT_MODE, spec, parameters); byte[] resultByte = cipher.doFinal(dataByte); if (null != resultByte && resultByte.length > 0) { String result = new String(resultByte, "UTF-8"); return JSONObject.parseObject(result); } } catch (Exception e) { e.printStackTrace(); } return null; }