package com.code.decode.util;
import java.nio.charset.StandardCharsets;
import java.security.*;
import java.security.spec.InvalidParameterSpecException;
import org.apache.xmlbeans.impl.util.Base64;
import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import com.alibaba.fastjson.JSON;
import org.bouncycastle.jce.provider.BouncyCastleProvider;
public class AESForWeixinGetPhoneNumber {
private static String keyAlgorithm = "AES";
private static boolean initialized = false;
private Base64 decoder = new Base64();
private String originalContent;
private String encryptKey;
private String iv;
public AESForWeixinGetPhoneNumber(String originalContent,String encryptKey,String iv) {
this.originalContent = originalContent;
this.encryptKey = encryptKey;
this.iv = iv;
}
public WeixinPhoneDecryptInfo decrypt() {
initialize();
try {
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS7Padding");
Key sKeySpec = new SecretKeySpec(decoder.decode(this.encryptKey.getBytes()), keyAlgorithm);
cipher.init(Cipher.DECRYPT_MODE, sKeySpec, generateIV(decoder.decode(this.iv.getBytes())));
byte[]data = cipher.doFinal(decoder.decode(this.originalContent.getBytes()));
String datastr = new String(data, StandardCharsets.UTF_8);
return JSON.toJavaObject(JSON.parseObject(datastr),WeixinPhoneDecryptInfo.class);
} catch (Exception e) {
System.out.println(e.getMessage());
return null;
}
}
private static void initialize() {
if (initialized)
return;
Security.addProvider(new BouncyCastleProvider());
initialized = true;
}
private static AlgorithmParameters generateIV(byte[] iv) throws NoSuchAlgorithmException, InvalidParameterSpecException {
AlgorithmParameters params = AlgorithmParameters.getInstance(keyAlgorithm);
params.init(new IvParameterSpec(iv));
return params;
}
}
package com.code.decode.util;
public class WeixinWaterMark {
private Long timestamp;
private String appid;
public Long getTimestamp() {
return timestamp;
}
public void setTimestamp(Long timestamp) {
this.timestamp = timestamp;
}
public String getAppid() {
return appid;
}
public void setAppid(String appid) {
this.appid = appid;
}
}
package com.code.decode.util;
import com.alibaba.fastjson.JSON;
public class WeixinPhoneDecryptInfo {
private String phoneNumber;
private String purePhoneNumber;
private int countryCode;
private String watermark;
private WeixinWaterMark weixinWaterMark;
public String getPhoneNumber() {
return phoneNumber;
}
public void setPhoneNumber(String phoneNumber) {
this.phoneNumber = phoneNumber;
}
public String getPurePhoneNumber() {
return purePhoneNumber;
}
public void setPurePhoneNumber(String purePhoneNumber) {
this.purePhoneNumber = purePhoneNumber;
}
public int getCountryCode() {
return countryCode;
}
public void setCountryCode(int countryCode) {
this.countryCode = countryCode;
}
public String getWatermark() {
return watermark;
}
public void setWatermark(String watermark) {
this.watermark = watermark;
this.weixinWaterMark = JSON.toJavaObject(JSON.parseObject(this.watermark),WeixinWaterMark.class);
}
public WeixinWaterMark getWeixinWaterMark(){
return weixinWaterMark;
}
@Override
public String toString() {
return "WeixinPhoneDecryptInfo{" +
"phoneNumber='" + phoneNumber + '\'' +
", purePhoneNumber='" + purePhoneNumber + '\'' +
", countryCode=" + countryCode +
", appid=" + weixinWaterMark.getAppid() +
", timestamp=" + weixinWaterMark.getTimestamp() +
'}';
}
}
public static void main(String[] args) {
String encryptedData="";
String iv="";
String appId="";
AESForWeixinGetPhoneNumber aes=new AESForWeixinGetPhoneNumber(encryptedData,"session_key",iv);
WeixinPhoneDecryptInfo info=aes.decrypt();
if (null==info){
System.out.println("error");
}else {
if (!info.getWeixinWaterMark().getAppid().equals(appId)){
System.out.println("wrong appId");
}
System.out.println(info.toString());
}
}