package com.fzzy.api.utils; ; import org.apache.commons.codec.binary.Base64; import javax.crypto.Cipher; import java.io.ByteArrayOutputStream; import java.nio.charset.StandardCharsets; import java.security.*; import java.security.spec.PKCS8EncodedKeySpec; import java.security.spec.X509EncodedKeySpec; import java.util.HashMap; import java.util.Map; /** * date: 2022-08-31 * 上海是平台接口人员提供 */ public class ShRSAUtils { // 数字签名,密钥算法 private static final String RSA_KEY_ALGORITHM = "RSA"; // 数字签名签名/验证算法 private static final String SIGNATURE_ALGORITHM = "MD5withRSA"; //分段加密大小 public static int MAX_ENCRYPT_BLOCK = 117; //分段解密大小 public static int MAX_DECRYPT_BLOCK = 128; //密钥大小 public static int KEY_SIZE = 1024; /** * 初始化RSA密钥对 */ @SuppressWarnings("unused") private static Map initKey(String str) throws Exception { KeyPairGenerator keygen = KeyPairGenerator.getInstance(RSA_KEY_ALGORITHM); SecureRandom secrand = new SecureRandom(); secrand.setSeed(str.getBytes());// 初始化随机产生器 keygen.initialize(KEY_SIZE, secrand); // 初始化密钥生成器 KeyPair keys = keygen.genKeyPair(); String pub_key = new String(Base64.encodeBase64(keys.getPublic().getEncoded()),"utf-8"); String pri_key = new String(Base64.encodeBase64(keys.getPrivate().getEncoded()),"utf-8"); Map keyMap = new HashMap(); System.out.println("公钥:" + pub_key); System.out.println("私钥:" + pri_key); return keyMap; } /** * 数字签名 */ public static String sign(String text, String pri_key) throws Exception { byte[] data = text.getBytes(); // 取得私钥 byte[] pri_key_bytes = Base64.decodeBase64(pri_key.getBytes()); PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(pri_key_bytes); KeyFactory keyFactory = KeyFactory.getInstance(RSA_KEY_ALGORITHM); // 生成私钥 PrivateKey priKey = keyFactory.generatePrivate(pkcs8KeySpec); // 实例化Signature Signature signature = Signature.getInstance(SIGNATURE_ALGORITHM); // 初始化Signature signature.initSign(priKey); // 更新 signature.update(data); return new String(Base64.encodeBase64(signature.sign()),"utf-8"); } /** * 公钥加密 * @param data 待加密数据 * @param pub_key 公钥 * @return 密文 * @throws Exception 抛出异常 */ private static byte[] encryptByPubKey(byte[] data, byte[] pub_key) throws Exception { // 取得公钥 X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(pub_key); KeyFactory keyFactory = KeyFactory.getInstance(RSA_KEY_ALGORITHM); PublicKey publicKey = keyFactory.generatePublic(x509KeySpec); // 对数据加密 Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm()); cipher.init(Cipher.ENCRYPT_MODE, publicKey); // return cipher.doFinal(data); int inputLen = data.length; ByteArrayOutputStream out = new ByteArrayOutputStream(); int offSet = 0; byte[] cache; int i = 0; // 对数据分段加密 while (inputLen - offSet > 0) { if (inputLen - offSet > MAX_ENCRYPT_BLOCK) { cache = cipher.doFinal(data, offSet, MAX_ENCRYPT_BLOCK); } else { cache = cipher.doFinal(data, offSet, inputLen - offSet); } out.write(cache, 0, cache.length); i++; offSet = i * MAX_ENCRYPT_BLOCK; } byte[] encryptedData = out.toByteArray(); out.close(); return encryptedData; } /** * RSA校验数字签名 */ public static boolean verify(byte[] data, byte[] sign, String pub_key) throws Exception { // 转换公钥材料 // 实例化密钥工厂 byte[] pub_key_bytes = Base64.decodeBase64(pub_key.getBytes()); KeyFactory keyFactory = KeyFactory.getInstance(RSA_KEY_ALGORITHM); // 初始化公钥 // 密钥材料转换 X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(pub_key_bytes); // 产生公钥 PublicKey pubKey = keyFactory.generatePublic(x509KeySpec); // 实例化Signature Signature signature = Signature.getInstance(SIGNATURE_ALGORITHM); // 初始化Signature signature.initVerify(pubKey); // 更新 signature.update(data); // 验证 return signature.verify(sign); } public static boolean InspecdataSign(String data,String accessToken,String pubkey){ String sign = data; try { if(ShRSAUtils.verify(sign.getBytes(), Base64.decodeBase64(accessToken.getBytes()), pubkey)){ return true; }else{ return false; } } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); return false; } } /** * 公钥加密 * @param data 待加密数据 * @param pub_key 公钥 * @return 密文 * @throws Exception 抛出异常 */ public static String encryptByPubKey(String data, String pub_key) throws Exception { byte[] pub_key_bytes = Base64.decodeBase64(pub_key.getBytes("utf-8")); byte[] enSign = encryptByPubKey(data.getBytes("utf-8"), pub_key_bytes); return new String(Base64.encodeBase64(enSign),"utf-8"); } public static void main(String[] args) throws Exception{ // initKey("嘉定区智慧粮库接口2023"); String signStr = "310114_2022-09-18"; String pri_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="; String pub_key = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCRsamMiP5Op2JJtp3+IIJADFYhL256ZW0KsOkMHruJ3hVwgvoimPHKuUWRI/CS365v4BwUzzfBRdbECMFsLA1e1FHPPA0uSsAIuSVwRzHXG4drX7ZCDa9GFZ+qyIFAU25j2e2PC9olvKbGLBfZ8cL1FLXGxSVyDCX4t/UMZdDULwIDAQAB"; String access_token = ShRSAUtils.sign(signStr, pri_key); System.out.println(access_token); System.out.println(InspecdataSign(signStr,access_token,pub_key)); } }