| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282 |
- package com.pine.common.utils;
- import com.alibaba.fastjson.JSONObject;
- import org.apache.commons.codec.binary.Base64;
- import org.springframework.util.Base64Utils;
- import springfox.documentation.spring.web.json.Json;
- import java.io.ByteArrayOutputStream;
- import java.security.*;
- import java.security.interfaces.RSAPublicKey;
- import java.security.spec.InvalidKeySpecException;
- import java.security.spec.PKCS8EncodedKeySpec;
- import java.security.spec.X509EncodedKeySpec;
- import java.text.ParseException;
- import java.util.HashMap;
- import java.util.Map;
- import javax.crypto.BadPaddingException;
- import javax.crypto.Cipher;
- import javax.crypto.IllegalBlockSizeException;
- import javax.crypto.NoSuchPaddingException;
- public class RSAUtils {
- private final static int MAX_DECRYPT_BLOCK = 128; //RSA最大解密密文大小
- private final static String KEY_ALGORITHM = "RSA"; //加密算法RSA
- private final static int MAX_ENCRYPT_BLOCK = 117; //RSA最大加密明文大小
- public final static String publicKey = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCHhQ6Px0l+cMR1tRsky0HDlvJD94AbE9Z0UhIZFgtdJ20GRQoV2DO3jQbGMBrM6giEcUCbYcDsnTVUovBrDQit1QtZZ3eKtoqrW7bMT2eX5qQOrZtO2kRkrnWwsxkKHKhn41atEMvSqrVqLgOUDgBhmxREWN93KUYE2adAg62/jQIDAQAB";
- public final static String privateKey = "MIICdQIBADANBgkqhkiG9w0BAQEFAASCAl8wggJbAgEAAoGBAIeFDo/HSX5wxHW1GyTLQcOW8kP3gBsT1nRSEhkWC10nbQZFChXYM7eNBsYwGszqCIRxQJthwOydNVSi8GsNCK3VC1lnd4q2iqtbtsxPZ5fmpA6tm07aRGSudbCzGQocqGfjVq0Qy9KqtWouA5QOAGGbFERY33cpRgTZp0CDrb+NAgMBAAECgYBJtT/nSZAamkDweHFsALUjKW1ZNDtT/uUsXRsE0+2YXAI7X7+NhAsU8TpW/wEEpOG/D04BdRiWWScRgpHa17r47joc3U+d40PRsqa34E0uJzqXJTzKZxTakDmI+KReIj+vMbvFo3cV3G5XNHElJEtWNNh4E/O99efd6scReQRKzQJBAMRh5UVwYrRh1FkvZIb+MtRW3ofMexfK/8LWF8xhPfi79NNl64O3HC+x4WPRGQnmdqx/iZFGf87iMvQlRtrQWYcCQQCwqSTn7gollTrZiA4fm22WGVigVQgH22TtUVHp6y23gah6feoONPUU69J8NpdyNhE5htrLMJWqvhzI+y7TrZNLAkAlZX8DeiNRtk95rEy4aC/Fv8Uglw/ZuA58S8i8YsgqVaCJoR74NiZn7re9ClR6TijLMH5B6+rquqh5VZ/oi0SBAkAGSp/T2rhlykDESoImQgTPGav8WcrlbLzVbtX5/LQuGuIDKsTRKLWpvxRJ9C/Ek4Rdhh34qoxJ/mdMCRYL19ytAkA6nDuDvgokt9nx8ldh+mqUCfS0Mn89aTC/C0vzUYUSq/RcAL2EOu1UBMxD6Pzmz6y+HJXEN4AayOgFXyLZw6Rb";
- public static void main(String[] args) throws ParseException {
- Map<String,String> map = new HashMap<>();
- map.put("orderId","4935");
- map.put("writeOffCode","737176");
- map.put("dealerName","商城管理员");
- String maptoString = RSAUtils.encrypt(RSAUtils.publicKey, JSONObject.toJSONString(map));
- String s1 = "MIICdQIBADANBgkqhkiG9w0BAQEFAASCAl8wggJbAgEAAoGBAIeFDo/HSX5wxHW1GyTLQcOW8kP3gBsT1nRSEhkWC10nbQZFChXYM7eNBsYwGszqCIRxQJthwOydNVSi8GsNCK3VC1lnd4q2iqtbtsxPZ5fmpA6tm07aRGSudbCzGQocqGfjVq0Qy9KqtWouA5QOAGGbFERY33cpRgTZp0CDrb+NAgMBAAECgYBJtT/nSZAamkDweHFsALUjKW1ZNDtT/uUsXRsE0+2YXAI7X7+NhAsU8TpW/wEEpOG/D04BdRiWWScRgpHa17r47joc3U+d40PRsqa34E0uJzqXJTzKZxTakDmI+KReIj+vMbvFo3cV3G5XNHElJEtWNNh4E/O99efd6scReQRKzQJBAMRh5UVwYrRh1FkvZIb+MtRW3ofMexfK/8LWF8xhPfi79NNl64O3HC+x4WPRGQnmdqx/iZFGf87iMvQlRtrQWYcCQQCwqSTn7gollTrZiA4fm22WGVigVQgH22TtUVHp6y23gah6feoONPUU69J8NpdyNhE5htrLMJWqvhzI+y7TrZNLAkAlZX8DeiNRtk95rEy4aC/Fv8Uglw/ZuA58S8i8YsgqVaCJoR74NiZn7re9ClR6TijLMH5B6+rquqh5VZ/oi0SBAkAGSp/T2rhlykDESoImQgTPGav8WcrlbLzVbtX5/LQuGuIDKsTRKLWpvxRJ9C/Ek4Rdhh34qoxJ/mdMCRYL19ytAkA6nDuDvgokt9nx8ldh+mqUCfS0Mn89aTC/C0vzUYUSq/RcAL2EOu1UBMxD6Pzmz6y+HJXEN4AayOgFXyLZw6Rb";
- String aa = "123456";
- aa = aa.replace("1", "5");
- System.out.println(aa);
- // createTime为当前时间 秘钥半小时失效
- String data =
- // "{\"account\":\"hh\",\"password\":6906,\"erp\":\"12818\",\"dealerId\":6906,\"name\":\"芜湖福瑞汽车销售有限公司\",\"roleType\":\"商城经销商\",\"createTime\":\"1570856401000\"}";
- "cscscs123";
- String encrypt = RSAUtils.encrypt(RSAUtils.publicKey, data);
- // 防止URL 传参 + 号丢失
- System.out.println(encrypt.replace("+", "%2B"));
- String aaaa =
- "O1kIS1c61PFpkyYo2eMNlh18Gk1oFTlVlc9Bx/u0qFCONWy8679FrVxE0xseEK+mf0pfKUgeNnNJbZk0CVuVyhd8yH65C2GfZ5olHoeu/Eb/V2cnQFc5W7SYdXOvj2t4S4aEIJUhz9HUf3e5+nbjPrr2zYvDnAD0ymGdYOeS5rE="
- ;
- String responseString = RSAUtils.decrypt(RSAUtils.privateKey, aaaa);
- System.out.println(responseString);
- }
- /**
- * 将特殊符合转换成正确的字符再进行解密
- *
- * @param data
- * @return
- */
- public static String changeSpecialToString(String data) {
- if (!"".equals(data) && !"".equals(data.trim())) {
- data = data.replace("%2B", "+").
- replace("%20", " ").
- replace("%2F", "/").
- replace("%3F", "?").
- replace("%252B", "+").
- replace("%23", "#").
- replace("%26", "&").
- replace("%3D", "=");
- System.out.println(data);
- return RSAUtils.decrypt(RSAUtils.privateKey, data);
- } else {
- return null;
- }
- }
- /**
- * 加密
- *
- * @param publicKey 公钥
- * @param plainText 加密的内容
- * @return 返回加密后的内容
- */
- public static String encrypt(String publicKey, String plainText) {
- String encryptStr = null;
- try {
- encryptStr = RSAUtils.encrypt(RSAUtils.loadPublicKey(publicKey), plainText.getBytes("UTF-8"));
- } catch (Exception e) {
- e.printStackTrace();
- }
- return encryptStr;
- }
- /**
- * 解密
- *
- * @param privateKey 私钥
- * @param encryptText 秘文
- * @return 揭秘后的内容
- */
- public static String decrypt(String privateKey, String encryptText) {
- String decryptStr = null;
- try {
- decryptStr = RSAUtils.decrypt(privateKey, RSAUtils.strToBase64(encryptText));
- } catch (Exception e) {
- e.printStackTrace();
- }
- return decryptStr;
- }
- /**
- * 生成RAS公钥与私钥字符串,直接返回
- */
- public static HashMap<String, String> getKeys() {
- HashMap<String, String> map = new HashMap<String, String>();
- KeyPairGenerator keyPairGen = null;
- try {
- keyPairGen = KeyPairGenerator.getInstance("RSA");
- } catch (NoSuchAlgorithmException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- // 初始化密钥对生成器,密钥大小为96-1024位
- keyPairGen.initialize(1024, new SecureRandom());
- // 生成一个密钥对,保存在keyPair中
- KeyPair keyPair = keyPairGen.generateKeyPair();
- // 得到公钥字符串
- String publicKey = base64ToStr(keyPair.getPublic().getEncoded());
- // 得到私钥字符串
- String privateKey = base64ToStr(keyPair.getPrivate().getEncoded());
- map.put("publicKey", publicKey);
- map.put("privateKey", privateKey);
- return map;
- }
- /**
- * 根据公钥字符串加载公钥
- *
- * @param publicKeyStr 公钥字符串
- * @return
- * @throws Exception
- */
- private static RSAPublicKey loadPublicKey(String publicKeyStr) throws Exception {
- try {
- byte[] buffer = javax.xml.bind.DatatypeConverter.parseBase64Binary(publicKeyStr);
- KeyFactory keyFactory = KeyFactory.getInstance("RSA");
- X509EncodedKeySpec keySpec = new X509EncodedKeySpec(buffer);
- return (RSAPublicKey) keyFactory.generatePublic(keySpec);
- } catch (NoSuchAlgorithmException e) {
- throw new Exception("无此算法", e);
- } catch (InvalidKeySpecException e) {
- throw new Exception("公钥非法", e);
- } catch (NullPointerException e) {
- throw new Exception("公钥数据为空", e);
- }
- }
- /**
- * 公钥加密
- *
- * @param publicKey 公钥
- * @param plainTextData 明文数据
- * @return
- * @throws Exception 加密过程中的异常信息
- */
- private static String encrypt(RSAPublicKey publicKey, byte[] plainTextData) throws Exception {
- if (publicKey == null) {
- throw new Exception("加密公钥为空, 请设置");
- }
- Cipher cipher = null;
- try {
- // 使用默认RSA
- cipher = Cipher.getInstance("RSA");
- cipher.init(Cipher.ENCRYPT_MODE, publicKey);
- int inputLen = plainTextData.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(plainTextData, offSet, MAX_ENCRYPT_BLOCK);
- } else {
- cache = cipher.doFinal(plainTextData, offSet, inputLen - offSet);
- }
- out.write(cache, 0, cache.length);
- i++;
- offSet = i * MAX_ENCRYPT_BLOCK;
- }
- byte[] encryptedData = out.toByteArray();
- out.close();
- return Base64.encodeBase64String(encryptedData);
- } catch (NoSuchAlgorithmException e) {
- throw new Exception("无此加密算法");
- } catch (NoSuchPaddingException e) {
- e.printStackTrace();
- return null;
- } catch (InvalidKeyException e) {
- throw new Exception("加密公钥非法,请检查");
- } catch (IllegalBlockSizeException e) {
- throw new Exception("明文长度非法");
- } catch (BadPaddingException e) {
- throw new Exception("明文数据已损坏");
- }
- }
- /**
- * 私钥解密
- *
- * @param privateKey 私钥
- * @param cipherData 密文数据
- * @return 明文
- * @throws Exception 解密过程中的异常信息
- */
- private static String decrypt(String privateKey, byte[] cipherData) throws Exception {
- if (privateKey == null) {
- throw new Exception("解密私钥为空, 请设置");
- }
- Cipher cipher = null;
- try {
- byte[] keyBytes = Base64Utils.decode(privateKey.getBytes("UTF-8"));
- PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(keyBytes);
- KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);
- Key privateK = keyFactory.generatePrivate(pkcs8KeySpec);
- cipher = Cipher.getInstance(keyFactory.getAlgorithm());
- cipher.init(Cipher.DECRYPT_MODE, privateK);
- int inputLen = cipherData.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(cipherData, offSet, MAX_DECRYPT_BLOCK);
- } else {
- cache = cipher.doFinal(cipherData, 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 (NoSuchAlgorithmException e) {
- throw new Exception("无此解密算法");
- } catch (NoSuchPaddingException e) {
- e.printStackTrace();
- return null;
- } catch (InvalidKeyException e) {
- throw new Exception("解密私钥非法,请检查");
- } catch (IllegalBlockSizeException e) {
- e.printStackTrace();
- throw new Exception("密文长度非法");
- } catch (BadPaddingException e) {
- e.printStackTrace();
- throw new Exception("密文数据已损坏");
- }
- }
- private static String base64ToStr(byte[] b) {
- return javax.xml.bind.DatatypeConverter.printBase64Binary(b);
- }
- private static byte[] strToBase64(String str) {
- return javax.xml.bind.DatatypeConverter.parseBase64Binary(str);
- }
- }
|