收藏
回答

下载二级商户资金账单提示AEADBadTagException: Tag mismatch!

1.解密encrypt_key得到key

2.key和随机字符串nonce和根据download_url得到的字节数组ciphertext解密

第二步解密报错了,提示javax.crypto.AEADBadTagException: Tag mismatch!

证书秘钥和v3秘钥肯定没问题的(别的接口如查询,提现等接口都正常),下载账单的全部代码如下,麻烦大佬看下哪里出问题了,谢谢!

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

3 个回答

  • 白茶清欢
    白茶清欢
    2021-02-24

    全屏看图可以看清代码

    2021-02-24
    有用 1
    回复 5
    • 白茶清欢
      白茶清欢
      2021-02-24
      两个解密代码和官网的一样,不清楚错在哪了
      2021-02-24
      回复
    • 白茶清欢
      白茶清欢
      2021-02-24
      问题已解决:
      1.这里的账单解密的SecretKeySpec里的key是encrypt_key解密后的key,
      2.附加数据associatedData,这里是空字符串
      我就是这两个搞错了
      2021-02-24
      1
      回复
    • 起个好听的名字
      起个好听的名字
      2021-04-08
      确认apiv3key没错的话,参考这个:
      2021-04-08
      回复
    • 起个好听的名字
      起个好听的名字
      2021-04-08回复起个好听的名字
      用utf-8
      2021-04-08
      回复
    • kit
      kit
      2022-03-24回复白茶清欢
      请问一下,能分享你成功的代码吗?我用的解密后的key而非apiv3key,associatedData也是空字符串,但是还是Tag Mismatch
      2022-03-24
      回复
  • 蓝桥
    蓝桥
    2022-02-15
    
    public static byte[] downloadUrl(String download_url) throws Exception {
    
    
        //请求URL
        //账单文件的下载地址的有效时间为30s
        URIBuilder uriBuilder = new URIBuilder(download_url);
        HttpGet httpGet = new HttpGet(uriBuilder.build());
        httpGet.addHeader("Accept", "application/json");
    
        //执行请求
        CloseableHttpResponse response = httpClient.execute(httpGet);
        try {
            int statusCode = response.getStatusLine().getStatusCode();
            if (statusCode == 200) {
              
                byte[] bytes = EntityUtils.toByteArray(response.getEntity());
                return bytes;
            } else if (statusCode == 204) {
                System.out.println("success");
            } else {
                System.out.println("failed,resp code = " + statusCode + ",return body = " + EntityUtils.toString(response.getEntity()));
                throw new IOException("request failed");
            }
        } finally {
            response.close();
        }
        return null;
    }
    
    /**
         * 解密二级商户账单
         * @param associatedData
         * @param nonce
         * @param ciphertext 二进制密文,需以字节数组形式处理,不需要进行Base64解码。
         * @return
         * @throws GeneralSecurityException
         * @throws IOException
         */
        public String decryptToString(byte[] associatedData, byte[] nonce, byte[] ciphertext)
                throws GeneralSecurityException, IOException {
            try {
                Cipher cipher = Cipher.getInstance("AES/GCM/NoPadding");
    
                SecretKeySpec key = new SecretKeySpec(aesKey, "AES");
                GCMParameterSpec spec = new GCMParameterSpec(TAG_LENGTH_BIT, nonce);
    
                cipher.init(Cipher.DECRYPT_MODE, key, spec);
                cipher.updateAAD(associatedData);
    
                return new String(cipher.doFinal(ciphertext), "utf-8");
            } catch (NoSuchAlgorithmException | NoSuchPaddingException e) {
                throw new IllegalStateException(e);
            } catch (InvalidKeyException | InvalidAlgorithmParameterException e) {
                throw new IllegalArgumentException(e);
            }
        }
    
    }
    


    2022-02-15
    有用
    回复
  • ???
    ???
    2021-12-30

    我这里完全按照你说的做的,还是这个错,可以帮我看看分析一下么,谢谢你了,必有答谢

    2021-12-30
    有用
    回复
登录 后发表内容
问题标签