{"agetId":"61000000103774","pdata":"O619w1fPFR76cKt1QVastYzxm7qdxaS2JnlhZG0WFLFXV3atb1WT8uuCwRgqRhM5sUPGE8DyKgHI+rhfDfIKoGdMNx97oftvdRM11QTlDnldD9T9y//k6OPKWNvCZx6x/tOYYwta550aqsqC8hYRAZdPhZymuF7ydi2Xu0VHOMbkpYBAaz4l0vZvUGxzJoImwDiPB8jZP8Ri7bltVGfkwGlGOSjcwJMqYlG4c7U49jgoDtgs051z54yRDjpCEWmu5YkavkQhqHaj5yg2zltPrbhztY/X5WZ1EGZgt1EtP7hZ9D7DSpdyTjWa9yZeQNY0zn7i9aAM7hA8yhITXEcpFWz8sb7ZY9zBVkmXOfqRl+mek7DJ4CwRNjolraY4kRq9tIVJYlA/2SfkNZEABa+vhwMzy3CChoQNdLgf8T2rq/Rv03x8HW39G9YYzkONZnmofXylLy5sWqFnGlSQu3y7sORcIkBjvPL2CQfoPNWKZ7MPY9vXzlXCNuxNzTYzeJ0uK4sITT0PZ9yKWfFFfJWY//kojPnhXkEI2f28T9V5FPKVfrv5637yG4MiqA0Mqn1eKBMQ5b8guqNUQcAwdqbtikPLXzWDCPXPG2oXaWE0Q9slJgDCOFIU4Nx/E3ee1mEpo6ywyyEQLIi0SWouM4MrIek6gGGtIg5f7R2M6Brk1zRpN12V4FybRPFr2O6uE23GlWUYkj/8bGrPaEIMFLn6PeK80T6WMtRiN3coC4Z6yInK3cBQAPKpZe51FyYEGdyEjQ42fwmNlKW1AV95Lz/0PQLLEVUP14AQs68XgB4jQI0mCBbFgbYoRZkmuG537KmZEy48r2E0nWImI/VLym2JEbAKf/GCmrDcVcFqPCQqP++6CFFDEKI1yepVZizFjUMQvK6vYAgQuRNeMI+dHiioIZZFJXdj7AJOhNYRnNInFZlRVcuvFr7O8Lp/TZwXe7HuFjnanYXPvdETsvtn3sXzuc/qClyp9TWbd4fE8/g5aHa9aqOAIzKst7ueRPZw3kxpjYJ9z/MiEDE3+O+UC5zqIZ/Zv8KpPwWmAjB0B3AY3jq3Aikspc2ypA3XISYfLrQ7pnNTIC+9hIrp0mOQE+qrzo0fk47n+l5HxbC2LIfm4N9tVjc+ZNSWmT4j2DNUTq1MLq7S4FRgG5HnlpUfyUl3meG/0XxkFVg/E7BISaCClgW9kNy1FKmZWGa8+Ygi0I4PpX3xaUOFkaxyHGorSmQm/0PtSD+dGo5vp1ER7ZROL/EjVNNijuFD7UkE/XmD/vNdc5aLgZQvFws93BKfzo+A5KbrK1oW/4cCYBQV2HjhTqD0ycjow7UDs1Nh44CpA6o06rakfl5tBXvCjxhQdVtfvVsEsJ9UthSHNx5et7vbxd1NWZhtdWRRP6aTQeUCCCRqFburI53t/xNNea0F3BJ1L5UZ5u94eEl8f+wLdV21np52pDDOd5XOCtBwVFzuveumQfn3mlleB4hxTKSt/JLH1rQgLXS83JYnpjkxtmJLAQ7cWzYoPDWSzf7bdC0KODC2usokUR9RNVL5yMm6uBv12+8xduuC8zBrgEjsBTEeM1ulLz1k5/oo0Kvv/ITNdaHiD+XcEo+PMElQKPTgH/Inth7DZOa5N3hR/jXYTMQQIwGfJ11uKZ/TBCKSNApZGNl87PKqTThN+aEjM4yc4SFx2hPQLAkD5PG4qqyGGWRykcw="}
{"auditRemark":null,"auditStatus":"1","authId":"8496379813794816000","custId":"2
0000000001203","customerId":"20000000001203","isManage":"0","mainCustId":"60000001057073","operationType":"0","sign":"d9FmeZoeoRblzvbqYywCQWBmuXR5x5B1oTS/csZx0L3OWBZK7NYccFSo3GXIGjr9I
NU5V8ZdSfTf157P4SWk81AJyieJ9WRAYuhMkcLBweofyPqv1coox4lHF/1wYNwun8fBo7jxjs/fCOEaGFRfm0BIO1nDduID8ciaPB1QUYDYpajeZanql7y/epBKucMW5Hy/C5v6gtNVUEz/rk2yuTkSUkk5ttjDC6ZYeDSBWRQ4SjTm4Wkb53G/
VegJzm0Z6hqS8YNNHMstzd94eC8/5acA4iMs4gTXAvHdulEiiz7KZYQzmfAjToVquh+Bf/23U6szDkcNV0jpBI0RK6S4MA==","signId":"8496379815405428736"}
import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.TypeReference;
import lombok.extern.log4j.Log4j2;
import org.apache.commons.lang3.ArrayUtils;
import sun.misc.BASE64Decoder;
import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.NoSuchPaddingException;
import java.security.InvalidKeyException;
import java.security.KeyFactory;
import java.security.NoSuchAlgorithmException;
import java.security.PublicKey;
import java.security.spec.X509EncodedKeySpec;
import java.util.TreeMap;
/**
* 公钥解签
*/
@Log4j2
public class RUtil {
/**
* 公钥解密过程
*
* @param key 公钥
* @param data 密文数据
* @return 明文
* @throws Exception 解密过程中的异常信息
*/
public static String decrypt(String key, String data) throws Exception {
if (key == null) {
throw new Exception("解密公钥为空, 请设置");
}
PublicKey publicKey = getPublicKey(key);
byte[] cipherData = Base64Util.decode(data);
Cipher cipher = null;
try {
// 使用默认RSA
cipher = Cipher.getInstance("RSA");
cipher.init(Cipher.DECRYPT_MODE, publicKey);
byte[] buf = (byte[]) null;
for (int i = 0; i < cipherData.length; i += 256) {
byte[] doFinal = cipher.doFinal(ArrayUtils.subarray(cipherData, i, i + 256));
if(buf == null) {
buf = doFinal;
} else {
buf = addBytes(buf,doFinal);
}
}
return new String(buf);
} catch (NoSuchAlgorithmException e) {
throw new Exception("无此解密算法");
} catch (NoSuchPaddingException e) {
e.printStackTrace();
return null;
} catch (InvalidKeyException e) {
throw new Exception("解密公钥非法,请检查");
} catch (IllegalBlockSizeException e) {
throw new Exception("密文长度非法");
} catch (BadPaddingException e) {
throw new Exception("密文数据已损坏");
}
}
/**
* 数组拼接
* @param data1 数组1
* @param data2 数组2
* @return
*/
public static byte[] addBytes(byte[] data1, byte[] data2) {
byte[] data3 = new byte[data1.length + data2.length];
System.arraycopy(data1, 0, data3, 0, data1.length);
System.arraycopy(data2, 0, data3, data1.length, data2.length);
return data3;
}
/**
* 验证sign
* plainText 返回数据报文
* publicKey 公钥
* @return
*/
public static boolean checkSign(String plainText,String publicKey) throws Exception {
TreeMap<String ,Object> map = JSONObject.parseObject(plainText, new TypeReference<TreeMap<String, Object>>(){});
System.out.println(JSONObject.toJSONString(map));
StringBuilder sb = new StringBuilder();
String sign = "";
for (String key : map.keySet()){
if("sign".equals(key)){
sign =(String) map.get(key);
continue;
}
sb.append(key).append("=").append(map.get(key)).append("&");
}
String res = sb.substring(0,sb.lastIndexOf("&"));
log.info("拼接字符串:"+res);
String sha256 = SHA256.getSHA256(res);
log.info("拼接串的SHA256:"+sha256);
String decodeSha256 = decrypt(publicKey,sign);
log.info("sign解密的SHA256:"+decodeSha256);
return sha256.equals(decodeSha256);
}
/**
* 得到公钥
*
* @param key 密钥字符串(经过base64编码)
* @throws Exception
*/
public static PublicKey getPublicKey(String key) throws Exception {
byte[] keyBytes;
keyBytes = new BASE64Decoder().decodeBuffer(key);
X509EncodedKeySpec keySpec = new X509EncodedKeySpec(keyBytes);
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
PublicKey publicKey = keyFactory.generatePublic(keySpec);
return publicKey;
}
}{
"code": "string",
"msg": "string"
}