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); } }