package com.fzzy.igds.dzhwk.v1.util; import com.ruoyi.common.utils.StringUtils; import lombok.extern.slf4j.Slf4j; import javax.crypto.Cipher; import java.io.ByteArrayOutputStream; import java.security.KeyFactory; import java.security.PrivateKey; import java.security.PublicKey; import java.security.spec.PKCS8EncodedKeySpec; import java.security.spec.X509EncodedKeySpec; import java.util.Arrays; import java.util.Base64; @Slf4j public class ApiV1Utils { public static final String KEY_ALGORITHM = "RSA"; public static final String PRIVATE_KEY = "MIICdwIBADANBgkqhkiG9w0BAQEFAASCAmEwggJdAgEAAoGBAJGxqYyI/k6nYkm2nf4ggkAMViEvbnplbQqw6Qweu4neFXCC+iKY8cq5RZEj8JLfrm/gHBTPN8FF1sQIwWwsDV7UUc88DS5KwAi5JXBHMdcbh2tftkINr0YVn6rIgUBTbmPZ7Y8L2iW8psYsF9nxwvUUtcbFJXIMJfi39Qxl0NQvAgMBAAECgYBKWLHfoCy9sFbMrN7UxnwQ+PqetpiW5tkNApf58ljbErQ4FO5V51xDieXBGejy2igmuOM7jz6xZtUgdiNV8uji/RtiNRqsBekVBPMeYAnPwA4GQ0HNwyHJ3ebJNQqT9bwrk8QpRUuCnrx/U1l7P1QNR5o52H1HpEKPlS0ga0fuQQJBAMdiSFYKt8/PwsYclvU/GqXrPy4cxMBhtE/ZssH9KourxnJcyfRz7EPgfSZykxlGHn8j/r8C2XxtAIYW6mRckqECQQC7EIZCZ3eV8abSIB33oKmw2jZlPQrHXMt8DWz8FYbNIA/9bvk9e9O42iQwMUtHfOMcNMWbcvKR/J+83bcE08TPAkA1ErdYl+/H1HDvVUrlq0+HnPArcSL6ZsedfcB0nNRHa4kehg6IEJdylf4aTuNTFfQmOcmkxLhpw4YhK1ZnMrEhAkEAuiMLNXA3MmCumk+TAiBAOdYoYjyHSTEw2VOSqpPQ+rN4tbmDEIbyefG2KK4kNhIy+pIYP0H11QYG/KuxvX/rSQJBALs0TqUgcGOp9+IkOq4jCXiVkP5/r7JWinQ4d6bYhJ4wspQYloYFCHljKKXtst1m8I3PC+vJY8R6va/3xtQKT8U="; private static final String CHARSET = "utf-8"; private static final int RESERVE_BYTES = 11; private static final int KEYSIZE = 1024;// 密钥位数 // 2048 bits 的 RSA 密钥对,最大解密密文大小 private static final int MAX_DECRYPT_BLOCK = KEYSIZE / 8; // 2048 bits 的 RSA 密钥对,最大加密明文大小 private static final int MAX_ENCRYPT_BLOCK = MAX_DECRYPT_BLOCK - RESERVE_BYTES; // 获取公钥 public static PublicKey getPublicKey(String publicKeyString) throws Exception { byte[] publicKeyByte = Base64.getDecoder().decode(publicKeyString); X509EncodedKeySpec keySpec = new X509EncodedKeySpec(publicKeyByte); KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM); return keyFactory.generatePublic(keySpec); } // 获取私钥 public static PrivateKey getPrivateKey(String privateKeyString) throws Exception { byte[] privateKeyByte = Base64.getDecoder().decode(privateKeyString); PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(privateKeyByte); KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM); return keyFactory.generatePrivate(keySpec); } /** * 私钥解密 * * @param secretText 待解密的密文字符串 * @param privateKeyStr 私钥 * @return 解密后的明文 */ public static String decrypt(String secretText, String privateKeyStr) { try { if (StringUtils.isEmpty(privateKeyStr)) { privateKeyStr = PRIVATE_KEY; } // 生成私钥 Cipher cipher = Cipher.getInstance(KEY_ALGORITHM); cipher.init(Cipher.DECRYPT_MODE, getPrivateKey(privateKeyStr)); // 密文解码 byte[] data = Base64.getDecoder().decode(secretText); // 返回UTF-8编码的解密信息 int inputLen = data.length; ByteArrayOutputStream out = new ByteArrayOutputStream(); int offSet = 0; byte[] cache; int i = 0; // 对数据分段解密 while (inputLen - offSet > 0) { if (inputLen - offSet > MAX_DECRYPT_BLOCK) { cache = cipher.doFinal(data, offSet, MAX_DECRYPT_BLOCK); } else { cache = cipher.doFinal(data, offSet, inputLen - offSet); } out.write(cache, 0, cache.length); i++; offSet = i * MAX_DECRYPT_BLOCK; } out.close(); return out.toString(CHARSET); } catch (Exception e) { throw new RuntimeException("解密字符串[" + secretText + "]时遇到异常", e); } } /** * 公钥加密 * * @param text 待加密的明文字符串 * @param publicKeyStr 公钥 * @return 加密后的密文 */ public static String encrypt(String text, String publicKeyStr) { String result = ""; try { // log.info("明文字符串为:[{}]", text); // 加密 Cipher cipher = Cipher.getInstance(KEY_ALGORITHM); cipher.init(Cipher.ENCRYPT_MODE, getPublicKey(publicKeyStr)); byte[] textArray = text.getBytes(); int textLength = textArray.length; // log.info("加密字节数={}", textLength); // 最大加密字节数,超出最大字节数需要分组加密 int MAX_ENCRYPT_BLOCK = 117; // 标识 int offSet = 0; byte[] resultBytes = {}; byte[] cache = {}; while (textLength - offSet > 0) { if (textLength - offSet > MAX_ENCRYPT_BLOCK) { cache = cipher.doFinal(textArray, offSet, MAX_ENCRYPT_BLOCK); offSet += MAX_ENCRYPT_BLOCK; } else { cache = cipher.doFinal(textArray, offSet, textLength - offSet); offSet = textLength; } resultBytes = Arrays.copyOf(resultBytes, resultBytes.length + cache.length); System.arraycopy(cache, 0, resultBytes, resultBytes.length - cache.length, cache.length); } result = Base64.getEncoder().encodeToString(resultBytes); } catch (Exception e) { throw new RuntimeException("加密字符串[" + text + "]时遇到异常", e); } return result; } public static void main(String[] args) { String pri = "MIICdwIBADANBgkqhkiG9w0BAQEFAASCAmEwggJdAgEAAoGBAJGxqYyI/k6nYkm2nf4ggkAMViEvbnplbQqw6Qweu4neFXCC+iKY8cq5RZEj8JLfrm/gHBTPN8FF1sQIwWwsDV7UUc88DS5KwAi5JXBHMdcbh2tftkINr0YVn6rIgUBTbmPZ7Y8L2iW8psYsF9nxwvUUtcbFJXIMJfi39Qxl0NQvAgMBAAECgYBKWLHfoCy9sFbMrN7UxnwQ+PqetpiW5tkNApf58ljbErQ4FO5V51xDieXBGejy2igmuOM7jz6xZtUgdiNV8uji/RtiNRqsBekVBPMeYAnPwA4GQ0HNwyHJ3ebJNQqT9bwrk8QpRUuCnrx/U1l7P1QNR5o52H1HpEKPlS0ga0fuQQJBAMdiSFYKt8/PwsYclvU/GqXrPy4cxMBhtE/ZssH9KourxnJcyfRz7EPgfSZykxlGHn8j/r8C2XxtAIYW6mRckqECQQC7EIZCZ3eV8abSIB33oKmw2jZlPQrHXMt8DWz8FYbNIA/9bvk9e9O42iQwMUtHfOMcNMWbcvKR/J+83bcE08TPAkA1ErdYl+/H1HDvVUrlq0+HnPArcSL6ZsedfcB0nNRHa4kehg6IEJdylf4aTuNTFfQmOcmkxLhpw4YhK1ZnMrEhAkEAuiMLNXA3MmCumk+TAiBAOdYoYjyHSTEw2VOSqpPQ+rN4tbmDEIbyefG2KK4kNhIy+pIYP0H11QYG/KuxvX/rSQJBALs0TqUgcGOp9+IkOq4jCXiVkP5/r7JWinQ4d6bYhJ4wspQYloYFCHljKKXtst1m8I3PC+vJY8R6va/3xtQKT8U="; String s = "{\"sign\":\"5363\",\"deptId\":\"5363_001\",\"reqDate\":\"2025-01-22 17:16:23\",\"data\":[{\"jcdj\":\"202501220001\",\"jcsj\":\"2025-01-22 17:16:23\",\"hwdm\":\"100010101\",\"cfww\":17.5,\"cfws\":75.5,\"cfnw\":17.5,\"cfns\":75.5,\"lszgw\":17.5,\"lszdw\":17.5,\"lspjw\":17.5,\"lswdzjh\":\"27.7,1,1,1|25.1,1,1,2|24.6,1,1,3|26.3,1,2,1|19.3,1,2,2|19.3,1,2,3|27.7,2,1,1|25.1,2,1,2|24.6,2,1,3|26.3,2,2,1|19.3,2,2,2|19.3,2, 2,3\",\"weather\":\"晴\",\"jcr\":\"检测人\",\"remarks\":\"备注信息\"},{\"jcdj\":\"202501220001\",\"jcsj\":\"2025-01-22 17:16:23\",\"hwdm\":\"100010101\",\"cfww\":17.5,\"cfws\":75.5,\"cfnw\":17.5,\"cfns\":75.5,\"lszgw\":17.5,\"lszdw\":17.5,\"lspjw\":17.5,\"lswdzjh\":\"27.7,1,1,1|25.1,1,1,2|24.6,1,1,3|26.3,1,2,1|19.3,1,2,2|19.3,1,2,3|27.7,2,1,1|25.1,2,1,2|24.6,2,1,3|26.3,2,2,1|19.3,2,2,2|19.3,2, 2,3\",\"weather\":\"晴\",\"jcr\":\"检测人\",\"remarks\":\"备注信息111\"}]}"; String pub = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCRsamMiP5Op2JJtp3+IIJADFYhL256ZW0KsOkMHruJ3hVwgvoimPHKuUWRI/CS365v4BwUzzfBRdbECMFsLA1e1FHPPA0uSsAIuSVwRzHXG4drX7ZCDa9GFZ+qyIFAU25j2e2PC9olvKbGLBfZ8cL1FLXGxSVyDCX4t/UMZdDULwIDAQAB"; log.info("明文字符串:{}", s); log.info("公钥:{}", pub); String rsaPublicKey = encrypt(s, pub); log.info("公钥加密后密文:{}", rsaPublicKey); String decrypt = decrypt(rsaPublicKey, pri); log.info("解密后明文:{}", decrypt); } }