package com.fzzy.api.utils;
|
|
import org.apache.commons.codec.binary.Base64;
|
|
import javax.crypto.Cipher;
|
import java.io.ByteArrayOutputStream;
|
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 NxRSAUtils {
|
|
// 数字签名,密钥算法
|
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<String, String> 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<String, String> keyMap = new HashMap<String, String>();
|
System.out.println("公钥:" + pub_key);
|
System.out.println("私钥:" + pri_key);
|
return keyMap;
|
}
|
|
/**
|
* 数字签名
|
*/
|
public static String sign(String text, String pri_key) throws Exception {
|
System.out.println(text);
|
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(NxRSAUtils.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("12640200735992821E001接口2023");
|
// String signStr = "12640200735992821E001_2023-11-09";
|
// 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 = NxRSAUtils.sign(signStr, pri_key);
|
// System.out.println(access_token);
|
// System.out.println(InspecdataSign(signStr,access_token,pub_key));
|
}
|
|
}
|