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 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 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; } } /** * 响应结果 *

* 解密响应数据及验签 * * @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 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); } } /** * 解密轻花推送的数据 *

* 解密响应数据及验签 * * @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 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", "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAkIM6jaZfnLDU1t9E5Y0Iagp4yiPq5VKGQptUiqJiYqRI0/EGW6qFh48RzxSizIbYCz6Rz/gTakl+DvcrA9oSqF9GzQY+i3KV8jgyeuWvJC4/xoNkhgF/+SBVHsMWiofftzqYIaHPb3MeXL5fvCgHS5JRjDc+38zJ5cZ5WIuhwC6LKXxKhMEcajw8ZfFDIIqh23UpHLlzLEt8+GoTUuwnY13RaQ+5n2IhFCc8gw5X7c5Rl+Fj9j1rhyRiEejJ+Vui/6Lbz2uTOt3cj7pPW58aKmUhOc/BeQ7Xa0ZGFtCdOjF/XQP7spsyGanBscwXc9CVds79WVZaRIRataRphQhwKQIDAQAB", "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", 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; }