出现该问题时,再次确认encodingAesKey是否与微信后台配置一致,如果不一致会导致出现“解密后得到的buffer非法”的错误
微信 WXBizMsgCrypt解密失败,AesException:解密后得到的buffer非法?WXBizMsgCrypt.java 解密过程,如下: /** * 对密文进行解密. * * @param text 需要解密的密文 * @return 解密得到的明文 * @throws AesException aes解密失败 */ String decrypt(String text) throws AesException { byte[] original; try { // 设置解密模式为AES的CBC模式 Cipher cipher = Cipher.getInstance("AES/CBC/NoPadding"); SecretKeySpec key_spec = new SecretKeySpec(aesKey, "AES"); IvParameterSpec iv = new IvParameterSpec(Arrays.copyOfRange(aesKey, 0, 16)); cipher.init(Cipher.DECRYPT_MODE, key_spec, iv); // 使用BASE64对密文进行解码 byte[] encrypted = Base64.decodeBase64(text); // 解密 original = cipher.doFinal(encrypted); } catch (Exception e) { e.printStackTrace(); throw new AesException(AesException.DecryptAESError); } String xmlContent, from_appid; try { // 去除补位字符 byte[] bytes = PKCS7Encoder.decode(original); // 分离16位随机字符串,网络字节序和AppId byte[] networkOrder = Arrays.copyOfRange(bytes, 16, 20); int xmlLength = recoverNetworkBytesOrder(networkOrder); xmlContent = new String(Arrays.copyOfRange(bytes, 20, 20 + xmlLength), CHARSET); from_appid = new String(Arrays.copyOfRange(bytes, 20 + xmlLength, bytes.length), CHARSET); } catch (Exception e) { e.printStackTrace(); throw new AesException(AesException.IllegalBuffer); } // appid不相同的情况 if (!from_appid.equals(appId)) { throw new AesException(AesException.ValidateAppidError); } return xmlContent; } 上面代码中,标红处解密出错,如下: [图片] [图片]需要解密的内容如下: <xml> <AppId><![CDATA[wx715ef430c8070462]]></AppId> <Encrypt><![CDATA[5NWqy2SBB3fPlQRkrHUDe2SnrQGpeCvI04jXc7WmGJQeuCoTlssyopMuCnX2tsrmfw+oEJUugOLV6RFT65dfyJ7PS3uGpH+WzFq+gJuSQYu40cQllKNHuV7tI+hnp7HfQrZ5a9aJUGNDgz4EJuimtkIVo+DaPgA/CfxRd1eDBtnvqcYzJ10f7lXImPa2RuSDvyxBiT3d6JzH3BSz8oMSw7ah8WEIp0B38X1WlTGk7UdP2RMcSO2GgCjP4kN593EQBR0g8lJPb04Xo4bDrdDEChGhhMxzi1Y7ywZxwvrm0oWyVdX6DTfAoh6X4+tQic/BoWjlrMaYC2GHwUJ83E1FQr6eEAsPezMfkGYln/GVlkuiMilozDueyT8KQkF/rCmx6T9SZLix7/eq/VJsDbwVcg3stgwLfhCUHnS+LUXNZ4tdlbr4xt/N/u8CzFOr+SlVeOCZ8xa7L7JeIH9rvO/93g==]]></Encrypt> </xml>
2023-05-25