收藏
回答

退款结果通知解密req_info失败,麻烦看看代码有错误吗?

/**

     * 对微信的返回数据进行解密 做AES-256-ECB解密(PKCS7Padding)

     * @param encrypted 目标密文

     * @param aesKey 解密密钥

     * @param 

     * @throws Exception

     */

    public static String decryptWXReturn(String encrypted, String aesKey){

    try {

  

           Cipher cipher = Cipher.getInstance("AES/ECB/PKCS7Padding","BC"); //这里是不是这样写? 

    //对秘钥进行MD5编码

//这里生成key的方法是错的

            Key key = initKeyForAES(MD5Util.encode(aesKey).toLowerCase().toString());

//这才是生成key的正确方法

SecretKeySpec key = new SecretKeySpec(MD5Utils.MD5Encode(aesKey,"UTF-8").toLowerCase().toLowerCase().getBytes(), "AES");

         //对秘钥进行MD5加密的时候必须指定UTF-8编码,这样写也是不行的

SecretKeySpec key = new SecretKeySpec(MD5Util.encode(aesKey).toLowerCase().toLowerCase().getBytes(), "AES"); //这样也会报错

  cipher.init(Cipher.DECRYPT_MODE, key);

byte[] encryptedBase64 = new BASE64Decoder().decodeBuffer(encrypted);

byte[] decbbdt = cipher.doFinal(encryptedBase64); //到这一步就开始报错pad block corrupted

return new String(decbbdt,"UTF-8");

} catch (Exception e) {

logger.error(e);

}

return null;

    }

     public static Key initKeyForAES(String key) throws NoSuchAlgorithmException {

        if (null == key || key.length() == 0) {

            throw new NullPointerException("key not is null");

        }

        SecretKeySpec key2 = null;

        SecureRandom random = SecureRandom.getInstance("SHA1PRNG");

        random.setSeed(key.getBytes());

        try {

            KeyGenerator kgen = KeyGenerator.getInstance("AES");

            kgen.init(256, random); //这里到底是128还是256??但是两种试了还是报错pad block corrupted

            //kgen.init(128, random);

            SecretKey secretKey = kgen.generateKey();

            byte[] enCodeFormat = secretKey.getEncoded();

            key2 = new SecretKeySpec(enCodeFormat, "AES");

        } catch (NoSuchAlgorithmException ex) {

            throw new NoSuchAlgorithmException();

        }

        return key2;

  }

秘钥是一致的,这个AES-256-ECB解密(PKCS7Padding)到底怎么解啊,请问代码有问题吗

最后一次编辑于  2020-04-16
回答关注问题邀请回答
收藏

5 个回答

  • Admin²⁰²²
    Admin²⁰²²
    2020-04-15

    微信退款及退款通知结果 java_Java_leo-CSDN博客

    https://blog.csdn.net/qq_35733535/article/details/83541574

    2020-04-15
    有用 2
    回复 2
    • LY
      LY
      2020-04-16
      找到问题了谢谢原来是生成秘钥的方法不对,
      要用SecretKeySpec key = new SecretKeySpec()这样的方法才可以
      2020-04-16
      回复
    • LY
      LY
      2020-04-16回复LY
      之前也用过SecretKeySpec key = new SecretKeySpec()这个方法但是报错,根本原因是因为,对秘钥进行MD5加密的时候没有指定UTF-8编码
      2020-04-16
      回复
  • 石磊
    石磊
    2021-02-05

    https://blog.csdn.net/qq_44776721/article/details/113701498

    java demo,亲测可用

    2021-02-05
    有用 1
    回复
  • anno
    anno
    2020-05-08

     illegal base64 data at input byte 1110, 请问有人遇到这个问题吗?

    2020-05-08
    有用
    回复 1
    • LY
      LY
      2020-05-12
      没有额
      2020-05-12
      回复
  • 微信支付技术助手8
    微信支付技术助手8
    2020-04-16

    https://developers.weixin.qq.com/community/develop/doc/00040e8a384050796f4835e4056400?_at=1587003251499

    2020-04-16
    有用
    回复 5
    • LY
      LY
      2020-04-16
      你们给的参考代码太模糊了,很多细节都忽略了,而且像退款通知的加解密是没有初始化向量的,希望能出完整的java官方demo
      2020-04-16
      回复
    • 自由海
      自由海
      2020-04-22回复LY
      initKeyForAES(String key)这个方法有什么用途?
      2020-04-22
      回复
    • LY
      LY
      2020-05-12回复自由海
      这个方法之前是为了生成一个key,这个方法没用了,直接用SecretKeySpec key = new SecretKeySpec()生成key即可
      2020-05-12
      回复
    • 哇
      2020-08-11回复LY
      楼主,最后问题顺利解决了没?
      2020-08-11
      回复
    • LY
      LY
      2020-11-24回复
      解决了
      2020-11-24
      回复
  • LY
    LY
    2020-04-15

    有java现成的可行的demo吗,跪求

    2020-04-15
    有用
    回复 1
登录 后发表内容
问题标签