package com.nova.sankuai.infra.utils.qinghuayoupin;
|
|
import cn.hutool.core.util.IdUtil;
|
import cn.hutool.json.JSONObject;
|
import cn.hutool.json.JSONUtil;
|
import com.alibaba.fastjson.JSON;
|
import com.fasterxml.jackson.databind.ObjectMapper;
|
import com.fasterxml.jackson.databind.node.ObjectNode;
|
import com.nova.sankuai.domain.dto.qinghuayoupin.BaseInfo;
|
import com.nova.sankuai.domain.dto.qinghuayoupin.Gps;
|
import com.nova.sankuai.domain.dto.qinghuayoupin.UserProfile;
|
import org.apache.commons.codec.binary.Base64;
|
import org.apache.commons.lang3.RandomStringUtils;
|
import org.apache.commons.lang3.StringUtils;
|
import org.slf4j.Logger;
|
import org.slf4j.LoggerFactory;
|
import org.springframework.beans.BeanUtils;
|
import org.springframework.util.DigestUtils;
|
|
import javax.crypto.Cipher;
|
import javax.crypto.KeyGenerator;
|
import javax.crypto.SecretKey;
|
import javax.crypto.SecretKeyFactory;
|
import javax.crypto.spec.DESKeySpec;
|
import javax.crypto.spec.SecretKeySpec;
|
import java.lang.reflect.Type;
|
import java.math.BigDecimal;
|
import java.nio.charset.StandardCharsets;
|
import java.security.*;
|
import java.security.interfaces.RSAPrivateKey;
|
import java.security.interfaces.RSAPublicKey;
|
import java.security.spec.InvalidKeySpecException;
|
import java.security.spec.PKCS8EncodedKeySpec;
|
import java.security.spec.X509EncodedKeySpec;
|
import java.text.SimpleDateFormat;
|
import java.time.LocalDateTime;
|
import java.time.format.DateTimeFormatter;
|
import java.util.*;
|
import java.util.stream.Collectors;
|
|
public class QhypUtil {
|
private static final int MAX_RANDOM_LENGTH = 30; // 随机数的最大长度
|
private static final int MAX_SERIAL_NUMBER = 999999; // 序列号最大值
|
private static final int MAX_ENCRYPT_BLOCK = 117;
|
private static final int MAX_DECRYPT_BLOCK = 128;
|
private static final String KEY_ALGORITHM = "RSA";
|
private static final String SIGNATURE_ALGORITHM = "SHA1WithRSA";
|
private static final Logger log = LoggerFactory.getLogger("capitalLogger");
|
private static SecureRandom random;
|
public static String encrypt(String orgCode, String productCode, String data, String rsaPublicKey, String rsaPrivateKey,StringBuilder returnDesKey) {
|
String params, key,signature,desKey;
|
try {
|
//RSA私钥对【业务报文明文】进行签名
|
signature = signBase64(data,loadPrivateKey(rsaPrivateKey));
|
//使用DES对【业务报文明文】加密
|
desKey = generateKeyBase64();
|
returnDesKey.append(desKey);
|
log.info("加密前的desKey:"+ desKey);
|
params = encryptBase64(data,desKey);
|
log.info("加密后的desKey:"+ desKey);
|
//使用客户端公钥加密DES密钥
|
key = encryptWithBase64(desKey,loadPublicKey(rsaPublicKey));
|
} catch (Exception e) {
|
log.error("加密失败"+ e.getMessage());
|
throw new RuntimeException("加密失败", e);
|
}
|
// 组装数据
|
Map<String, Object> request = new HashMap<>(5, 1F);
|
request.put("orgCode", orgCode);
|
request.put("productCode", productCode);
|
request.put("transDate", new Date());
|
request.put("transSeq", generateSerialNumber());
|
request.put("data", params);
|
request.put("signature", signature);
|
request.put("desKey", key);
|
log.info("加密后的desKey:"+ desKey);
|
return JSON.toJSONString(request);
|
}
|
public static String respEncrypt(String respCode, String respMsg, String transDate, String transSeq, String signature
|
, String data,String rsaPublicKey, String rsaPrivateKey,String desKey) {
|
String params;
|
try {
|
//RSA私钥对【业务报文明文】进行签名
|
signature = signBase64(data,loadPrivateKey(rsaPrivateKey));
|
//使用DES对【业务报文明文】加密
|
String decryDesKey = decryptWithBase64(desKey, loadPrivateKey(rsaPrivateKey));
|
params = encryptBase64(data,decryDesKey);
|
//使用客户端公钥加密DES密钥
|
encryptWithBase64(decryDesKey,loadPublicKey(rsaPublicKey));
|
} catch (Exception e) {
|
log.error("加密失败"+ e.getMessage());
|
throw new RuntimeException("加密失败", e);
|
}
|
// 组装数据
|
Map<String, Object> request = new HashMap<>(5, 1F);
|
request.put("respCode", respCode);
|
request.put("respMsg", respMsg);
|
request.put("transDate", new SimpleDateFormat("yyyyMMddHHmmss").format(new Date()));
|
request.put("transSeq", generateSerialNumber());
|
request.put("data", params);
|
request.put("signature", signature);
|
return JSON.toJSONString(request);
|
}
|
/**
|
* 签名
|
* @param dataToSign
|
* @return
|
* @throws Exception
|
*/
|
public static byte[] signData(byte[] dataToSign,PrivateKey serverPrivateKey) throws Exception {
|
Signature signature = Signature.getInstance("SHA256withRSA");
|
signature.initSign(serverPrivateKey);
|
signature.update(dataToSign);
|
return signature.sign();
|
}
|
|
/**
|
* 使用DES加密报文
|
* @param dataToEncrypt
|
* @return
|
* @throws Exception
|
*/
|
public static byte[] encryptDataWithDes(byte[] dataToEncrypt,byte[] desKeyBytes) throws Exception {
|
SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
|
DESKeySpec desKeySpec = new DESKeySpec(desKeyBytes); // 随机生成或者使用固定的密钥
|
SecretKey desKey = keyFactory.generateSecret(desKeySpec);
|
|
Cipher cipher = Cipher.getInstance("DES");
|
cipher.init(Cipher.ENCRYPT_MODE, desKey);
|
return cipher.doFinal(dataToEncrypt);
|
}
|
|
/**
|
* 使用客户端公钥加密DES密钥
|
* @param clientPublicKey
|
* @param desKeyBytes
|
* @return
|
* @throws Exception
|
*/
|
public static byte[] encryptDesKeyWithClientPublicKey(PublicKey clientPublicKey, byte[] desKeyBytes) throws Exception {
|
|
Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
|
cipher.init(Cipher.ENCRYPT_MODE, clientPublicKey);
|
return cipher.doFinal(desKeyBytes);
|
}
|
public static byte[] decryptEncryptedDesKey(byte[] encryptedDesKey,PrivateKey clientPrivateKey) throws Exception {
|
Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
|
cipher.init(Cipher.DECRYPT_MODE, clientPrivateKey);
|
try {
|
return cipher.doFinal(encryptedDesKey);
|
}catch (Exception e){
|
e.printStackTrace();
|
return null;
|
}
|
|
}
|
/**
|
* 响应结果
|
* <p>
|
* 解密响应数据及验签
|
*
|
* @param response 响应数据
|
* @param sign 签名, 响应数据中的sign字段
|
* @param data 密文业务数据, 响应数据中的data字段
|
* @param rsaPublicKey rsa公钥
|
* @param rsaPrivateKey rsa私钥
|
* @return 解密后的业务数据
|
*/
|
public static String decrypt(Object response, String sign, String data, String rsaPublicKey, String rsaPrivateKey,String desKey) {
|
|
HashMap<String, String> map = com.alibaba.fastjson.JSONObject.parseObject(JSON.toJSON(response).toString(), HashMap.class);
|
try {
|
String result = "";
|
// 解密DES密钥
|
// String desKey = map.get("desKey");
|
// 解密数据
|
result = decryptBase64(data, desKey);
|
// 验签
|
boolean isVerified = verifyBase64(result, sign, loadPublicKey(rsaPublicKey));
|
String logNumber = IdUtil.randomUUID();
|
log.info("日志编号:{}, sign: {}, isSignCorrect: {}", logNumber, sign, isVerified);
|
if (!isVerified) {
|
throw new RuntimeException("验签失败");
|
}
|
return result;
|
} catch (Exception e) {
|
log.error("解密失败" + e.getMessage(), e);
|
throw new RuntimeException("解密失败", e);
|
}
|
}
|
/**
|
* 解密轻花推送的数据
|
* <p>
|
* 解密响应数据及验签
|
*
|
* @param response 响应数据
|
* @param sign 签名, 响应数据中的sign字段
|
* @param data 密文业务数据, 响应数据中的data字段
|
* @param rsaPublicKey rsa公钥
|
* @param rsaSelfPrivateKey rsa私钥
|
* @return 解密后的业务数据
|
*/
|
public static String decryptDataFromQh(Object response, String sign, String data, String rsaPublicKey, String rsaSelfPrivateKey) {
|
|
HashMap<String, String> map = com.alibaba.fastjson.JSONObject.parseObject(JSON.toJSON(response).toString(), HashMap.class);
|
try {
|
String result = "";
|
// 使用我方私钥解密DES密钥
|
String desKey = map.get("desKey");
|
String decryDesKey = decryptWithBase64(desKey, loadPrivateKey(rsaSelfPrivateKey));
|
// 解密数据
|
result = decryptBase64(data, decryDesKey);
|
// 验签
|
boolean isVerified = verifyBase64(result, sign, loadPublicKey(rsaPublicKey));
|
String logNumber = IdUtil.randomUUID();
|
log.info("日志编号:{}, sign: {}, isSignCorrect: {}", logNumber, sign, isVerified);
|
if (!isVerified) {
|
throw new RuntimeException("验签失败");
|
}
|
return result;
|
} catch (Exception e) {
|
log.error("解密失败" + e.getMessage(), e);
|
throw new RuntimeException("解密失败", e);
|
}
|
}
|
|
public static byte[] getDesKey() {
|
// 生成一个随机的DES密钥
|
return generateDesKey();
|
}
|
|
private static byte[] generateDesKey() {
|
byte[] desKeyBytes = new byte[8]; // DES密钥长度为8字节
|
random = new SecureRandom();
|
random.nextBytes(desKeyBytes); // 生成随机的8字节数组
|
return desKeyBytes;
|
}
|
public static PublicKey getPublicKeyFromBase64String(String publicKeyStr) throws Exception {
|
// 解码公钥字符串
|
byte[] keyBytes = Base64.decodeBase64(publicKeyStr);
|
|
// 创建X509编码规范对象
|
X509EncodedKeySpec keySpec = new X509EncodedKeySpec(keyBytes);
|
|
// 获取KeyFactory实例
|
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
|
// 生成PublicKey
|
return keyFactory.generatePublic(keySpec);
|
}
|
public static PrivateKey getPrivateKeyFromBase64String(String privateKeyStr) throws Exception {
|
// 解码公钥字符串
|
byte[] keyBytes = Base64.decodeBase64(privateKeyStr);
|
|
// 创建PKCS8编码规范对象
|
PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(keyBytes);
|
// 获取KeyFactory实例
|
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
|
// 生成privateKey
|
return keyFactory.generatePrivate(keySpec);
|
}
|
/**
|
* 流水号
|
* @return
|
*/
|
public static String generateSerialNumber() {
|
// 当前时间戳
|
LocalDateTime now = LocalDateTime.now();
|
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMddHHmmssSSS");
|
String timestamp = now.format(formatter);
|
|
// 生成随机数
|
Random random = new Random();
|
String randomNumber = String.format("%0" + MAX_RANDOM_LENGTH + "d", random.nextInt((int)Math.pow(10, MAX_RANDOM_LENGTH)));
|
|
// 序列号
|
int serialNumber = random.nextInt(MAX_SERIAL_NUMBER);
|
String serial = String.format("%06d", serialNumber); // 格式化序列号为6位
|
|
// 组合流水号
|
int totalLength = timestamp.length() + serial.length();
|
int randomLength = Math.min(MAX_RANDOM_LENGTH, 50 - totalLength);
|
|
String serialNumberStr = timestamp + randomNumber.substring(0, randomLength) + serial;
|
return serialNumberStr;
|
}
|
|
|
|
public static byte[] decryptDataWithDes(byte[] encryptedData, byte[] desKeyBytes) throws Exception {
|
SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
|
DESKeySpec desKeySpec = new DESKeySpec(desKeyBytes);
|
SecretKey desKey = keyFactory.generateSecret(desKeySpec);
|
|
Cipher cipher = Cipher.getInstance("DES");
|
cipher.init(Cipher.DECRYPT_MODE, desKey);
|
return cipher.doFinal(encryptedData);
|
}
|
|
public static boolean verifySignature(byte[] data, String signatureStr, PublicKey serverPublicKey) throws Exception {
|
byte[] signatureBytes = Base64.decodeBase64(signatureStr);
|
Signature signature = Signature.getInstance("SHA256withRSA");
|
signature.initVerify(serverPublicKey);
|
signature.update(data);
|
return signature.verify(signatureBytes);
|
}
|
|
public static void main(String[] args) throws Exception {
|
SimpleDateFormat simpleDateFormat2 = new SimpleDateFormat("yyyyMMdd");
|
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
|
|
System.out.println(simpleDateFormat.format( simpleDateFormat2.parse("20230303")));
|
loadPublicKey("MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAwIYDYcdeJAYQSXul0VJC58PpWp/AJL0QtKjSo5CodH/OBXIHyTYKu0EN3VDGR0RNsbbgXco0HsNQ65tdgcbhopr9HK3atY0qoiyF9PB/PwrqE7K2D+hl2nte+UVj/P1i0iJsjf77KAkNTm4boQJc2mogubQHZVufMgi2pJvrbmQimoWK39xW7BRFsoAW8RLRD6BP7zHymuhp9rE45cpum/lhfXx0LMWBImFa4inTO+HOFrczl1a5oPFg5+RSfzifPj1JFxLl86+bFX7KvSlrSy1nwJbMYaFYioRVy6G6fLRDkSEb8HR9JPka15A3CsiUGgOXIsqylTXLaHpuZCG1QwIDAQAB");
|
loadPrivateKey("MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQDAhgNhx14kBhBJe6XRUkLnw+lan8AkvRC0qNKjkKh0f84FcgfJNgq7QQ3dUMZHRE2xtuBdyjQew1Drm12BxuGimv0crdq1jSqiLIX08H8/CuoTsrYP6GXae175RWP8/WLSImyN/vsoCQ1ObhuhAlzaaiC5tAdlW58yCLakm+tuZCKahYrf3FbsFEWygBbxEtEPoE/vMfKa6Gn2sTjlym6b+WF9fHQsxYEiYVriKdM74c4WtzOXVrmg8WDn5FJ/OJ8+PUkXEuXzr5sVfsq9KWtLLWfAlsxhoViKhFXLobp8tEORIRvwdH0k+RrXkDcKyJQaA5ciyrKVNctoem5kIbVDAgMBAAECggEAVsiSIbNjBk4NbXJlTrQMILk5KXa1gFoRe75WJRECPnGWBvJd/B92Ou6aN1c/6cQqWZ+cB+ssD2nvwiTow6VI9Kl0y0a7PfeCblQvljgKw/pBhdubIhSaRSAzsZ3L8rCtqReHY4K66FMcQmxz2+JaxMHuOoeihdgFLOKsogr+12VXlbdy8yJx20KwxItqeLBD43E3ulbe1GdXjjpSizdCaAr7HsuVeAmb4kU4p5AQJ9KsKVGgYQcvhCRLvaEVMMRVpZ+z1iwuBDLnptb8TC3kcIAjH+GHB07E4uouXUoaFXFI6/c5+ABlWKbu7X6Kh6bU208Q33HINpMQMXHuBWzNYQKBgQDqxwM5MzxyVa+vaZcao6dnnDEXit7ECDg7Fs7BOwWUhi4NLT+Pxm7I5q7ZSO5njJuemVsboIjHvCS/cMgNZgGpqQr3A9xki+q35ImfYlSdpUrmr3XgyE5nypiXVMh3FNKiH25URLwohgbar5DfrzmPUm6Ro5bAgIvRsqAzMu0mCwKBgQDR7TPNe9ejlJpiDhYSm1oTXn0cHHJv+FoU7vJRoQNed6JvUUWJxyRNwEEm3NXK51D3NxVVLCLzMw01P+LK2FkQSmaG60yDuXXtdBxc4KB+Aeikhsjr8DUTtabKB164K6BFdNETWIJvnSijxckp3IatjNjfLE1FAfhFemwqP3HIqQKBgCw2ql69TWbiyCEqq3Ay3bXfbkdWubkFK0HFe85cBSMBWe7VVKEI55giCU+WMn+BtVTa4JOFWfzza6A55xLO4QVIdm4qZfjxeJSFD33akMDXfhGPfY2Fa26UcsQdDVuPqlMpxCdOgnjHNMc+RPQ7FYXuKjB3NE6wZqRpFU5PCuYdAoGANlHIe7012TAUmpbGg14LesOSX/nEatC6jnwd251sP795GpDPC42qCSxcL3ApKe2c97sbHATlrkRhgIvdZVuCAEMgMH0mOVd9+kl3JVlCbhiUWC5AQzzOnyD73X72tXUkbZSCnRzj83mZEHeXS+uyNaoiW+0cuWR/F4tL/cqY6LECgYBPFV3EA/tAG/gJpLZK9MJTu6aMLcMaORkgLzuFzRxYK0aKNMwYOTGiESJuOnVgx+7L876CHKBCIwzZhLrInVKH1QVB1rx5IY1XZacY4lehuLzA2DCB2FUhvNTTXEYTRXQckxLa7Q1QJdfMa13c8m5Xjp3eG1sLoB4Or50+/JVELQ==");
|
StringBuilder sb = new StringBuilder();
|
String desKey2= "";
|
encrypt("orgCode", "productCode", "data",
|
"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", sb);
|
System.out.println("111111"+sb.toString());
|
// KeyPairGenerator类用于生成公钥和私钥对,基于RSA算法生成对象
|
KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance("RSA");
|
// 初始化密钥对生成器
|
keyPairGen.initialize(2048, new SecureRandom());
|
// 生成一个密钥对,保存在keyPair中
|
KeyPair keyPair = keyPairGen.generateKeyPair();
|
// 得到私钥
|
RSAPrivateKey privateKey = (RSAPrivateKey) keyPair.getPrivate();
|
// 得到公钥
|
RSAPublicKey publicKey = (RSAPublicKey) keyPair.getPublic();
|
String publicKeyString = Base64.encodeBase64String(publicKey.getEncoded());
|
String privateKeyString = Base64.encodeBase64String(privateKey.getEncoded());
|
String privateSelf = "MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDPPZlDGVBFxjiKKU0wGwZp+MwKp+VJndp2IgGBLRyFHjfCe4Dlzd6Dn5exZjcUd661QuioUgN76UluvHr/cHGwGObLraETjebGfwczXMAkFytr1/2cvjTK+CsBtNwGqv1MGUHmgeh+MM+WSr2gysuklJO70e8pe1IcV5ZI5YoMoPasfVS73kOmJcxgxtp9UYjqegjSDU8/rQqIbc8kdXKcyhVRm0HrZogq0LxhJweKHHNn5/BVketzJzduduyRIyLgpJJsA7AcBubJPJXKPRkzW/XU6UkGWe63uc6i/PTqXjoiSCecXcP6FKHYIxblT6ff1kqa1ciWN5i+tiJAOjXdAgMBAAECggEATT1eI/4JRxgr9oKSPD22VETgd5BACwIEbEccXHLd0FeE3L1/OydRqakPtpSsLrq0qOY5JJL8rXAzaExjY1UbalC9pGggQtN+kbjCjEgjbNAd5OHpqkPSFVwNW2N3Jh0Qrw4y26DLcEzs8c0FhCpRYBPoQ/ZotwM5hUq3vo+etjmUOEniDZsm8Lj8cOom/1qAMdm3mbkAcwRppx7/WEMWvOQLznMyidwe/ttm/F/cfSjDZXlSZqDPSFL01sagzrhHml78Gd/gWmAuQhdctLmMiUHg3DthqCQSNZiHQETTLDg7Vd49KhrqRJ27S+YBGvo5It+hPU/IVVCmKveMj88SQQKBgQDrz5Wte3WYGeIyET+mYHA8gjFmaVqAut53cgYZYIQd2pSuiTt8P+040kUgP1jBkMlX5nZhM7qSWU5w1UxwroxPMlUqVNI3uQtDxeLLgl7MhotsvKid+lzq+IohKIr1Pk4qUljPneFgzjkBol0RCzITuFLTu6cR5EDQF+x/NIz19QKBgQDg+9JaZFhFzZ9BFF6Exub2dmQ/BDmLQPz5zXlawmMT0iGF3PKTFEX3ggYGfevyCMfrNVi+Beh5bqyumbduj4IdH1PC+DvSn03MXehMJ+ZV3lzZWrKCjf40rIXh6kB+ehOLxrIKykVBXZ62mb7Cfj/UCGYjakVQSbE9Xi5G4rjnSQKBgGo2mxWD6Wi0J+UjTccT4xnuDnAxfflDslacvlCJ35hOzu96kpeZd7FDTK2Euuac34O/I40OrreikClUedS7WimF40Ro5jMBHyjMpiXCOA7pfz1gEJbvoRCZGCZtS4HBKZX4d1Y0p8JhwN2Sk1bM8yZcvLnv6QWvCN5yGC0Hr4JNAoGBAK/aBRQkJJ8C1nyOyEYuFa8E4NwkmDnRJSq3wSgAkmKWtx8jkPMHQJzyI3WFjRuUY3bkLqXwhkIMEKs0eRzQzNmod9cIIfJCFBQuPnjwIuhxMs+tRaQoCk7vnoHzkE+LaaWyO82VRkaOP5ToXSM2fPtlSThbQyw7PW8DI1bCtdYJAoGBALtLp1uOPMAiphfKayJYTaldDByQ4673ExcwYXC5KI4dyyimYIq7520y5yMzpIupn9wXd0JQAUswEGZOpuuFAFTxDbpGtY1VVWUN2kOgfHAT8r5wLpB4Mz0wTfbYlf3ZTevm89JRJvV66e7OxVRqVnLTwXjBKRuxxrIP/xlmjgQ7";
|
String pubblicSelf = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAzz2ZQxlQRcY4iilNMBsGafjMCqflSZ3adiIBgS0chR43wnuA5c3eg5+XsWY3FHeutULoqFIDe+lJbrx6/3BxsBjmy62hE43mxn8HM1zAJBcra9f9nL40yvgrAbTcBqr9TBlB5oHofjDPlkq9oMrLpJSTu9HvKXtSHFeWSOWKDKD2rH1Uu95DpiXMYMbafVGI6noI0g1PP60KiG3PJHVynMoVUZtB62aIKtC8YScHihxzZ+fwVZHrcyc3bnbskSMi4KSSbAOwHAbmyTyVyj0ZM1v11OlJBlnut7nOovz06l46IkgnnF3D+hSh2CMW5U+n39ZKmtXIljeYvrYiQDo13QIDAQAB";
|
|
String pub = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAkIM6jaZfnLDU1t9E5Y0Iagp4yiPq5VKGQptUiqJiYqRI0/EGW6qFh48RzxSizIbYCz6Rz/gTakl+DvcrA9oSqF9GzQY+i3KV8jgyeuWvJC4/xoNkhgF/+SBVHsMWiofftzqYIaHPb3MeXL5fvCgHS5JRjDc+38zJ5cZ5WIuhwC6LKXxKhMEcajw8ZfFDIIqh23UpHLlzLEt8+GoTUuwnY13RaQ+5n2IhFCc8gw5X7c5Rl+Fj9j1rhyRiEejJ+Vui/6Lbz2uTOt3cj7pPW58aKmUhOc/BeQ7Xa0ZGFtCdOjF/XQP7spsyGanBscwXc9CVds79WVZaRIRataRphQhwKQIDAQAB";
|
String pri = "MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQCQgzqNpl+csNTW30TljQhqCnjKI+rlUoZCm1SKomJipEjT8QZbqoWHjxHPFKLMhtgLPpHP+BNqSX4O9ysD2hKoX0bNBj6LcpXyODJ65a8kLj/Gg2SGAX/5IFUewxaKh9+3Opghoc9vcx5cvl+8KAdLklGMNz7fzMnlxnlYi6HALospfEqEwRxqPDxl8UMgiqHbdSkcuXMsS3z4ahNS7CdjXdFpD7mfYiEUJzyDDlftzlGX4WP2PWuHJGIR6Mn5W6L/otvPa5M63dyPuk9bnxoqZSE5z8F5DtdrRkYW0J06MX9dA/uymzIZqcGxzBdz0JV2zv1ZVlpEhFq1pGmFCHApAgMBAAECggEACOF/qi/UxWDam5/Z8I9zumyNUsLVTyV8qcA4+FIVYMF+1kOEJAL9NMD2k7bNcGtDAKHmPRUeQFRm4k2PP6vZpK5CQBxHoLM4gsuwUnwmAL+03KK7fT6/WhSCFqNfkcDa3zxDGCIFCPDWp1VttbbyB9NknozQmNlReQTy9R2ToadC8NGdKtJFL090JaDoxaT+NxTR7hOCdv5JTnak0lHHqtooXO5jwRHTSRy9BSZPOe5RJiCMZFEQqzHU0nW9fb1E52vxgBwEEc23h4yFaWSslBb+eBjYYaYEZ19U+51joSDbxzNf9LDpOSdAEEaTMyichz3Q3RdHjs2OvIHUXDFYeQKBgQC7IYE9tFzMlgwJtaVdKrV4Ib+7grL2p2Xks+T4ICjnwFMavx8JNpUoX0Y3bIVsxnPQWEeWMIN6cQ99HueFA8l/ktLr43FpXdVSIvUqEQRkoXH09QP1d5B5sTeqm0m84XW0NBj7XVVwsmnjqLa3Z8QSVQ+0QTLcOE7vYyYd7wDPzQKBgQDFsnQC5v4SAjsaDYIPboWfcHtc098bRH3XRkVl4xyeduiRB2S+TOxZW6qyZlE2prsluKTc0EfQt1dI6lMcHw+aRpa8RgNeaOKzFptzanGmMxJYyfDKvCcfYOUcIy6y7gMV39ezMfjBHPpQy/2aq0lEPt503QQVMf1Sh09cx0ctzQKBgQCTtQSgwgcl7aIe3+RhP97xriH7TlUY4FVLSrwHJsti8qomSImk6hKeRWXVRbGjhJnR8HzBDhYZxbhmGMjCc5TPQAOA8oyIkOpa5QEDbV88VzruEaBIV1IQ3FOGNQDlOEmCLkUx1CAmzo1Kh9eBuURI/B9jNruAnGmiB28E3ayUWQKBgQDERfRpgT2TUYWtyuVqPrcI4RqIwYyKPMiW9pwlmIIsTS999RIu4J3x5VEmBvDwSj4ZKCT9WQdDjxJoQMO8cpYB+7zhNL1ZeNZBKNuyjWZBtAit/+dAz+YjgAZWlhNh720+xVoX/S/TQdq+Zpfke9Oknqoq6daI2HWA/vdqzCm9rQKBgAWiKM+ZgFSokQzvFtgpsa3UGLv/OyjMF85n/mVfgT5rvcnykMZPmKATFW9pwhIjte/eQy/FPJX948l+hMhSeq8ajPJXK2QfucIgqSDjC8GJA2RfMDIM+UKHlIl80yfNGkRpkgM0qDjp3AEm78k6FEyBoygYY0divE1waK3dx1Pa";
|
JSONObject param = new JSONObject();
|
param.putOpt("certNoMd5", DigestUtils.md5DigestAsHex("4600251889".getBytes()));
|
param.putOpt("phoneMd5", DigestUtils.md5DigestAsHex("13988889999".getBytes()));
|
|
String signature = signBase64(param.toString(),loadPrivateKey(privateSelf));
|
//使用DES对【业务报文明文】加密
|
String desKey = generateKeyBase64();
|
String params = encryptBase64(param.toString(),desKey);
|
//使用客户端公钥加密DES密钥
|
String key = encryptWithBase64(desKey,loadPublicKey(pub));
|
|
String keyStr = decryptWithBase64(key,loadPrivateKey(pri));
|
String data = decryptBase64(params, keyStr);
|
|
boolean isVerified = verifyBase64(data,signature,loadPublicKey(pubblicSelf));
|
System.out.println("Decrypted data: " +data);
|
System.out.println("Verification result: " + isVerified);
|
UserProfile userProfile = new UserProfile();
|
BaseInfo baseInfo = new BaseInfo();
|
baseInfo.setCar("dsdsdsds");
|
userProfile.setBaseInfo(baseInfo);
|
// JSONObject param2 = new JSONObject();
|
// BeanUtils.copyProperties(userProfile, param2);
|
// System.out.println(param2.toString());
|
// UserProfile userProfile = new UserProfile();
|
// BaseInfo baseInfo = new BaseInfo();
|
// baseInfo.setCar("dsdsdsds");
|
// userProfile.setBaseInfo(baseInfo);
|
|
ObjectMapper objectMapper = new ObjectMapper();
|
ObjectNode param2 = objectMapper.createObjectNode();
|
|
// 将 UserProfile 对象转换为 JSON Node
|
ObjectNode userNode = objectMapper.valueToTree(userProfile);
|
|
// 将 JSON Node 的内容复制到 param2
|
param2.setAll(userNode);
|
|
}
|
public static final int DEFAULT_KEY_SIZE = 56;
|
public static final String DES_ALGORITHM = "DES";
|
public static final String DES_TRANSFORMATION = "DES/ECB/PKCS5Padding";
|
|
//DES的加解密
|
|
/**
|
* 生成秘钥base64编码
|
*
|
* @return base64编码的密钥
|
* @throws Exception 异常
|
*/
|
public static String generateKeyBase64() throws Exception {
|
// 以DES的方式初始化Key生成器
|
KeyGenerator keyGenerator = KeyGenerator.getInstance(DES_ALGORITHM);
|
keyGenerator.init(DEFAULT_KEY_SIZE); // 设置密钥的长度为56位
|
// 生成一个Key
|
SecretKey generateKey = keyGenerator.generateKey();
|
// 转变为字节数组
|
byte[] encoded = generateKey.getEncoded();
|
// 生成密钥字符串
|
return java.util.Base64.getEncoder().encodeToString(encoded);
|
}
|
|
/**
|
* 加密
|
*
|
* @param data 明文字符串
|
* @param key base64密钥
|
* @return 加密后base64字符串
|
* @throws Exception 异常
|
*/
|
public static String encryptBase64(String data, String key) throws Exception {
|
// 再把我们的字符串转变为字节数组,可以用于另一方使用,验证
|
byte[] decodeHex = java.util.Base64.getDecoder().decode(key);
|
// 生成密钥对象
|
SecretKeySpec secretKeySpec = new SecretKeySpec(decodeHex, DES_ALGORITHM);
|
|
// 获取加解密实例
|
Cipher cipher = Cipher.getInstance(DES_TRANSFORMATION);
|
// 初始化加密模式
|
cipher.init(Cipher.ENCRYPT_MODE, secretKeySpec);
|
// 加密
|
byte[] resultArr = cipher.doFinal(data.getBytes(StandardCharsets.UTF_8));
|
return java.util.Base64.getEncoder().encodeToString(resultArr);
|
}
|
|
/**
|
* 解密
|
*
|
* @param data 加密base64密文
|
* @param key base64密钥
|
* @return 明文
|
* @throws Exception 异常
|
*/
|
public static String decryptBase64(String data, String key) throws Exception {
|
byte[] decodeHex = java.util.Base64.getDecoder().decode(key);
|
// 生成密钥对象
|
SecretKeySpec secretKeySpec = new SecretKeySpec(decodeHex, DES_ALGORITHM);
|
|
// 获取加解密实例
|
Cipher cipher = Cipher.getInstance(DES_TRANSFORMATION);
|
|
// 初始化解密模式
|
cipher.init(Cipher.DECRYPT_MODE, secretKeySpec);
|
// 解密
|
byte[] resultArr = cipher.doFinal(java.util.Base64.getDecoder().decode(data));
|
|
return new String(resultArr, StandardCharsets.UTF_8);
|
}
|
//RSA的加解密
|
public static final String DEFAULT_ALGORITHM = "RSA"; // 加解密算法
|
|
public static final String DEFAULT_TRANSFORMATION = "RSA/ECB/PKCS1Padding"; // 加解密算法
|
private static final KeyFactory KEY_FACTORY;
|
|
static {
|
try {
|
KEY_FACTORY = KeyFactory.getInstance(DEFAULT_ALGORITHM);
|
} catch (NoSuchAlgorithmException e) {
|
throw new RuntimeException(e);
|
}
|
}
|
|
|
public static PrivateKey loadPrivateKey(String keyStr) throws InvalidKeySpecException {
|
return KEY_FACTORY.generatePrivate(new PKCS8EncodedKeySpec(java.util.Base64.getDecoder().decode(keyStr)));
|
}
|
|
public static PublicKey loadPublicKey(String keyStr) throws InvalidKeySpecException {
|
return KEY_FACTORY.generatePublic(new X509EncodedKeySpec(java.util.Base64.getDecoder().decode(keyStr)));
|
}
|
|
|
/**
|
* RSA 签名
|
*/
|
public static String signBase64(String content, PrivateKey privateKey) throws Exception {
|
Signature signature = Signature.getInstance(SIGNATURE_ALGORITHM);
|
signature.initSign(privateKey);
|
signature.update(content.getBytes(StandardCharsets.UTF_8));
|
byte[] signed = signature.sign();
|
|
return java.util.Base64.getEncoder().encodeToString(signed);
|
}
|
|
/**
|
* 数字签名验证
|
*/
|
public static boolean verifyBase64(String content, String sign, PublicKey publicKey) throws Exception {
|
Signature signature = Signature.getInstance(SIGNATURE_ALGORITHM);
|
signature.initVerify(publicKey);
|
signature.update(content.getBytes(StandardCharsets.UTF_8));
|
return signature.verify(java.util.Base64.getDecoder().decode(sign));
|
}
|
|
/**
|
* 公钥加密
|
*/
|
public static String encryptWithBase64(String data, PublicKey publicKey) throws Exception {
|
Cipher cipher = Cipher.getInstance(DEFAULT_TRANSFORMATION);
|
cipher.init(Cipher.ENCRYPT_MODE, publicKey);
|
return java.util.Base64.getEncoder().encodeToString(cipher.doFinal(data.getBytes()));
|
}
|
|
/**
|
* 私钥解密
|
*/
|
public static String decryptWithBase64(String data, PrivateKey privateKey) throws Exception {
|
Cipher cipher = Cipher.getInstance(DEFAULT_TRANSFORMATION);
|
cipher.init(Cipher.DECRYPT_MODE, privateKey);
|
return new String(cipher.doFinal(java.util.Base64.getDecoder().decode(data)));
|
}
|
|
public static KeyPair generateKey(int keySize) throws NoSuchAlgorithmException {
|
//初始化密码对生成器("RSA",密钥算法标识)
|
KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance("RSA");
|
//初始化密码对生成器("1024", 密钥长度, 还支持2048, 4096 长度,第二个参数是个随机数)
|
keyPairGen.initialize(keySize, new SecureRandom());
|
//使用密码对生成器,产生一对密钥
|
KeyPair keyPair = keyPairGen.generateKeyPair();
|
return keyPair;
|
}
|
|
private static final int RSA_LENGTH = 2048;
|
}
|