package com.whyc.util;
|
|
import com.whyc.constant.YamlProperties;
|
import org.apache.commons.codec.binary.Base64;
|
|
import javax.crypto.Cipher;
|
import java.io.ByteArrayOutputStream;
|
import java.io.UnsupportedEncodingException;
|
import java.net.URLDecoder;
|
import java.security.*;
|
import java.security.spec.InvalidKeySpecException;
|
import java.security.spec.PKCS8EncodedKeySpec;
|
import java.security.spec.X509EncodedKeySpec;
|
import java.util.LinkedList;
|
import java.util.List;
|
|
public class RSAUtil {
|
|
/**
|
* 固定公私钥
|
*/
|
//private static final String publicKey = YamlProperties.publicKey;
|
//private static final String privateKey = YamlProperties.privateKey;
|
private static final String publicKey = "MIIBojANBgkqhkiG9w0BAQEFAAOCAY8AMIIBigKCAYEAu7CdCMIoWXUX584JpmE1bTE1r1MtmZGswsSbsm4s9zqETQ4BmUT2kz/wvvGsI8T3ZvTT4KIyKP4Ez+yNVejMM5XwR95KF4e3UwMc724buWKl4pVL09kvkCZt8ZKf359VAvhyHHz80wIiVmJs6xbho7OBsv/s7Hwho0n4HPL4u/eNR5vWa2rtgQG1+fi1XP0UiSRKKW15Va9R2CI3zB+sffquhyX5fi+06NibWzk7OPU+EGvAwkaJtrmfLAvpwr4+G0MBLIsPVFV17Sgpoj62rtfbhHwmLSo1JTw+/JskDQOjxXfw+w3uHAZgPTlEmn2Ya9ssIljqCBfvM9nbGUWcnmppKlPm6kECa4RsgPiRgPFV+nT/Q98kfUTb798Sy63x4NIZkLQn1DDbmcAgUqLR6y1r0fD8Ne3vVtuZlVR/8ZlcRAfb+th2cNN0rytrnUreJo7kPtTFdkNtmj0KdUkRO8ea0YymEQal+b0tCl3V8osSy+qO2OVRd7yCvpOWEYOBAgMBAAE=";
|
private static final String privateKey = "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";
|
/**
|
* RSA最大加密明文大小
|
*/
|
private static final int MAX_ENCRYPT_BLOCK = 117;
|
/**
|
* RSA最大解密密文大小
|
*/
|
private static final int MAX_DECRYPT_BLOCK = 384;
|
|
public static final String fontSeparator = "&&&&&&&&&&";
|
/**
|
* 获取密钥对
|
*
|
* @return 密钥对
|
*/
|
public static List<String> getKeyPair() throws Exception {
|
LinkedList<String> list = new LinkedList<>();
|
KeyPairGenerator generator = KeyPairGenerator.getInstance("RSA");
|
generator.initialize(3072);
|
KeyPair keyPair = generator.generateKeyPair();
|
String publicKey = Base64.encodeBase64String(keyPair.getPublic().getEncoded());
|
String privateKey = Base64.encodeBase64String(keyPair.getPrivate().getEncoded());
|
System.out.println("公钥:"+publicKey);
|
System.out.println("私钥:"+privateKey);
|
list.add(publicKey);
|
list.add(privateKey);
|
return list;
|
}
|
/**
|
* 获取私钥
|
*
|
* @param privateKey 私钥字符串
|
* @return
|
*/
|
public static PrivateKey getPrivateKey(String privateKey) {
|
try {
|
KeyFactory keyFactory = null;
|
keyFactory = KeyFactory.getInstance("RSA");
|
|
byte[] decodedKey = Base64.decodeBase64(privateKey.getBytes());
|
PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(decodedKey);
|
return keyFactory.generatePrivate(keySpec);
|
}catch (NoSuchAlgorithmException | InvalidKeySpecException e){
|
return null;
|
}
|
}
|
|
/**
|
* 获取私钥
|
*
|
* @return
|
*/
|
public static PrivateKey getPrivateKey() {
|
try {
|
KeyFactory keyFactory = null;
|
keyFactory = KeyFactory.getInstance("RSA");
|
|
byte[] decodedKey = Base64.decodeBase64(privateKey.getBytes());
|
PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(decodedKey);
|
return keyFactory.generatePrivate(keySpec);
|
}catch (NoSuchAlgorithmException | InvalidKeySpecException e){
|
return null;
|
}
|
}
|
/**
|
* 获取公钥
|
*
|
* @param publicKey 公钥字符串
|
* @return
|
*/
|
public static PublicKey getPublicKey(String publicKey) throws Exception {
|
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
|
byte[] decodedKey = Base64.decodeBase64(publicKey.getBytes());
|
X509EncodedKeySpec keySpec = new X509EncodedKeySpec(decodedKey);
|
return keyFactory.generatePublic(keySpec);
|
}
|
|
/**
|
* 获取公钥
|
*
|
* @return
|
*/
|
public static PublicKey getPublicKey(){
|
try {
|
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
|
byte[] decodedKey = Base64.decodeBase64(publicKey.getBytes());
|
X509EncodedKeySpec keySpec = new X509EncodedKeySpec(decodedKey);
|
return keyFactory.generatePublic(keySpec);
|
}catch (Exception e){
|
return null;
|
}
|
}
|
|
/**
|
* RSA加密
|
*
|
* @param data 待加密数据
|
* @param publicKey 公钥
|
* @return
|
*/
|
public static String encrypt(String data, PublicKey publicKey) {
|
try {
|
Cipher cipher = Cipher.getInstance("RSA");
|
cipher.init(Cipher.ENCRYPT_MODE, publicKey);
|
int inputLen = data.getBytes().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.getBytes(), offset, MAX_ENCRYPT_BLOCK);
|
} else {
|
cache = cipher.doFinal(data.getBytes(), offset, inputLen - offset);
|
}
|
out.write(cache, 0, cache.length);
|
i++;
|
offset = i * MAX_ENCRYPT_BLOCK;
|
}
|
byte[] encryptedData = out.toByteArray();
|
out.close();
|
// 获取加密内容使用base64进行编码,并以UTF-8为标准转化成字符串
|
// 加密后的字符串
|
return new String(Base64.encodeBase64String(encryptedData));
|
}catch (Exception e){
|
return null;
|
}
|
}
|
/**
|
* RSA解密
|
*
|
* @param data 待解密数据
|
* @param privateKey 私钥
|
* @return
|
*/
|
public static String decrypt(String data, PrivateKey privateKey) {
|
try {
|
Cipher cipher = Cipher.getInstance("RSA");
|
cipher.init(Cipher.DECRYPT_MODE, privateKey);
|
byte[] dataBytes = Base64.decodeBase64(data);
|
int inputLen = dataBytes.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(dataBytes, offset, MAX_DECRYPT_BLOCK);
|
} else {
|
cache = cipher.doFinal(dataBytes, offset, inputLen - offset);
|
}
|
out.write(cache, 0, cache.length);
|
i++;
|
offset = i * MAX_DECRYPT_BLOCK;
|
}
|
byte[] decryptedData = out.toByteArray();
|
out.close();
|
// 解密后的内容
|
return new String(decryptedData, "UTF-8");
|
}catch (Exception e){
|
return null;
|
}
|
}
|
/**
|
* RSA解密
|
*
|
* @param data 待解密数据
|
* @return
|
*/
|
public static String decrypt(String data) {
|
try {
|
Cipher cipher = Cipher.getInstance("RSA");
|
cipher.init(Cipher.DECRYPT_MODE, getPrivateKey());
|
byte[] dataBytes = Base64.decodeBase64(data);
|
int inputLen = dataBytes.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(dataBytes, offset, MAX_DECRYPT_BLOCK);
|
} else {
|
cache = cipher.doFinal(dataBytes, offset, inputLen - offset);
|
}
|
out.write(cache, 0, cache.length);
|
i++;
|
offset = i * MAX_DECRYPT_BLOCK;
|
}
|
byte[] decryptedData = out.toByteArray();
|
out.close();
|
// 解密后的内容
|
return new String(decryptedData, "UTF-8");
|
}catch (Exception e){
|
return null;
|
}
|
}
|
|
/**
|
* 前端加密数据RSA[明文+MD5(明文)]解密为明文和MD5[明文]
|
* @param frontEncryptData
|
* @return
|
*/
|
public static String[] decryptFront(String frontEncryptData,String separatorStr){
|
String[] dataArr = new String[2];
|
String dataMD5Mix = RSAUtil.decrypt(frontEncryptData, RSAUtil.getPrivateKey());
|
int index = dataMD5Mix.lastIndexOf(separatorStr);
|
String data = dataMD5Mix.substring(0, index);
|
String dataMD5 = dataMD5Mix.substring(index+separatorStr.length());
|
dataArr[0] = data;
|
dataArr[1] = dataMD5;
|
return dataArr;
|
}
|
|
/**
|
* 先URL解码,再进行密文解析[rsa(明文+md5)]
|
*/
|
public static String[] decryptFrontP(String frontEncryptData,String separatorStr){
|
try {
|
frontEncryptData = URLDecoder.decode(frontEncryptData, "utf-8");
|
} catch (UnsupportedEncodingException e) {
|
e.printStackTrace();
|
}
|
String[] dataArr = new String[2];
|
String dataMD5Mix = RSAUtil.decrypt(frontEncryptData, RSAUtil.getPrivateKey());
|
if(dataMD5Mix!=null){
|
int index = dataMD5Mix.lastIndexOf(separatorStr);
|
String data = dataMD5Mix.substring(0, index);
|
String dataMD5 = dataMD5Mix.substring(index+separatorStr.length());
|
dataArr[0] = data;
|
dataArr[1] = dataMD5;
|
}
|
return dataArr;
|
}
|
|
public static void main(String[] args) {
|
try {
|
//String word = "123456";
|
//String publicKey = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCPpJ3j+SHQ69lqq+ShV7deA40Y+8rYra6rr4ReOJ+UE7ek8tsJJrcy1xMO1SophJdHXXwSNbZWhnJW9GlIq1Um6IplkwFc/AtyoeJDP3EJtUZgI5H6fSz0BPLFHn18C0Nxz1Br109U07DqQdMsarcBmKXYQw+2oZOz0KpA5b0FawIDAQAB";
|
//String privateKey = "MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBAI+kneP5IdDr2Wqr5KFXt14DjRj7ytitrquvhF44n5QTt6Ty2wkmtzLXEw7VKimEl0ddfBI1tlaGclb0aUirVSboimWTAVz8C3Kh4kM/cQm1RmAjkfp9LPQE8sUefXwLQ3HPUGvXT1TTsOpB0yxqtwGYpdhDD7ahk7PQqkDlvQVrAgMBAAECgYA8ASdX4W2n6a4kKnRSleLqqg8aHazqAPvTinmAJqU65VW02SJ42yxyV3gFnTSErXfIfxviO3/U+0ruWiFVEwV5oDEh0dOd+HHGm4YzFXIRglMeRBgLuVJ+owzoVDwZstiIBa69DIjaJtmpSf5FjwxAth+gtCv3e11IXHraKN720QJBAMPMB1WtmpRGYHxWVYjKSL+RGw+h3gMQLk3exZjhmYRlXuqfVZ2Zol+NazDc59K5f+geMdJ0/X2kKnKLVjWzYHMCQQC7z1cFYswtLemxGfj+dwlVC01VL4pKa7HGHl/FAQ2UNYZY2d5hE/nXYbTpfI0gMowX926/aFpia7NbAUJO7WEpAkAyUFa+LJthaOhYazMVsK2bFKW4kabkcJ8Fga6TR73UaNxIPGOa2SUBmuylpM6ptuNoeYHiDBAr3ijOQIIJ0KuDAkBy9fPahCNe9F+73J4hhVPdDtIDdto7u7hSAX215XMeabUW5iXNXqDsSg6nbWolb0t50CemWoYZALwE1Lx1+7AhAkEAoZtFt+2skjAxHEqNUye4vKBqB2Ng/wmfitCfT34lXWQsxs4BGk/8eQMzkam9bcB7FcinolxHF/1UjsUYpI+AgA==";
|
|
//List<String> keyPair = getKeyPair();
|
//String encryptWord = encrypt(word, getPublicKey(keyPair.get(0)));
|
//System.out.println("加密后的字符串:"+encryptWord);
|
|
String encryptWord = "lY+3WrwHh1FnO2SfxBT7lXS/LE5UaqO/2O/OUdyWvOAXFLjZhQhVRvE8HLemsr3zQIJ3qPNAgdVM1yD1f2ZI63fP/77Hhn1CPTNOJWFx2psX4l6GlaESYmUU6O/paZMhkZQjRQz24loNNWPd3VSDc/CcoirbwbkcRBUdeGqL5LF+f7mMKBgPCxV3GTZnMOPKVZvzPuwCc5gFPf9jfG//MtoaM0lsAvbixnIMpfLlK3XQ1B/Jw/1bwpfuo5PktYEr1X8ambhIIsMt0v4VOyTbj3Xf14XMeVV8h9kAwbufZm2rqO3qfl66itFJ42OB5WVBWgqvlOU+HEzIkeZgOUXXydG1t1lKXGsNEQ2vaNbwkJt6GfpQsNW8n+2gSE/ws+ASGYX81/REEKn0XHTjW9GZjEGpcnVRki1nK6KDcZcPCbTxKAtgzKCf3AE2bNHoXjKCdqpvW+tbmqX9gPLYrQRnw92i8uPbiNTlxGMvDrqIISwKIHwGF0yqKmmEHc5rm0Wp";
|
String snId=RSAUtil.decrypt(encryptWord,getPrivateKey());
|
System.out.println(snId);
|
} catch (Exception e) {
|
e.printStackTrace();
|
}
|
}
|
}
|