RSAUtils.java 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196
  1. package com.template.common.utils;
  2. import net.sf.jsqlparser.expression.StringValue;
  3. import org.apache.tomcat.util.codec.binary.Base64;
  4. import javax.crypto.Cipher;
  5. import java.io.ByteArrayOutputStream;
  6. import java.nio.charset.StandardCharsets;
  7. import java.security.*;
  8. import java.security.spec.PKCS8EncodedKeySpec;
  9. import java.security.spec.X509EncodedKeySpec;
  10. import java.util.HashMap;
  11. /**
  12. * @Author: codingliang
  13. * @Description: TODO
  14. * @Date: 2022-08-04 10:53
  15. * @Version: V1.0
  16. **/
  17. public class RSAUtils {
  18. /**
  19. * RSA最大加密明文大小
  20. */
  21. private static final int MAX_ENCRYPT_BLOCK = 117;
  22. /**
  23. * RSA最大解密密文大小
  24. */
  25. private static final int MAX_DECRYPT_BLOCK = 128;
  26. private static final String ALGORITHM_NAME = "RSA";
  27. private static final String MD5_RSA = "MD5withRSA";
  28. /**
  29. * 获取密钥对
  30. */
  31. public static KeyPair getKeyPair() throws Exception {
  32. KeyPairGenerator generator = KeyPairGenerator.getInstance(ALGORITHM_NAME);
  33. generator.initialize(1024);
  34. return generator.generateKeyPair();
  35. }
  36. /**
  37. * 获取base64加密后密钥对
  38. */
  39. public static HashMap<String, String> getKeyPairMap() throws Exception {
  40. KeyPairGenerator generator = KeyPairGenerator.getInstance(ALGORITHM_NAME);
  41. generator.initialize(1024);
  42. KeyPair keyPair = generator.generateKeyPair();
  43. String privateKey = new String(Base64.encodeBase64(keyPair.getPrivate().getEncoded()));
  44. String publicKey = new String(Base64.encodeBase64(keyPair.getPublic().getEncoded()));
  45. HashMap<String, String> keyMap = new HashMap<>();
  46. keyMap.put("privateKey", privateKey);
  47. keyMap.put("publicKey", publicKey);
  48. return keyMap;
  49. }
  50. /**
  51. * 获取公钥
  52. *
  53. * @param publicKey base64加密的公钥字符串
  54. */
  55. public static PublicKey getPublicKey(String publicKey) throws Exception {
  56. byte[] decodedKey = Base64.decodeBase64(publicKey.getBytes());
  57. X509EncodedKeySpec keySpec = new X509EncodedKeySpec(decodedKey);
  58. KeyFactory keyFactory = KeyFactory.getInstance(ALGORITHM_NAME);
  59. return keyFactory.generatePublic(keySpec);
  60. }
  61. /**
  62. * RSA加密
  63. *
  64. * @param data 待加密数据
  65. * @param publicKey 公钥
  66. */
  67. public static String encrypt(String data, PublicKey publicKey) throws Exception {
  68. Cipher cipher = Cipher.getInstance(ALGORITHM_NAME);
  69. cipher.init(Cipher.ENCRYPT_MODE, publicKey);
  70. int inputLen = data.getBytes().length;
  71. ByteArrayOutputStream out = new ByteArrayOutputStream();
  72. int offset = 0;
  73. byte[] cache;
  74. int i = 0;
  75. // 对数据分段加密
  76. while (inputLen - offset > 0) {
  77. if (inputLen - offset > MAX_ENCRYPT_BLOCK) {
  78. cache = cipher.doFinal(data.getBytes(), offset, MAX_ENCRYPT_BLOCK);
  79. } else {
  80. cache = cipher.doFinal(data.getBytes(), offset, inputLen - offset);
  81. }
  82. out.write(cache, 0, cache.length);
  83. i++;
  84. offset = i * MAX_ENCRYPT_BLOCK;
  85. }
  86. byte[] encryptedData = out.toByteArray();
  87. out.close();
  88. // 获取加密内容使用base64进行编码,并以UTF-8为标准转化成字符串
  89. // 加密后的字符串
  90. // return new String(Base64.encodeBase64(encryptedData));
  91. return new String(Base64.encodeBase64(encryptedData));
  92. }
  93. /**
  94. * 获取私钥
  95. *
  96. * @param privateKey base64加密的私钥字符串
  97. */
  98. public static PrivateKey getPrivateKey(String privateKey) throws Exception {
  99. byte[] decodedKey = Base64.decodeBase64(privateKey.getBytes());
  100. PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(decodedKey);
  101. KeyFactory keyFactory = KeyFactory.getInstance(ALGORITHM_NAME);
  102. return keyFactory.generatePrivate(keySpec);
  103. }
  104. /**
  105. * RSA解密
  106. *
  107. * @param data 待解密数据
  108. * @param privateKey 私钥
  109. */
  110. public static String decrypt(String data, PrivateKey privateKey) throws Exception {
  111. Cipher cipher = Cipher.getInstance(ALGORITHM_NAME);
  112. cipher.init(Cipher.DECRYPT_MODE, privateKey);
  113. byte[] dataBytes = Base64.decodeBase64(data);
  114. int inputLen = dataBytes.length;
  115. ByteArrayOutputStream out = new ByteArrayOutputStream();
  116. int offset = 0;
  117. byte[] cache;
  118. int i = 0;
  119. // 对数据分段解密
  120. while (inputLen - offset > 0) {
  121. if (inputLen - offset > MAX_DECRYPT_BLOCK) {
  122. cache = cipher.doFinal(dataBytes, offset, MAX_DECRYPT_BLOCK);
  123. } else {
  124. cache = cipher.doFinal(dataBytes, offset, inputLen - offset);
  125. }
  126. out.write(cache, 0, cache.length);
  127. i++;
  128. offset = i * MAX_DECRYPT_BLOCK;
  129. }
  130. byte[] decryptedData = out.toByteArray();
  131. out.close();
  132. // 解密后的内容
  133. return new String(decryptedData, StandardCharsets.UTF_8);
  134. }
  135. public static void main(String[] args) {
  136. try {
  137. // 生成密钥对
  138. // KeyPair keyPair = getKeyPair();
  139. // String privateKey = new String(Base64.encodeBase64(keyPair.getPrivate().getEncoded()));
  140. // String publicKey = new String(Base64.encodeBase64(keyPair.getPublic().getEncoded()));
  141. // System.out.println("私钥 => " + privateKey + "\n");
  142. // System.out.println("公钥 =>" + publicKey + "\n");
  143. String privateKey = "MIICdwIBADANBgkqhkiG9w0BAQEFAASCAmEwggJdAgEAAoGBAMw5w8HTq7nIrJCw+N9VaJaBsQit3XiSJc02KFyJpUpvoeeRC+rvOlC5nzRYRf3iymdQwjeI4CX8aYi8eukbBxsHiElvOeb49qOLCdRI+4IJcDrxgkXrjRwkpv/wp4ztZXPr04WQgQ8eFXE7LgUUXlBZ7+S3rM5nX0eYT5qT7nH9AgMBAAECgYEAktdN68XYicLCYV798wckJmOl+QmaXqEm0QCJ0M+fq3/MuAXQveG42mY9FJQL71rsEZE9tFSUZnuxHgH3ljg6yGfMvrgQ5Nwsoj5eG52mYXw9JYJHA5JOC7eoZ0HxcMuDOJtuGWDQcm9/UHUKkLnTFwX8R9VqDL7Wn+R5RrTjmAECQQD+uX2K9u4g49j342IQzrnGYlSjpwXPhy+P/q/UTJHhTE3L0AKeZ/C5ZfEzc57vwwbDzTXRaFtr9DcYV8rODoUBAkEAzT+LRUfuuPfuAyjpp0NPm+iAkwtoIWdSU3bezeoH2jcMxcMCkN1PBvY79Nluj8Ml5gsjipXtkl0sqv0bhpUA/QJBANcRemRolSqD9l9mRxh10vkjcN80WH2eYJQtr/uKIumc6VqaaHuiuuduoTaV+q3pdr6/dx82A2qkqhgNmBhevgECQBCR/8FxJEHEqm+Q3wRE9+ljZPX6JscDm27nmudO7KFebmaM7ukZJOcv+/kxkK6El8uxvIXUwuBdK10GoDFGWFUCQEhiWAd+RB+tI0ndG4+i+CWIBaxArbOr5eaC0PJCu7GxRZtcxzyittv5u6jMiKYhnJatOLVGpo043NXj/QxI2lY=";
  144. // String privateKey = "-----BEGIN PRIVATE KEY-----MIICdwIBADANBgkqhkiG9w0BAQEFAASCAmEwggJdAgEAAoGBAMw5w8HTq7nIrJCw+N9VaJaBsQit3XiSJc02KFyJpUpvoeeRC+rvOlC5nzRYRf3iymdQwjeI4CX8aYi8eukbBxsHiElvOeb49qOLCdRI+4IJcDrxgkXrjRwkpv/wp4ztZXPr04WQgQ8eFXE7LgUUXlBZ7+S3rM5nX0eYT5qT7nH9AgMBAAECgYEAktdN68XYicLCYV798wckJmOl+QmaXqEm0QCJ0M+fq3/MuAXQveG42mY9FJQL71rsEZE9tFSUZnuxHgH3ljg6yGfMvrgQ5Nwsoj5eG52mYXw9JYJHA5JOC7eoZ0HxcMuDOJtuGWDQcm9/UHUKkLnTFwX8R9VqDL7Wn+R5RrTjmAECQQD+uX2K9u4g49j342IQzrnGYlSjpwXPhy+P/q/UTJHhTE3L0AKeZ/C5ZfEzc57vwwbDzTXRaFtr9DcYV8rODoUBAkEAzT+LRUfuuPfuAyjpp0NPm+iAkwtoIWdSU3bezeoH2jcMxcMCkN1PBvY79Nluj8Ml5gsjipXtkl0sqv0bhpUA/QJBANcRemRolSqD9l9mRxh10vkjcN80WH2eYJQtr/uKIumc6VqaaHuiuuduoTaV+q3pdr6/dx82A2qkqhgNmBhevgECQBCR/8FxJEHEqm+Q3wRE9+ljZPX6JscDm27nmudO7KFebmaM7ukZJOcv+/kxkK6El8uxvIXUwuBdK10GoDFGWFUCQEhiWAd+RB+tI0ndG4+i+CWIBaxArbOr5eaC0PJCu7GxRZtcxzyittv5u6jMiKYhnJatOLVGpo043NXj/QxI2lY=-----END PRIVATE KEY-----";
  145. String publicKey = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDMOcPB06u5yKyQsPjfVWiWgbEIrd14kiXNNihciaVKb6HnkQvq7zpQuZ80WEX94spnUMI3iOAl/GmIvHrpGwcbB4hJbznm+PajiwnUSPuCCXA68YJF640cJKb/8KeM7WVz69OFkIEPHhVxOy4FFF5QWe/kt6zOZ19HmE+ak+5x/QIDAQAB";
  146. // String publicKey = "-----BEGIN PUBLIC KEY-----MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDMOcPB06u5yKyQsPjfVWiWgbEIrd14kiXNNihciaVKb6HnkQvq7zpQuZ80WEX94spnUMI3iOAl/GmIvHrpGwcbB4hJbznm+PajiwnUSPuCCXA68YJF640cJKb/8KeM7WVz69OFkIEPHhVxOy4FFF5QWe/kt6zOZ19HmE+ak+5x/QIDAQAB-----END PUBLIC KEY-----";
  147. // System.out.println("私钥 => " + privateKey + "\n");
  148. // System.out.println("公钥 =>" + publicKey + "\n");
  149. // RSA加密
  150. // String data = "admin.123456";
  151. // String data = "15079248859";
  152. String data = "143891";
  153. // String data = "{\"telPhone\":\"15079248859\",\"token\":\"eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJwaG9uZSI6IjE1MDc5MjQ4ODU5Iiwicm9sZUlkIjoxLCJleHAiOjE2ODI1ODM1NzUsImlhdCI6MTY4MjMyNDM3NX0.AhwOa7220k00hIlkhkHMHnRX-tRXTgntyU7Cdv2YvSs\",\"tokenTtl\":1682583575276,\"userName\":\"朱秀平\"}";
  154. String encryptData = encrypt(data, getPublicKey(publicKey));
  155. System.out.println("encryptData = " + encryptData);
  156. System.out.println("加密后内容 => " + encryptData + "\n");
  157. // RSA解密
  158. // String s2="mbGB7v0FmeFiQSOd5h+PdMPxe/QeFFvTQ8wXgS+jfAw3Y/Yh5YQPuOaPh8bSKu2NtNU0LIWqVRLEhN3V7kwtTKTnqL/6crAdKlLsU9fkM6yLQWVPQjkPhfDPzm1yY9dS3ON3rv4Ofa/boyI3+91zs8JYHKJ0xv+fDSZtNwDKX5oFlhf7GkD///5U6T6wmY/Cmqd6R76bkOEqC0E9jd1U6DEDJ7kq9oMxE/pkAxx952kDQEE2b3smK21odAU0Sr3w8j/LkOPRvSwkt7W587RFvtwE8MAKAR2+LJPQ3x7yQT7EyOwtlPUwfm+QFOXWVy+sKWiMMcdKRseMsfGrWBC17oREwpimdb1ZdYeOYxGd49hiS1ygbsa585yOhJ9TSeLG/K6tuhj1NqH+UuzJHVIC6xI0BgqSMOIs/zB8v07xRGNyZg9gZg3/86sgY6f8Xyj2nnplBxxEBx5MSMvtvqh2NkxDZQOExdwbO4FbzmkzDR4fp2wEFzjN3DCm8x8HJdhtoFXRO/nJlVDKmLkCMGCq/drAjvBsPbcIAL8lMaaC5/a/S3/SM83X/4KXb6LsGQrVyubYjACX3l+QQ/2H85/kOo3Tn38Yn6Vxjm/bIH/8FzGDK33MpxEEeeDCeh6dhfyhhvDDdvvafWUZbUIL7nelFfY5cnu9vbwi/nHZSFQBI/o=";
  159. String s1="rJkG8pebNdrRNzeFE4l+fDaIFwNOR8aNR6kIuQT3vtnWLXxGog8UKxvvtptnMyDd9WnMmB2ADO5XVqan/fyo+eB4pXk48WJu86QP0hq0wLwYKLAz85GZmqy6oT7rAk39ZXZSUN2kwyTSaEbRpYoL4Qp+Dly3+3I2vbXPxJI/0jUPn/pHm5JjvR2w3XD64ikmhoR30gArx8Biw2hqoTGDbZNFd/2Ya0GW/AxHa1s+chm3Mw7Xctt845aXgyq7Xq8ITWLIDSpXkTV3rUK53SS/H0eWrDJvqy96GCRo4+Rh4nf+XCbp4corUaHawG9rcpjeNdHqCwZVRrvnHRzN09l6IFp9v6jNR5HcLbo77DEe6Gh0e7hLEKuryk0jbFDfRkP4AsFYonQoZ/Kstjt9bETh5m95mWEZ1PRvRYT9FUDnvOanRjrPYIfnV+C2+/JsLc13UrbpgqVz0X62pLiRZzLy7sDRYSTUuGvYF+3DhgPe/xHfYVloFEO5tBlWgP2LjCpn";
  160. String s3="kSPQjALkcaXKlKRFZlA4U4tMnBs4QE6Qn9hb/vyGaBCm0DAQ3/QYddwfUwabAX+z2scvmOru4k1hiAUymbfH6pGy+6G63meYN4AH97N+4U0I7+B8O1IjWszRaQd3rAH8mOyq4Nwev2kNDsviBTf8bYXdpZTQT6DpTGfqIy/Z5Kib0ofwTvZ/PRHGhEmehEb1SoRytpzSvtWTFhZg7Z8APyxPyI74YDfKEbU5ywZWiSDn2uK8VlYFAzzWtrVQdVrD5Tt0hZ3Hvrc5YfS1h/sic2bImWI6vf3SqJe23JQWgv6KHETF1cRC4B+g3NcvvCNt9q0v2kp/OAKD4OWVIKKd8DS4Q/YWS5G/y+6oExXTfvw7xD8AMSszqoED4/3Mu5ytL4SR4Dpazs3KMEPE2jUEMNtQ9miqIIBcw+9VS9/m1+MvtvUtVewKgleXURECXV6QfvMlt+wTkj7c+Ww8JdR0RONUqFOwNyQkKCM7QjBZYSnkkUoAZF/+/sa2bF7Myp9l";
  161. String S4="UypmNTjrrus/yh5vfbu7U4M4TY+GafpxDpHt9nhZpdRwxn5IZVwJs/uvyjb0j2jrHM352snw0MyGHv+bHpBWovryuj5ovY8yejg8Stx1OTjPY7X4Kf2P+ooZQBpQUo44uhq8y4IgSGoOFqUvvMr9z5S78OYbu8wrRfbV5u7LGEI=";
  162. String decryptData = decrypt(encryptData, getPrivateKey(privateKey));
  163. // String decryptData = decrypt(S4, getPrivateKey(privateKey));
  164. System.out.println("解密后内容 => " + decryptData + "\n");
  165. String substring = s3.substring(0,100);
  166. System.out.println("substring = " + substring);
  167. System.out.println(substring);
  168. System.out.println("substring.length() = " + substring.length());
  169. } catch (Exception e) {
  170. e.printStackTrace();
  171. System.err.println("RSA加解密异常");
  172. }
  173. }
  174. }