收藏
回答

微信公众平台消息加解密有时候出错?

用的官网提供的java的sdk ,在消息解密的时候

WXBizMsgCrypt

private 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;

}

这个xmlLength 要么是10位整数或者是10位负数 导致内存溢出或者 解密后得到的buffer非法

有时候能正常解密 xmlLength只有300多,这是为什么

回答关注问题邀请回答
收藏

2 个回答

  • 另外半只.
    另外半只.
    2020-10-13

    请问有解决嘛,同样遇到这个问题

    2020-10-13
    有用
    回复
  • 春季里开花十四五六
    春季里开花十四五六
    2020-09-03

    请问这个问题有解决吗

    2020-09-03
    有用
    回复
登录 后发表内容
问题标签