c161efb4d1b89ad622989a17546a0e0712565d7f.svn-base 7.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246
  1. package com.chinacreator.process.util;
  2. import com.alibaba.druid.util.StringUtils;
  3. import org.bouncycastle.jce.provider.BouncyCastleProvider;
  4. import javax.crypto.Cipher;
  5. import java.nio.charset.Charset;
  6. import java.security.*;
  7. import java.security.spec.PKCS8EncodedKeySpec;
  8. import java.security.spec.X509EncodedKeySpec;
  9. import java.util.regex.Matcher;
  10. import java.util.regex.Pattern;
  11. public class RsaUtil {
  12. public static void main(String[] args) throws Exception {
  13. String str = "caller=HuaweiWallet&phoneNumber=18673197465&producCode=1011&spid=123456&timestamp=20220630155542";
  14. // RSA生成方法 http://www.metools.info/code/c80.html
  15. String publicKey = "MIIBITANBgkqhkiG9w0BAQEFAAOCAQ4AMIIBCQKCAQBTKK9bNrwIsY5ApEkYH3+3" +
  16. "x0yoqHWoImtZl9ZULn6V9LlFfLL2EWVYi93K4g0nm6nT1BAdq5wTTmdGUJQH32bT" +
  17. "wMo07QXWqTg5bm4p2ZNeprAehKa2Uh6Ey1nAqlGPV8w32PmekiHKApslqiJ0Q0FQ" +
  18. "bWdvhcPuZUhRqsYx+S55d3kO4Haez4hDoYloVEypkfU4kPe2DwkpB7hT199lAewd" +
  19. "NrRS9oQo0V/+SG6blzplyLnIaXAUlKzngP11bZGz6xAKZqauMjCxUX1UPLmhJ/nN" +
  20. "k+CW5D0SY/0MuZv6UY9rBwQN/IQScGcbUTrCYpIbPJuR2/NiU24EWQ/qxcKELCFh" +
  21. "AgMBAAE=";
  22. String privateKey = "MIIEoQIBAAKCAQBTKK9bNrwIsY5ApEkYH3+3x0yoqHWoImtZl9ZULn6V9LlFfLL2" +
  23. "EWVYi93K4g0nm6nT1BAdq5wTTmdGUJQH32bTwMo07QXWqTg5bm4p2ZNeprAehKa2" +
  24. "Uh6Ey1nAqlGPV8w32PmekiHKApslqiJ0Q0FQbWdvhcPuZUhRqsYx+S55d3kO4Hae" +
  25. "z4hDoYloVEypkfU4kPe2DwkpB7hT199lAewdNrRS9oQo0V/+SG6blzplyLnIaXAU" +
  26. "lKzngP11bZGz6xAKZqauMjCxUX1UPLmhJ/nNk+CW5D0SY/0MuZv6UY9rBwQN/IQS" +
  27. "cGcbUTrCYpIbPJuR2/NiU24EWQ/qxcKELCFhAgMBAAECggEAJPQocK0zA937K+iV" +
  28. "fr3IoJ9VBoHNvwiEkcyydrgukm6swh8227hBRAbraZPoaph28GYFP1oaQk4OAKYg" +
  29. "EhuJc0Hx2XEWrhyGmqbjF3/TSDVkgDtMZiq52yMOYFqPYdaPLqYhzwB7OWzNCwC+" +
  30. "zNFyPc5QL7POrKqfZ4MvDdgAegNGNYFqz4ZF/kme6eDfRWBUVDcLC6xbpc41hcsA" +
  31. "eb8fLzfSoyRZDcbV0t/XGYnEOG7AZbdgg0SwNAELMjeSsW2hhjvpBxOWd9CALqNA" +
  32. "T6avg4aG7N5DisIKAKoLVgzBkyklHrq8PlUR4ZySm+Ch6a6NfZgu8jTsAsWWBqFS" +
  33. "B07nDQKBgQCf4FnEF5FCR6/JFORhKE8ciYTiuTii4ddPhdrXrKuLDoj0c88JwB5T" +
  34. "scTz038SPf8Zer5FrUDll1/R4FN0qbxJNVWrwnI3HE1G61qt0IlHpXLknqOcHoVK" +
  35. "8rc6Puo1Xajn0h4CPpUKk5aKyyowSOR1ozj0ysYTb2zAFQPV5ST11wKBgQCFKDxP" +
  36. "oQ0ESg7xLZRIu5IaNfCeaLDjc1gTv+kXZThIIANcCmBSxbyoy5JToFQFXJUYybgn" +
  37. "24iGaHn+l2O3Jr+Ua8xy2xz9N74potwqd7J9gEBTlodsFmki5ICXyqUx4Zpox+rk" +
  38. "lgXsFmISBIARoj1c04n/uPcbqda5gpbj1YvLhwKBgFNTTdXK5rVhwXePAPy2Uo0w" +
  39. "C2dTW/ZguKREwmt4Hiwqliy6EyUk0WmTlG/0Qh1S3Jr+Ax8zjkhbHeC4Bycds/l/" +
  40. "57fOb1LT2F7nGWrP7ky+KWSIXgNnUNdgKykbU1wfBYJVW7iVv340r9iEzOc/hnrd" +
  41. "aDkFWjkU8Nwn18jqVdofAoGAEPrJfgn2Y/ahoyWBxCiO/+Ki9UA6VjauI46URZR1" +
  42. "sdTLOOBl2gg2/3s+BIXsUOa2aHvIjOSUqzcFX26km4VIZr+8SWUhdDS4fgyzcILk" +
  43. "8tX43e/TAvh0natvrmt71zmCfBwKGu36gVl1VgDW5+i9VGnxLffDIvbsV6mMXi8r" +
  44. "7V8CgYBkAWkbE0FAn6vG5ku9kROO3Nq8FDN2R2zGyiX8jSC/IBu1q3FqPA4LzO6q" +
  45. "z70f/+EteWYZGx9eaV4u9uDelNS7L3ME2PHOuF6WeKklnMG3RcFe7wgRnrIkMyvl" +
  46. "NtdWSabvr8mxBjqM892rKfsWLp+LCcyzy1J2J6z61HL9IzuNpg==";
  47. String plainData = RsaUtil.encrypt(str, publicKey);
  48. System.out.println("plainData = " + plainData);
  49. String strR = RsaUtil.decrypt(plainData, privateKey);
  50. System.out.println("strR = " + strR);
  51. String signStr = RsaUtil.signByRSA(str, privateKey);
  52. System.out.println("sign result = " + RsaUtil.verifyRSASign(str, publicKey, signStr));
  53. }
  54. public static final Charset UTF_8 = Charset.forName("UTF-8");
  55. private static final Pattern BLANK_PATTERN = Pattern.compile("\\s*|\t|\r|\n");
  56. static {
  57. if (Security.getProvider("BC") == null) {
  58. Security.addProvider(new BouncyCastleProvider());
  59. }
  60. }
  61. public static String encrypt(String source, String enPublicKey) throws Exception {
  62. try {
  63. PublicKey key = getPublicKey(enPublicKey);
  64. Cipher cipher = Cipher.getInstance("RSA/NONE/OAEPWithSHA-256AndMGF1Padding");
  65. cipher.init(1, key);
  66. byte[] b = source.getBytes(StandardCharsets.UTF_8);
  67. return new String(Base64Util.getEncoder().encode(cipher.doFinal(b)), StandardCharsets.UTF_8);
  68. } catch (Exception var8) {
  69. throw new Exception("encrypt fail.", var8);
  70. }
  71. }
  72. public static String decrypt(String plainData, String encryptPrivateKey) throws Exception {
  73. try {
  74. PrivateKey privateKey = getPrivateKey(encryptPrivateKey);
  75. Cipher cipher = Cipher.getInstance("RSA/NONE/OAEPWithSHA-256AndMGF1Padding");
  76. cipher.init(2, privateKey);
  77. byte[] b = Base64Util.getMimeDecoder().decode(replaceBlank(plainData).getBytes(StandardCharsets.UTF_8));
  78. return new String(cipher.doFinal(b), StandardCharsets.UTF_8);
  79. } catch (Exception var8) {
  80. throw new Exception("decrypt fail.", var8);
  81. }
  82. }
  83. public static String signByRSA(String plainData, String encryptPrivateKey) throws Exception {
  84. try {
  85. PrivateKey privateKey = getPrivateKey(encryptPrivateKey);
  86. Signature signature = Signature.getInstance("SHA256WithRSA/PSS");
  87. signature.initSign(privateKey);
  88. signature.update(plainData.getBytes(UTF_8));
  89. return encodeBase64(signature.sign());
  90. } catch (GeneralSecurityException var5) {
  91. throw new Exception("sign by rsa fail.", var5);
  92. }
  93. }
  94. public static boolean verifyRSASign(String plainData, String encryptPublicKey, String signData) throws Exception {
  95. try {
  96. PublicKey publicKey = getPublicKey(encryptPublicKey);
  97. Signature signature = Signature.getInstance("SHA256WithRSA/PSS");
  98. signature.initVerify(publicKey);
  99. signature.update(plainData.getBytes(UTF_8));
  100. return signature.verify(decodeBase64(signData));
  101. } catch (GeneralSecurityException var6) {
  102. throw new Exception("check rsa sign fail.", var6);
  103. }
  104. }
  105. private static String replaceBlank(String str) {
  106. if (StringUtils.isEmpty(str)) {
  107. return str;
  108. } else {
  109. Matcher matcher = BLANK_PATTERN.matcher(str);
  110. return matcher.replaceAll("");
  111. }
  112. }
  113. private static PublicKey getPublicKey(String key) throws GeneralSecurityException {
  114. KeyFactory keyFactory = KeyFactory.getInstance("RSA");
  115. X509EncodedKeySpec keySpec = new X509EncodedKeySpec(decodeBase64(key));
  116. return keyFactory.generatePublic(keySpec);
  117. }
  118. private static PrivateKey getPrivateKey(String key) throws GeneralSecurityException {
  119. KeyFactory keyFactory = KeyFactory.getInstance("RSA");
  120. PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(decodeBase64(key));
  121. return keyFactory.generatePrivate(keySpec);
  122. }
  123. public static byte[] decodeBase64(String input) {
  124. Objects.requireNonNull(input, "decodeBase64 params is null");
  125. byte[] encodeInput = input.getBytes(UTF_8);
  126. return Base64Util.getMimeDecoder().decode(encodeInput);
  127. }
  128. public static String encodeBase64(byte[] input) {
  129. Objects.requireNonNull(input, "encodeBase64 params is null");
  130. byte[] encoded = Base64Util.getEncoder().encode(input);
  131. return new String(encoded, UTF_8);
  132. }
  133. }