PingAnRSAUtils.java 9.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222
  1. package com.ydtech.modules.order.utils;
  2. import org.apache.commons.codec.binary.Base64;
  3. import org.apache.commons.lang3.StringUtils;
  4. import org.apache.log4j.lf5.util.StreamUtils;
  5. import javax.crypto.Cipher;
  6. import java.io.ByteArrayInputStream;
  7. import java.io.ByteArrayOutputStream;
  8. import java.io.InputStream;
  9. import java.security.*;
  10. import java.security.spec.PKCS8EncodedKeySpec;
  11. import java.security.spec.X509EncodedKeySpec;
  12. import java.util.*;
  13. public class PingAnRSAUtils {
  14. private static String algorithm = "SHA256withRSA";
  15. public static void main(String[] args) {
  16. String keyword = "奥迪";
  17. String userId = "123456789";
  18. String oldSign = "Ugaug0keK0tm/4Aq9easzvNUDtnEELnXq6IS52tPSCmRVccfYZe3WvOt/RmIaO2JX8vDTHcA4X3zEzXTNpJ80+75Q1t" +
  19. "/5hl5HafoWOYumRsbbywEtGtRZgngxKtNeQ6Jz/Jr6YlAki6g3y5XyKBKfE5EUpwjesR5QAZU7vs0vUY=";
  20. String publicKey = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCUoFBcJMk+rQhs" +
  21. "/MpXcxY8ltZ3Pjxsxec9cIyJ8GIKHvueh92gstmvR4ebNV3PPD4LmL7yJlycz4n17+HGF1uGpNMN5j/EFds0boan5jpetLlQ43ylzqrzq+5VG7l2Gwe" +
  22. "+YO6GSaJsstP0Av8GaXEZcGT2B0E1c5gx3XTo9th+uQIDAQAB";
  23. String privateKey = "MIICdQIBADANBgkqhkiG9w0BAQEFAASCAl8wggJbAgEAAoGBAJSgUFwkyT6tCGz8yldzFjyW1nc+PGzF5z1wjInwYgoe" +
  24. "+56H3aCy2a9Hh5s1Xc88PguYvvImXJzPifXv4cYXW4ak0w3mP8QV2zRuhqfmOl60uVDjfKXOqvOr7lUbuXYbB75g7oZJomyy0/QC" +
  25. "/wZpcRlwZPYHQTVzmDHddOj22H65AgMBAAECgYBKTh" +
  26. "//AVEvqZiFzJhowhwC7LKKaS4Sf5rNZ8CLkgeh4b2Qk4KlPeWBMTTFzxd4bTjj2VjVfYJdz5C8yVJKFBFoa0w+P/g" +
  27. "/YT5V8IqsRuF74eJeVScrBDqk5Tk5WpE/P" +
  28. "+au8gWamHrJnsansfYDCArCfOf4T48pxq4i0LXgkbg6pQJBAMj2343kFRE1ViPI87F3g7dWJv2qLgEWX9xPM4HJdtQsRpuyV5n9UGp7Nn7i08sv4Rg9aLMOjtS97Sn4M6zssKcCQQC9VCQPsPxRejznNCVYTiq6hRhCXaK5ysrVLQXFs9I7gVX3CEA746GMV8iNIv7K7q9ZnKuj2ZHcreSriyMRTOGfAkBJQcUIYkZTuY+nB8/dt2VqZZtdCLYwa0mSc8Sg4SHSAjnS89X/KlowFq4s3t65yMBTJ7+M1he28W0MyY98z+MtAkAG7jCPvnvOA7p9ACSp0dqwjzSvITxWrry0BvziGs4ETZy2+T9YseF1ALWfrPtEtG4IyrphuhIj0N3BBcvX00ejAkBkc7AXJAb+Cn0rsGZe9ZdLogVWJKA5gTYy0ThSQ2SocoCLuy+rRlBX67rHN3/0BKF+byWaf/MTdc5QtbH5pK9J";
  29. Map<String, String> bizdata = new HashMap<String, String>();
  30. bizdata.put("keyword", keyword);
  31. bizdata.put("userId", userId);
  32. // 签名前先排序
  33. String wtsign = sortParametersWithASCII(bizdata);
  34. System.out.println(wtsign);
  35. String signData = "";
  36. try {
  37. // 加签
  38. signData = sign(wtsign, privateKey);
  39. System.out.println(signData);
  40. } catch (Exception se) {
  41. }
  42. //验签
  43. Boolean verifyresult = verifySignRsa(bizdata, oldSign, publicKey);
  44. System.out.println(verifyresult);
  45. //解密方式
  46. //原始加密串
  47. String pwd = "g4otiaYyELiIEv2x9X4CDvMYfmWFZzV3VRDgzGCSjgyVR4FWxEKneEYJp" +
  48. "/MvOfqkHfseuDnJvgnNKXDOUY37q40w4GoUiurIyXOaorhpjtrBJ9jmL3n3ExDHrq0kARnUjRuw3Y2dio9WocfpCMyW0XEAYaQQZtHcIs3k2lWbLYc=";
  49. //解密
  50. try {
  51. System.out.println("解密后值为:" + rsaDecrypt(pwd, privateKey, "UTF-8"));
  52. } catch (Exception e) {
  53. // TODO Auto-generated catch block
  54. e.printStackTrace();
  55. }
  56. }
  57. public static String sign(String responseBody, String inPrivateKey) throws Exception {
  58. byte[] dataEncode = Base64.encodeBase64(responseBody.getBytes("UTF-8"));
  59. PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(Base64.decodeBase64(inPrivateKey.getBytes()));
  60. KeyFactory keyFactory = KeyFactory.getInstance("RSA");
  61. PrivateKey privateKey = keyFactory.generatePrivate(keySpec);
  62. Signature signatureChecker;
  63. Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider());
  64. signatureChecker = Signature.getInstance(algorithm);
  65. signatureChecker.initSign(privateKey);
  66. signatureChecker.update(dataEncode);
  67. byte[] sign = signatureChecker.sign();
  68. return new String(Base64.encodeBase64(sign));
  69. }
  70. public static Boolean verifySignRsa(Map param, String signature, String verifyKey) {
  71. if (!hasText(signature)) {
  72. return false;
  73. }
  74. String wtsign = "";
  75. wtsign = sortParametersWithASCII(param);
  76. Boolean verifyresult = false;
  77. verifyresult = verify(wtsign, signature, verifyKey);
  78. //兼容partnerId不加密
  79. if (!verifyresult) {
  80. param.remove("partnerId");
  81. wtsign = sortParametersWithASCII(param);
  82. verifyresult = verify(wtsign, signature, verifyKey);
  83. }
  84. return verifyresult;
  85. }
  86. /**
  87. * 验签
  88. *
  89. * @param businessdata 实际业务数据
  90. * @param signedText 加密后待验证数据
  91. * @return boolean
  92. */
  93. public static boolean verify(String businessdata, String signedText, String verifyKey) {
  94. try {
  95. String dataEncode = new String(Base64.encodeBase64(businessdata.getBytes("UTF-8")));
  96. X509EncodedKeySpec keySpec = new X509EncodedKeySpec(Base64.decodeBase64(verifyKey.getBytes()));
  97. KeyFactory keyFactory = KeyFactory.getInstance("RSA");
  98. PublicKey publicKey = keyFactory.generatePublic(keySpec);
  99. Signature signatureChecker = null;
  100. Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider());
  101. signatureChecker = Signature.getInstance(algorithm);
  102. signatureChecker.initVerify(publicKey);
  103. signatureChecker.update(dataEncode.replace("\n", "").getBytes());
  104. byte[] signBytes = signedText.getBytes("UTF-8");
  105. byte[] sign = Base64.decodeBase64(signBytes);
  106. return signatureChecker.verify(sign);
  107. } catch (Exception e) {
  108. }
  109. return false;
  110. }
  111. public static String rsaDecrypt(String content, String privateKey, String charset) throws Exception {
  112. return rsaDecrypt(content, privateKey, charset, null);
  113. }
  114. public static String rsaDecrypt(String content, String privateKey, String charset, String signType) throws Exception {
  115. int maxDecryptBlock = 256;
  116. try {
  117. PrivateKey priKey = getPrivateKeyFromPKCS8("RSA", new ByteArrayInputStream(privateKey.getBytes()));
  118. Cipher cipher = Cipher.getInstance("RSA");
  119. cipher.init(2, priKey);
  120. byte[] encryptedData = StringUtils.isEmpty(charset) ? Base64.decodeBase64(content.getBytes()) :
  121. Base64.decodeBase64(content.getBytes(charset));
  122. int inputLen = encryptedData.length;
  123. ByteArrayOutputStream out = new ByteArrayOutputStream();
  124. int offSet = 0;
  125. int i = 0;
  126. while (inputLen - offSet > 0) {
  127. byte[] cache;
  128. if (inputLen - offSet > maxDecryptBlock) {
  129. cache = cipher.doFinal(encryptedData, offSet, maxDecryptBlock);
  130. } else {
  131. cache = cipher.doFinal(encryptedData, offSet, inputLen - offSet);
  132. }
  133. out.write(cache, 0, cache.length);
  134. i++;
  135. offSet = i * maxDecryptBlock;
  136. }
  137. byte[] decryptedData = out.toByteArray();
  138. out.close();
  139. return StringUtils.isEmpty(charset) ? new String(decryptedData) : new String(decryptedData, charset);
  140. } catch (Exception e) {
  141. throw new Exception("RSA解密失败. EncodeContent = " + content + ",charset = " + charset, e);
  142. }
  143. }
  144. public static PrivateKey getPrivateKeyFromPKCS8(String algorithm, InputStream ins) throws Exception {
  145. if ((ins == null) || (StringUtils.isEmpty(algorithm))) {
  146. return null;
  147. }
  148. KeyFactory keyFactory = KeyFactory.getInstance(algorithm);
  149. byte[] encodedKey = StreamUtils.getBytes(ins);
  150. encodedKey = Base64.decodeBase64(encodedKey);
  151. return keyFactory.generatePrivate(new PKCS8EncodedKeySpec(encodedKey));
  152. }
  153. public static boolean hasText(String str) {
  154. if (!hasLength(str)) {
  155. return false;
  156. } else {
  157. int strLen = str.length();
  158. for (int i = 0; i < strLen; ++i) {
  159. if (!Character.isWhitespace(str.charAt(i))) {
  160. return true;
  161. }
  162. }
  163. return false;
  164. }
  165. }
  166. public static boolean hasLength(String str) {
  167. return str != null && str.length() > 0;
  168. }
  169. public static String sortParametersWithASCII(Map param) {
  170. List sortList = new LinkedList<String>();
  171. Iterator listadd = param.keySet().iterator();
  172. while (listadd.hasNext()) {
  173. Object obj = listadd.next();
  174. sortList.add(obj.toString());
  175. }
  176. //参数排序
  177. Collections.sort(sortList);
  178. String sortStr = "";
  179. for (int i = 0; i < sortList.size(); i++) {
  180. String paramListStr = "";
  181. //对List数据进行排序
  182. if (param.get(sortList.get(i)) instanceof java.util.List) {
  183. List dataList = (List) param.get(sortList.get(i));
  184. if (null != dataList && dataList.size() > 0) {
  185. Collections.sort(dataList);
  186. for (int k = 0; k < dataList.size(); k++) {
  187. paramListStr = paramListStr + dataList.get(k) + ",";
  188. }
  189. paramListStr = paramListStr.substring(0, paramListStr.length() - 1);
  190. }
  191. sortStr = sortStr + sortList.get(i) + "=" + paramListStr + "&";
  192. } else {
  193. sortStr = sortStr + sortList.get(i) + "=" + param.get(sortList.get(i)) + "&";
  194. }
  195. }
  196. sortStr = sortStr.substring(0, sortStr.length() - 1);
  197. return sortStr;
  198. }
  199. }