RSAUtils.java 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282
  1. package com.pine.common.utils;
  2. import com.alibaba.fastjson.JSONObject;
  3. import org.apache.commons.codec.binary.Base64;
  4. import org.springframework.util.Base64Utils;
  5. import springfox.documentation.spring.web.json.Json;
  6. import java.io.ByteArrayOutputStream;
  7. import java.security.*;
  8. import java.security.interfaces.RSAPublicKey;
  9. import java.security.spec.InvalidKeySpecException;
  10. import java.security.spec.PKCS8EncodedKeySpec;
  11. import java.security.spec.X509EncodedKeySpec;
  12. import java.text.ParseException;
  13. import java.util.HashMap;
  14. import java.util.Map;
  15. import javax.crypto.BadPaddingException;
  16. import javax.crypto.Cipher;
  17. import javax.crypto.IllegalBlockSizeException;
  18. import javax.crypto.NoSuchPaddingException;
  19. public class RSAUtils {
  20. private final static int MAX_DECRYPT_BLOCK = 128; //RSA最大解密密文大小
  21. private final static String KEY_ALGORITHM = "RSA"; //加密算法RSA
  22. private final static int MAX_ENCRYPT_BLOCK = 117; //RSA最大加密明文大小
  23. public final static String publicKey = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCHhQ6Px0l+cMR1tRsky0HDlvJD94AbE9Z0UhIZFgtdJ20GRQoV2DO3jQbGMBrM6giEcUCbYcDsnTVUovBrDQit1QtZZ3eKtoqrW7bMT2eX5qQOrZtO2kRkrnWwsxkKHKhn41atEMvSqrVqLgOUDgBhmxREWN93KUYE2adAg62/jQIDAQAB";
  24. 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";
  25. public static void main(String[] args) throws ParseException {
  26. Map<String,String> map = new HashMap<>();
  27. map.put("orderId","4935");
  28. map.put("writeOffCode","737176");
  29. map.put("dealerName","商城管理员");
  30. String maptoString = RSAUtils.encrypt(RSAUtils.publicKey, JSONObject.toJSONString(map));
  31. 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";
  32. String aa = "123456";
  33. aa = aa.replace("1", "5");
  34. System.out.println(aa);
  35. // createTime为当前时间 秘钥半小时失效
  36. String data =
  37. // "{\"account\":\"hh\",\"password\":6906,\"erp\":\"12818\",\"dealerId\":6906,\"name\":\"芜湖福瑞汽车销售有限公司\",\"roleType\":\"商城经销商\",\"createTime\":\"1570856401000\"}";
  38. "cscscs123";
  39. String encrypt = RSAUtils.encrypt(RSAUtils.publicKey, data);
  40. // 防止URL 传参 + 号丢失
  41. System.out.println(encrypt.replace("+", "%2B"));
  42. String aaaa =
  43. "O1kIS1c61PFpkyYo2eMNlh18Gk1oFTlVlc9Bx/u0qFCONWy8679FrVxE0xseEK+mf0pfKUgeNnNJbZk0CVuVyhd8yH65C2GfZ5olHoeu/Eb/V2cnQFc5W7SYdXOvj2t4S4aEIJUhz9HUf3e5+nbjPrr2zYvDnAD0ymGdYOeS5rE="
  44. ;
  45. String responseString = RSAUtils.decrypt(RSAUtils.privateKey, aaaa);
  46. System.out.println(responseString);
  47. }
  48. /**
  49. * 将特殊符合转换成正确的字符再进行解密
  50. *
  51. * @param data
  52. * @return
  53. */
  54. public static String changeSpecialToString(String data) {
  55. if (!"".equals(data) && !"".equals(data.trim())) {
  56. data = data.replace("%2B", "+").
  57. replace("%20", " ").
  58. replace("%2F", "/").
  59. replace("%3F", "?").
  60. replace("%252B", "+").
  61. replace("%23", "#").
  62. replace("%26", "&").
  63. replace("%3D", "=");
  64. System.out.println(data);
  65. return RSAUtils.decrypt(RSAUtils.privateKey, data);
  66. } else {
  67. return null;
  68. }
  69. }
  70. /**
  71. * 加密
  72. *
  73. * @param publicKey 公钥
  74. * @param plainText 加密的内容
  75. * @return 返回加密后的内容
  76. */
  77. public static String encrypt(String publicKey, String plainText) {
  78. String encryptStr = null;
  79. try {
  80. encryptStr = RSAUtils.encrypt(RSAUtils.loadPublicKey(publicKey), plainText.getBytes("UTF-8"));
  81. } catch (Exception e) {
  82. e.printStackTrace();
  83. }
  84. return encryptStr;
  85. }
  86. /**
  87. * 解密
  88. *
  89. * @param privateKey 私钥
  90. * @param encryptText 秘文
  91. * @return 揭秘后的内容
  92. */
  93. public static String decrypt(String privateKey, String encryptText) {
  94. String decryptStr = null;
  95. try {
  96. decryptStr = RSAUtils.decrypt(privateKey, RSAUtils.strToBase64(encryptText));
  97. } catch (Exception e) {
  98. e.printStackTrace();
  99. }
  100. return decryptStr;
  101. }
  102. /**
  103. * 生成RAS公钥与私钥字符串,直接返回
  104. */
  105. public static HashMap<String, String> getKeys() {
  106. HashMap<String, String> map = new HashMap<String, String>();
  107. KeyPairGenerator keyPairGen = null;
  108. try {
  109. keyPairGen = KeyPairGenerator.getInstance("RSA");
  110. } catch (NoSuchAlgorithmException e) {
  111. // TODO Auto-generated catch block
  112. e.printStackTrace();
  113. }
  114. // 初始化密钥对生成器,密钥大小为96-1024位
  115. keyPairGen.initialize(1024, new SecureRandom());
  116. // 生成一个密钥对,保存在keyPair中
  117. KeyPair keyPair = keyPairGen.generateKeyPair();
  118. // 得到公钥字符串
  119. String publicKey = base64ToStr(keyPair.getPublic().getEncoded());
  120. // 得到私钥字符串
  121. String privateKey = base64ToStr(keyPair.getPrivate().getEncoded());
  122. map.put("publicKey", publicKey);
  123. map.put("privateKey", privateKey);
  124. return map;
  125. }
  126. /**
  127. * 根据公钥字符串加载公钥
  128. *
  129. * @param publicKeyStr 公钥字符串
  130. * @return
  131. * @throws Exception
  132. */
  133. private static RSAPublicKey loadPublicKey(String publicKeyStr) throws Exception {
  134. try {
  135. byte[] buffer = javax.xml.bind.DatatypeConverter.parseBase64Binary(publicKeyStr);
  136. KeyFactory keyFactory = KeyFactory.getInstance("RSA");
  137. X509EncodedKeySpec keySpec = new X509EncodedKeySpec(buffer);
  138. return (RSAPublicKey) keyFactory.generatePublic(keySpec);
  139. } catch (NoSuchAlgorithmException e) {
  140. throw new Exception("无此算法", e);
  141. } catch (InvalidKeySpecException e) {
  142. throw new Exception("公钥非法", e);
  143. } catch (NullPointerException e) {
  144. throw new Exception("公钥数据为空", e);
  145. }
  146. }
  147. /**
  148. * 公钥加密
  149. *
  150. * @param publicKey 公钥
  151. * @param plainTextData 明文数据
  152. * @return
  153. * @throws Exception 加密过程中的异常信息
  154. */
  155. private static String encrypt(RSAPublicKey publicKey, byte[] plainTextData) throws Exception {
  156. if (publicKey == null) {
  157. throw new Exception("加密公钥为空, 请设置");
  158. }
  159. Cipher cipher = null;
  160. try {
  161. // 使用默认RSA
  162. cipher = Cipher.getInstance("RSA");
  163. cipher.init(Cipher.ENCRYPT_MODE, publicKey);
  164. int inputLen = plainTextData.length;
  165. ByteArrayOutputStream out = new ByteArrayOutputStream();
  166. int offSet = 0;
  167. byte[] cache;
  168. int i = 0;
  169. // 对数据分段加密
  170. while (inputLen - offSet > 0) {
  171. if (inputLen - offSet > MAX_ENCRYPT_BLOCK) {
  172. cache = cipher.doFinal(plainTextData, offSet, MAX_ENCRYPT_BLOCK);
  173. } else {
  174. cache = cipher.doFinal(plainTextData, offSet, inputLen - offSet);
  175. }
  176. out.write(cache, 0, cache.length);
  177. i++;
  178. offSet = i * MAX_ENCRYPT_BLOCK;
  179. }
  180. byte[] encryptedData = out.toByteArray();
  181. out.close();
  182. return Base64.encodeBase64String(encryptedData);
  183. } catch (NoSuchAlgorithmException e) {
  184. throw new Exception("无此加密算法");
  185. } catch (NoSuchPaddingException e) {
  186. e.printStackTrace();
  187. return null;
  188. } catch (InvalidKeyException e) {
  189. throw new Exception("加密公钥非法,请检查");
  190. } catch (IllegalBlockSizeException e) {
  191. throw new Exception("明文长度非法");
  192. } catch (BadPaddingException e) {
  193. throw new Exception("明文数据已损坏");
  194. }
  195. }
  196. /**
  197. * 私钥解密
  198. *
  199. * @param privateKey 私钥
  200. * @param cipherData 密文数据
  201. * @return 明文
  202. * @throws Exception 解密过程中的异常信息
  203. */
  204. private static String decrypt(String privateKey, byte[] cipherData) throws Exception {
  205. if (privateKey == null) {
  206. throw new Exception("解密私钥为空, 请设置");
  207. }
  208. Cipher cipher = null;
  209. try {
  210. byte[] keyBytes = Base64Utils.decode(privateKey.getBytes("UTF-8"));
  211. PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(keyBytes);
  212. KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);
  213. Key privateK = keyFactory.generatePrivate(pkcs8KeySpec);
  214. cipher = Cipher.getInstance(keyFactory.getAlgorithm());
  215. cipher.init(Cipher.DECRYPT_MODE, privateK);
  216. int inputLen = cipherData.length;
  217. ByteArrayOutputStream out = new ByteArrayOutputStream();
  218. int offSet = 0;
  219. byte[] cache;
  220. int i = 0;
  221. // 对数据分段解密
  222. while (inputLen - offSet > 0) {
  223. if (inputLen - offSet > MAX_DECRYPT_BLOCK) {
  224. cache = cipher.doFinal(cipherData, offSet, MAX_DECRYPT_BLOCK);
  225. } else {
  226. cache = cipher.doFinal(cipherData, offSet, inputLen - offSet);
  227. }
  228. out.write(cache, 0, cache.length);
  229. i++;
  230. offSet = i * MAX_DECRYPT_BLOCK;
  231. }
  232. byte[] decryptedData = out.toByteArray();
  233. out.close();
  234. return new String(decryptedData, "UTF-8");
  235. } catch (NoSuchAlgorithmException e) {
  236. throw new Exception("无此解密算法");
  237. } catch (NoSuchPaddingException e) {
  238. e.printStackTrace();
  239. return null;
  240. } catch (InvalidKeyException e) {
  241. throw new Exception("解密私钥非法,请检查");
  242. } catch (IllegalBlockSizeException e) {
  243. e.printStackTrace();
  244. throw new Exception("密文长度非法");
  245. } catch (BadPaddingException e) {
  246. e.printStackTrace();
  247. throw new Exception("密文数据已损坏");
  248. }
  249. }
  250. private static String base64ToStr(byte[] b) {
  251. return javax.xml.bind.DatatypeConverter.printBase64Binary(b);
  252. }
  253. private static byte[] strToBase64(String str) {
  254. return javax.xml.bind.DatatypeConverter.parseBase64Binary(str);
  255. }
  256. }