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