rk
5 天以前 74b0af6814b96378201ea27d205e054bf01d0306
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
package com.doumee.config.alipay;
 
import javax.crypto.Cipher;
import javax.crypto.NoSuchPaddingException;
import javax.crypto.spec.GCMParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import java.nio.charset.StandardCharsets;
import java.security.GeneralSecurityException;
import java.security.NoSuchAlgorithmException;
import java.util.Base64;
 
public class WXTransferAesUtil {
 
    static final int KEY_LENGTH_BYTE = 32;
    static final int TAG_LENGTH_BIT = 128;
    private final byte[] aesKey;
 
    /**
     * @param key ApiV3Key
     */
    public WXTransferAesUtil(byte[] key) {
        if (key.length != KEY_LENGTH_BYTE) {
            throw new IllegalArgumentException("无效的ApiV3Key,长度必须为32个字节");
        }
        this.aesKey = key;
    }
 
    /**
     * AES 解密
     *
     * @param associatedData 附加数据
     * @param nonce          随机串
     * @param ciphertext     数据密文
     */
    public String decryptToString(byte[] associatedData, byte[] nonce, String ciphertext) {
        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(Base64.getDecoder().decode(ciphertext)), StandardCharsets.UTF_8);
        } catch (NoSuchAlgorithmException | NoSuchPaddingException e) {
            throw new IllegalStateException(e);
        } catch (GeneralSecurityException e) {
            throw new IllegalArgumentException(e);
        }
    }
 
    public static void main(String[] args) {
        String associatedData = "certificate";
        String nonce = "cd1f5b224810";
        String ciphertext = "2cB5i6upRDxD/0DVBnOYoBoMd1WO6GBGdI25bjpTak/XulbBx+vszRqz2zphk7nI0vxpSDCyLC25DcB7IoyU7QxqGKNgZ0lgP7dKmoWcJkfro+/DC6gm8AtoCuJPAsvBrY55oqeuPcKYKfjIehvgwhokCiSI90w3GNHqb2Pf30pgez/YlY6R/bSIMi3Q7jyldoFKGWlyl9bvByhhYFsSD2FRx8WyIzNgwWROw1/oIXOjKVyLGHe4ycczVEHBpVN+j8a/o6LnI3FVFHchTJhHXiBNqwVoHzuXffLzqrdtjuxrDGcDLHSfta1Z3otNzk/Vycx3l5ZSOhlbt8INuqN3xXv5c9XUU6s8k48MaBZfS6CTfIzFoQTKUvT4A8BjmtPcaZUr2orhJhgkQO4fB/WoGR2VJoqs4qDhbkCCppYa4y1CF3vJhFuFnuSJEpwJseAdc6kbQDeEE6gnuQ93BNCYzmCfnAXz8BsWzfZuCopHQoR+JkTF2qejv7fp7hKsnRInWA/qV8+bDhcSleZpgAb1Nf0L0U7WcrWs5kt4kjVr+rC/8PWFWK+Eren7NpXwWVDG/zUSjq5rirJyZrydIYO76vlWrajIA3TOf29wJiaR2vk4csqTowpRpnn6RNfShtJPTZDOyIntEtyuKYGMYgbNTAd9Lv4iR3cxEgjqtFiDTnGVVn3cHyLiS5Gvm5C9BIdMkIwYDWr1JC16JLTAI9cIFdHuutj2TO0Yhb5oWJWt4XYWKQLz81NAFA0N+9Ipsz3nCrBEWQp7cBkGJvJhm67v7hc4lXrmQHQDJBQ79AUNddGUtJb2+sb64z1BOdi/1tkXbd2zJMuAY6zotqowhyX5eZlgWft1malANGJbdMxloUoswASZDf4cKCNCyFm3ndchifaYDEu/zJDtRQ66ZJGXLnEmPk0kYss1md/oF6/fK8hFsWOfYGTa053bS7wihn3rW63PHDZvnSVliMGoQEaJFFr1MjlbcEVJ2qsJqhJA3xRmgDNexq40MUj/WmLhTI9NpchQwWR6E5o3SrhdlNLN+1AmWjXt2GGDTCfL61SaLz6w4c+mzOnP6OR5C+YNdXDQoXVhGYcYgm+GgH+LHURZVoqkxpwtBtmFrcL/bXULTOWS1SvYJVa+0EjYyiXJCUxmzQMC3VblJG8eQd5Muw/J5HyfQVsuulk257hrFLDT8f4AjOkhxPwxXd/jQpw/17h74zWWWBJ6MMX6/lSs8Uf/LSeNZFEYtzIoj9aTcBai7+Srr2xRK4LibIHAFq1D5s9PdYyIxKL8BI49ZnKJLX2FWTrJe8HmzVhmODNWJe90jQFQFhZj6PLGiDtpjs7JSfFtHw5u6kIkBzvUt6JERQDbaOJGHucDGglMjstlcppiaqMiBl+xxwebzB5V8PSlhPGB0VykbvLXcMWcxGo+e42tO01lDu2dGdjEa2CDJwuR43su+W5yZ+aclBvH2GRWIiJjYsKgmg6o0BKNnHx8WASBqBhRgRdwB2f5gwdSCEIbLj44gV6C30H7ytybrrqb/Ft//CAuw2d3jFbgDR93yrnBhwMVRrGqRR2qRRAf0ma838kfjVuI7Y3fcove+yLaUzy2ccawUfd/s1FTgCM/vpFsqnad/JwIU8ojOy9rMr+7XsNI8oMP2VUSV3u5ZaTRlVTZS1jb24yq8doPhiZNb1XLrYKkQvXWAvHvyBuNVibsDOusHoDbepNWd7q3Fyp25Yn6b2opxDGtGrXGl+JXApbjNWfvyIHZY5GOFkG+nXkk7rwpUhXWo8ttgMUEbBSgODG2gs5k/o6ix/bVXbtQh2zZ93sZr0P/zAUELPWENa/oz7FW4navomVLrR8hHF6BdxRWOh8i8iI0uJHIX+zTdqdMuNvu/bSZEA==";
        WXTransferAesUtil WXTransferAesUtil = new WXTransferAesUtil("NJTLJSTZYXZRGScaiwubuzichanbu666".getBytes());
        String s = WXTransferAesUtil.decryptToString(associatedData.getBytes(), nonce.getBytes(), ciphertext);
        System.out.println(s);
    }
}