|
|
@@ -1,251 +1,251 @@
|
|
|
-package com.java110.api.smo.payment.adapt.plutuspay;
|
|
|
-
|
|
|
-import com.alibaba.fastjson.JSONObject;
|
|
|
-import org.bouncycastle.util.encoders.Base64;
|
|
|
-
|
|
|
-import javax.crypto.Cipher;
|
|
|
-import javax.crypto.spec.IvParameterSpec;
|
|
|
-import javax.crypto.spec.SecretKeySpec;
|
|
|
-import java.io.BufferedInputStream;
|
|
|
-import java.io.ByteArrayOutputStream;
|
|
|
-import java.io.PrintWriter;
|
|
|
-import java.io.UnsupportedEncodingException;
|
|
|
-import java.net.HttpURLConnection;
|
|
|
-import java.net.URL;
|
|
|
-import java.security.*;
|
|
|
-import java.security.spec.InvalidKeySpecException;
|
|
|
-import java.security.spec.PKCS8EncodedKeySpec;
|
|
|
-import java.security.spec.X509EncodedKeySpec;
|
|
|
-
|
|
|
-
|
|
|
-/**
|
|
|
- * AES加密解密算法
|
|
|
- *
|
|
|
- * @author long
|
|
|
- */
|
|
|
-public class PlutusUtil {
|
|
|
- // /** 算法/模式/填充 **/
|
|
|
- private static final String CipherMode = "AES/CBC/PKCS5Padding";
|
|
|
-
|
|
|
- private static final String SIGNATURE_ALGORITHM = "SHA256withRSA";
|
|
|
-
|
|
|
- //密钥
|
|
|
- public static String SECRET_KEY = "3738597658384d6c316a4758527a5a35";
|
|
|
-
|
|
|
-
|
|
|
- // /** 创建密钥 **/
|
|
|
- private static SecretKeySpec createKey(String key) {
|
|
|
- byte[] data = null;
|
|
|
- data = hexStringToByteArray(key);
|
|
|
- return new SecretKeySpec(data, "AES");
|
|
|
- }
|
|
|
-
|
|
|
- /**
|
|
|
- * 实例化私钥
|
|
|
- *
|
|
|
- * @return
|
|
|
- */
|
|
|
- private static PrivateKey getPrivateKey() {
|
|
|
- PrivateKey privateKey = null;
|
|
|
- String priKey = "MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDKO3fVJVtKuBlj\n" +
|
|
|
- "T2HkhjQykS/jKiNuQ4o0IItGJwTv4IX7m+vlKwqPQFylr1POdRX0z4lwFWRWvxCv\n" +
|
|
|
- "fpORW83W6a6J6LSKfDc5g5h0mhnYdYMdzLawVEM1YqJD5EVRQZHKleMvwkZbLWt0\n" +
|
|
|
- "bFJ2o4uVDO7bs/ABv6UdAmOlP6K2fUcw14r5nF+sUpXw9v2wCQys3k3djGOQJQFX\n" +
|
|
|
- "7/aADXsROp0xPFhHVgu18Rtjp7y5ib8bQ1obMmlf+4yThjlAMJQN9sBTOByUXLQw\n" +
|
|
|
- "VCCL5oYsSs318mnJnTSmkK88pxDYp1Y2K7WQDbZtFiDbNA4bqCecQGbX+6c7NWSr\n" +
|
|
|
- "dWMn0BsfAgMBAAECggEBAJXh1UKH2U1bfJV59Bemz3Da4h7+0BucuwU/SXnI2YPf\n" +
|
|
|
- "Z+2+9ep3J/Bbx06UzwwpAwjZ+Aa2FBOmr/shWMVWwQwTTWSwr34j6doaiheBTr56\n" +
|
|
|
- "+Z5QZuXwzY73d0PSHv3GFwOKa0KuPe69jvJOhh+fvofNegojJjJlkz4Y0zlaHIIa\n" +
|
|
|
- "ri5iuKM2b5sSeoohCwJF9vmkje9UUpzYgIQhiiLe7jHIj6PP+ILA/+J0IqlqZg7Z\n" +
|
|
|
- "nZIClUfy1Bn533yxCHvvM2V1gkT4zsmLtgIsJrGP3FHKW0yGj2JKaxI8T4JtjYCX\n" +
|
|
|
- "QhXoYkzjr+111udD8oe0Tg/8PquFvqi5Cq0rkDqNwsECgYEA5ENMeAuENaG1TKov\n" +
|
|
|
- "rpXUhmrB1tOcp/BvOLq4KIsgY6/4k2q4MbpK3qXeY90YlLaEsggD8eiEG3RNmGNR\n" +
|
|
|
- "IbmnqyQBQyk+KYCMTGBTRGqwwjJjTDBkV0hOeLV8CBBcAFGKXLf15HyhuG4xRhvu\n" +
|
|
|
- "Sq8YcIbvA9fSLkaaYY/pyuoQA3kCgYEA4s5r20Na9WQ5M3QLRY5HMlUb0E0SMSEd\n" +
|
|
|
- "4UF6mgzpdafDWSsvcOSnJguahZ25DJk12ptKKaJPXxPEa2+u0FN/Jv9KDPkXggXS\n" +
|
|
|
- "z6yS9E1HfFSbRK6An1Q+34vDahrU5lTJQ7eKYDzb2Xm1gI1VxrxdAN5+Bk3IvH1T\n" +
|
|
|
- "FUowLOFGFVcCgYAYwqgX2X/05V6qO0fC02PjVM9EA15Z5T3bVH3HgBf6WEtJimkC\n" +
|
|
|
- "k+etMSbnhEM3Vnkcarwq0IMMC1ijcBqL4vyqFtTAOUgR7mzJmCVQJZaY6ihVSmaI\n" +
|
|
|
- "BULl2yHiKgwgyLeOiTH2IALW47UamssFdOrcwfZJX27gMC5s6NR+e1dTWQKBgFMu\n" +
|
|
|
- "qdgM5/s/+sqoMMod2HbZSA4pdhaWssK+pRyCx8zi7n5xnECnW7ZUYyPGKOw59Mps\n" +
|
|
|
- "UdLbOIkCUvOkTlURinze/GWtpbWGNT79aBg5j5JF5XxXE81btIOAWvc7SAIB7p7r\n" +
|
|
|
- "XdDWATvNq4euTltJEkMTVt0xAgI/ZI1WXDzZkj6ZAoGBANTu3Ko+x8OgH3WdMSxD\n" +
|
|
|
- "YTersdTb4j2bj3IkZF8xJemyO7qerEK6H9mkGjSZlR17bQeE3b0RF97GgIw/fIZX\n" +
|
|
|
- "o6oE7re3EaCp6/PIXTzTPRlLTPNlBvFqDrNurM0YndjAgANa1tDDQ12W8Vtjvv8g\n" +
|
|
|
- "mX7PvHOnfws522nLZHBz+SzT";
|
|
|
-
|
|
|
- try {
|
|
|
-
|
|
|
- PKCS8EncodedKeySpec priPKCS8 = new PKCS8EncodedKeySpec(Base64.decode(priKey.getBytes()));
|
|
|
- KeyFactory keyf = KeyFactory.getInstance("RSA");
|
|
|
- privateKey = keyf.generatePrivate(priPKCS8);
|
|
|
- } catch (Exception e) {
|
|
|
- e.printStackTrace();
|
|
|
- }
|
|
|
- return privateKey;
|
|
|
- }
|
|
|
-
|
|
|
-
|
|
|
- //实例化公钥
|
|
|
- public static PublicKey getPublicKey() {
|
|
|
- PublicKey publicKey = null;
|
|
|
- String pubKey = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsIvJ1y1G7/BaWqcq/qVc\n" +
|
|
|
- "6u7nQb7nuH9vI2MoJc2H9ZGVD27oOIPkEDy7kIiteIaq5lrj6Z8VpG4n84MycsC7\n" +
|
|
|
- "/7AVScV238pdBkQM/vtm6j3jJsh7dcAU/ngMTzusUgFKlUhClR4uztQM+/obIcAl\n" +
|
|
|
- "wDlGnY/Nw5XbmzE6igcLgAZLkYq54hfJSG7EyctonL8Q8SPn51eEy9TMh3jju/RH\n" +
|
|
|
- "KeZzpJ5mYTFzqGU798rzv6r9uBKC/lZvuQcQwK7li4ctINA3EPmRbiLwzLZnTZBf\n" +
|
|
|
- "h7AmtTMqM2NYrn6Co23NQYLdg0WPSPv1Sxj69BSJ1q62boT2gOO3rsxaK8FN3EJb\n" +
|
|
|
- "sQIDAQAB";
|
|
|
-
|
|
|
- try {
|
|
|
- X509EncodedKeySpec PubKeySpec = new X509EncodedKeySpec(
|
|
|
- Base64.decode(pubKey.getBytes()));
|
|
|
- KeyFactory keyFactory = KeyFactory.getInstance("RSA");
|
|
|
- // 取公钥匙对象
|
|
|
- publicKey = keyFactory.generatePublic(PubKeySpec);
|
|
|
- } catch (NoSuchAlgorithmException e1) {
|
|
|
- e1.printStackTrace();
|
|
|
- } catch (InvalidKeySpecException e1) {
|
|
|
- e1.printStackTrace();
|
|
|
- }
|
|
|
- return publicKey;
|
|
|
- }
|
|
|
-
|
|
|
-
|
|
|
- // /** 加密字节数据 **/
|
|
|
- public static byte[] encrypt(byte[] content, String password) {
|
|
|
- try {
|
|
|
- byte[] data = hexStringToByteArray(password);
|
|
|
- SecretKeySpec key = new SecretKeySpec(data, "AES");
|
|
|
- Cipher cipher = Cipher.getInstance(CipherMode);
|
|
|
- Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider());
|
|
|
- cipher.init(Cipher.ENCRYPT_MODE, key, new IvParameterSpec(new byte[16]));
|
|
|
- byte[] result = cipher.doFinal(content);
|
|
|
- return result;
|
|
|
- } catch (Exception e) {
|
|
|
- e.printStackTrace();
|
|
|
- }
|
|
|
- return null;
|
|
|
- }
|
|
|
-
|
|
|
-
|
|
|
- /**
|
|
|
- * 解密AES加密过的字符串
|
|
|
- *
|
|
|
- * @param content AES加密过过的内容
|
|
|
- * @param password 加密时的密码
|
|
|
- * @return 明文
|
|
|
- */
|
|
|
- public static byte[] decrypt(byte[] content, String password) {
|
|
|
- try {
|
|
|
- byte[] data = hexStringToByteArray(password);
|
|
|
- SecretKeySpec key = new SecretKeySpec(data, "AES");
|
|
|
- Cipher cipher = Cipher.getInstance(CipherMode);
|
|
|
- cipher.init(Cipher.DECRYPT_MODE, key, new IvParameterSpec(new byte[16]));
|
|
|
- byte[] result = cipher.doFinal(content);
|
|
|
- return result;
|
|
|
- } catch (Exception e) {
|
|
|
- e.printStackTrace();
|
|
|
- }
|
|
|
- return null;
|
|
|
- }
|
|
|
-
|
|
|
- public static String Encryption(String url) {
|
|
|
- JSONObject object = new JSONObject();
|
|
|
- try {
|
|
|
- byte[] b = url.getBytes("UTF-8");
|
|
|
- //AES加密
|
|
|
- byte[] text = PlutusUtil.encrypt(b, SECRET_KEY);
|
|
|
- String content = Base64.toBase64String(text);
|
|
|
-
|
|
|
- //签名
|
|
|
- byte[] sign = PlutusUtil.sign256(text, getPrivateKey());
|
|
|
- String signature = Base64.toBase64String(sign);
|
|
|
-
|
|
|
- object.put("devId", "xqHQzM5n");
|
|
|
- object.put("content", content);
|
|
|
- object.put("signature", signature);
|
|
|
-
|
|
|
- } catch (UnsupportedEncodingException e) {
|
|
|
- e.printStackTrace();
|
|
|
- }
|
|
|
- return object.toString();
|
|
|
- }
|
|
|
-
|
|
|
-
|
|
|
- public static byte[] hexStringToByteArray(String s) {
|
|
|
- int len = s.length();
|
|
|
- byte[] b = new byte[len / 2];
|
|
|
- for (int i = 0; i < len; i += 2) {
|
|
|
- // 两位一组,表示一个字节,把这样表示的16进制字符串,还原成一个字节
|
|
|
- b[i / 2] = (byte) ((Character.digit(s.charAt(i), 16) << 4) + Character
|
|
|
- .digit(s.charAt(i + 1), 16));
|
|
|
- }
|
|
|
- return b;
|
|
|
- }
|
|
|
-
|
|
|
- //SHA256withRSA签名
|
|
|
- public static byte[] sign256(byte[] data, PrivateKey privateKey) {
|
|
|
- byte[] signed = null;
|
|
|
- Signature signature = null;
|
|
|
- try {
|
|
|
- signature = Signature.getInstance(SIGNATURE_ALGORITHM);
|
|
|
- signature.initSign(privateKey);
|
|
|
- signature.update(data);
|
|
|
- signed = signature.sign();
|
|
|
- } catch (NoSuchAlgorithmException | InvalidKeyException | SignatureException e) {
|
|
|
- e.printStackTrace();
|
|
|
- }
|
|
|
- return signed;
|
|
|
- }
|
|
|
-
|
|
|
-
|
|
|
- //SHA256withRSA验签
|
|
|
- public static boolean verify256(String data, byte[] sign) {
|
|
|
- if (data == null || sign == null) {
|
|
|
- return false;
|
|
|
- }
|
|
|
- try {
|
|
|
- Signature signetcheck = Signature.getInstance(SIGNATURE_ALGORITHM);
|
|
|
- signetcheck.initVerify(getPublicKey());
|
|
|
- signetcheck.update(Base64.decode(data));
|
|
|
- return signetcheck.verify(sign);
|
|
|
- } catch (Exception e) {
|
|
|
- return false;
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- public static String post(String path,String post){
|
|
|
- URL url = null;
|
|
|
- try {
|
|
|
- url = new URL(path);
|
|
|
- HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection();
|
|
|
- httpURLConnection.setRequestMethod("POST");// 提交模式
|
|
|
- // conn.setConnectTimeout(10000);//连接超时 单位毫秒
|
|
|
- httpURLConnection.setReadTimeout(15000);//读取超时 单位毫秒
|
|
|
- // 发送POST请求必须设置如下两行
|
|
|
- httpURLConnection.setDoOutput(true);
|
|
|
- httpURLConnection.setDoInput(true);
|
|
|
- // 获取URLConnection对象对应的输出流
|
|
|
- PrintWriter printWriter = new PrintWriter(httpURLConnection.getOutputStream());
|
|
|
- // 发送请求参数
|
|
|
- printWriter.write(post);//post的参数 xx=xx&yy=yy
|
|
|
- // flush输出流的缓冲
|
|
|
- printWriter.flush();
|
|
|
- //开始获取数据
|
|
|
- BufferedInputStream bis = new BufferedInputStream(httpURLConnection.getInputStream());
|
|
|
- ByteArrayOutputStream bos = new ByteArrayOutputStream();
|
|
|
- int len;
|
|
|
- byte[] arr = new byte[1024];
|
|
|
- while((len=bis.read(arr))!= -1){
|
|
|
- bos.write(arr,0,len);
|
|
|
- bos.flush();
|
|
|
- }
|
|
|
- bos.close();
|
|
|
- return bos.toString();
|
|
|
- } catch (Exception e) {
|
|
|
- e.printStackTrace();
|
|
|
- }
|
|
|
- return "请求失败";
|
|
|
- }
|
|
|
-}
|
|
|
+package com.java110.core.factory;
|
|
|
+
|
|
|
+import com.alibaba.fastjson.JSONObject;
|
|
|
+import org.bouncycastle.util.encoders.Base64;
|
|
|
+
|
|
|
+import javax.crypto.Cipher;
|
|
|
+import javax.crypto.spec.IvParameterSpec;
|
|
|
+import javax.crypto.spec.SecretKeySpec;
|
|
|
+import java.io.BufferedInputStream;
|
|
|
+import java.io.ByteArrayOutputStream;
|
|
|
+import java.io.PrintWriter;
|
|
|
+import java.io.UnsupportedEncodingException;
|
|
|
+import java.net.HttpURLConnection;
|
|
|
+import java.net.URL;
|
|
|
+import java.security.*;
|
|
|
+import java.security.spec.InvalidKeySpecException;
|
|
|
+import java.security.spec.PKCS8EncodedKeySpec;
|
|
|
+import java.security.spec.X509EncodedKeySpec;
|
|
|
+
|
|
|
+
|
|
|
+/**
|
|
|
+ * AES加密解密算法
|
|
|
+ *
|
|
|
+ * @author long
|
|
|
+ */
|
|
|
+public class PlutusFactory {
|
|
|
+ // /** 算法/模式/填充 **/
|
|
|
+ private static final String CipherMode = "AES/CBC/PKCS5Padding";
|
|
|
+
|
|
|
+ private static final String SIGNATURE_ALGORITHM = "SHA256withRSA";
|
|
|
+
|
|
|
+ //密钥
|
|
|
+ public static String SECRET_KEY = "3738597658384d6c316a4758527a5a35";
|
|
|
+
|
|
|
+
|
|
|
+ // /** 创建密钥 **/
|
|
|
+ private static SecretKeySpec createKey(String key) {
|
|
|
+ byte[] data = null;
|
|
|
+ data = hexStringToByteArray(key);
|
|
|
+ return new SecretKeySpec(data, "AES");
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 实例化私钥
|
|
|
+ *
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ private static PrivateKey getPrivateKey() {
|
|
|
+ PrivateKey privateKey = null;
|
|
|
+ String priKey = "MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDKO3fVJVtKuBlj\n" +
|
|
|
+ "T2HkhjQykS/jKiNuQ4o0IItGJwTv4IX7m+vlKwqPQFylr1POdRX0z4lwFWRWvxCv\n" +
|
|
|
+ "fpORW83W6a6J6LSKfDc5g5h0mhnYdYMdzLawVEM1YqJD5EVRQZHKleMvwkZbLWt0\n" +
|
|
|
+ "bFJ2o4uVDO7bs/ABv6UdAmOlP6K2fUcw14r5nF+sUpXw9v2wCQys3k3djGOQJQFX\n" +
|
|
|
+ "7/aADXsROp0xPFhHVgu18Rtjp7y5ib8bQ1obMmlf+4yThjlAMJQN9sBTOByUXLQw\n" +
|
|
|
+ "VCCL5oYsSs318mnJnTSmkK88pxDYp1Y2K7WQDbZtFiDbNA4bqCecQGbX+6c7NWSr\n" +
|
|
|
+ "dWMn0BsfAgMBAAECggEBAJXh1UKH2U1bfJV59Bemz3Da4h7+0BucuwU/SXnI2YPf\n" +
|
|
|
+ "Z+2+9ep3J/Bbx06UzwwpAwjZ+Aa2FBOmr/shWMVWwQwTTWSwr34j6doaiheBTr56\n" +
|
|
|
+ "+Z5QZuXwzY73d0PSHv3GFwOKa0KuPe69jvJOhh+fvofNegojJjJlkz4Y0zlaHIIa\n" +
|
|
|
+ "ri5iuKM2b5sSeoohCwJF9vmkje9UUpzYgIQhiiLe7jHIj6PP+ILA/+J0IqlqZg7Z\n" +
|
|
|
+ "nZIClUfy1Bn533yxCHvvM2V1gkT4zsmLtgIsJrGP3FHKW0yGj2JKaxI8T4JtjYCX\n" +
|
|
|
+ "QhXoYkzjr+111udD8oe0Tg/8PquFvqi5Cq0rkDqNwsECgYEA5ENMeAuENaG1TKov\n" +
|
|
|
+ "rpXUhmrB1tOcp/BvOLq4KIsgY6/4k2q4MbpK3qXeY90YlLaEsggD8eiEG3RNmGNR\n" +
|
|
|
+ "IbmnqyQBQyk+KYCMTGBTRGqwwjJjTDBkV0hOeLV8CBBcAFGKXLf15HyhuG4xRhvu\n" +
|
|
|
+ "Sq8YcIbvA9fSLkaaYY/pyuoQA3kCgYEA4s5r20Na9WQ5M3QLRY5HMlUb0E0SMSEd\n" +
|
|
|
+ "4UF6mgzpdafDWSsvcOSnJguahZ25DJk12ptKKaJPXxPEa2+u0FN/Jv9KDPkXggXS\n" +
|
|
|
+ "z6yS9E1HfFSbRK6An1Q+34vDahrU5lTJQ7eKYDzb2Xm1gI1VxrxdAN5+Bk3IvH1T\n" +
|
|
|
+ "FUowLOFGFVcCgYAYwqgX2X/05V6qO0fC02PjVM9EA15Z5T3bVH3HgBf6WEtJimkC\n" +
|
|
|
+ "k+etMSbnhEM3Vnkcarwq0IMMC1ijcBqL4vyqFtTAOUgR7mzJmCVQJZaY6ihVSmaI\n" +
|
|
|
+ "BULl2yHiKgwgyLeOiTH2IALW47UamssFdOrcwfZJX27gMC5s6NR+e1dTWQKBgFMu\n" +
|
|
|
+ "qdgM5/s/+sqoMMod2HbZSA4pdhaWssK+pRyCx8zi7n5xnECnW7ZUYyPGKOw59Mps\n" +
|
|
|
+ "UdLbOIkCUvOkTlURinze/GWtpbWGNT79aBg5j5JF5XxXE81btIOAWvc7SAIB7p7r\n" +
|
|
|
+ "XdDWATvNq4euTltJEkMTVt0xAgI/ZI1WXDzZkj6ZAoGBANTu3Ko+x8OgH3WdMSxD\n" +
|
|
|
+ "YTersdTb4j2bj3IkZF8xJemyO7qerEK6H9mkGjSZlR17bQeE3b0RF97GgIw/fIZX\n" +
|
|
|
+ "o6oE7re3EaCp6/PIXTzTPRlLTPNlBvFqDrNurM0YndjAgANa1tDDQ12W8Vtjvv8g\n" +
|
|
|
+ "mX7PvHOnfws522nLZHBz+SzT";
|
|
|
+
|
|
|
+ try {
|
|
|
+
|
|
|
+ PKCS8EncodedKeySpec priPKCS8 = new PKCS8EncodedKeySpec(Base64.decode(priKey.getBytes()));
|
|
|
+ KeyFactory keyf = KeyFactory.getInstance("RSA");
|
|
|
+ privateKey = keyf.generatePrivate(priPKCS8);
|
|
|
+ } catch (Exception e) {
|
|
|
+ e.printStackTrace();
|
|
|
+ }
|
|
|
+ return privateKey;
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ //实例化公钥
|
|
|
+ public static PublicKey getPublicKey() {
|
|
|
+ PublicKey publicKey = null;
|
|
|
+ String pubKey = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsIvJ1y1G7/BaWqcq/qVc\n" +
|
|
|
+ "6u7nQb7nuH9vI2MoJc2H9ZGVD27oOIPkEDy7kIiteIaq5lrj6Z8VpG4n84MycsC7\n" +
|
|
|
+ "/7AVScV238pdBkQM/vtm6j3jJsh7dcAU/ngMTzusUgFKlUhClR4uztQM+/obIcAl\n" +
|
|
|
+ "wDlGnY/Nw5XbmzE6igcLgAZLkYq54hfJSG7EyctonL8Q8SPn51eEy9TMh3jju/RH\n" +
|
|
|
+ "KeZzpJ5mYTFzqGU798rzv6r9uBKC/lZvuQcQwK7li4ctINA3EPmRbiLwzLZnTZBf\n" +
|
|
|
+ "h7AmtTMqM2NYrn6Co23NQYLdg0WPSPv1Sxj69BSJ1q62boT2gOO3rsxaK8FN3EJb\n" +
|
|
|
+ "sQIDAQAB";
|
|
|
+
|
|
|
+ try {
|
|
|
+ X509EncodedKeySpec PubKeySpec = new X509EncodedKeySpec(
|
|
|
+ Base64.decode(pubKey.getBytes()));
|
|
|
+ KeyFactory keyFactory = KeyFactory.getInstance("RSA");
|
|
|
+ // 取公钥匙对象
|
|
|
+ publicKey = keyFactory.generatePublic(PubKeySpec);
|
|
|
+ } catch (NoSuchAlgorithmException e1) {
|
|
|
+ e1.printStackTrace();
|
|
|
+ } catch (InvalidKeySpecException e1) {
|
|
|
+ e1.printStackTrace();
|
|
|
+ }
|
|
|
+ return publicKey;
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ // /** 加密字节数据 **/
|
|
|
+ public static byte[] encrypt(byte[] content, String password) {
|
|
|
+ try {
|
|
|
+ byte[] data = hexStringToByteArray(password);
|
|
|
+ SecretKeySpec key = new SecretKeySpec(data, "AES");
|
|
|
+ Cipher cipher = Cipher.getInstance(CipherMode);
|
|
|
+ Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider());
|
|
|
+ cipher.init(Cipher.ENCRYPT_MODE, key, new IvParameterSpec(new byte[16]));
|
|
|
+ byte[] result = cipher.doFinal(content);
|
|
|
+ return result;
|
|
|
+ } catch (Exception e) {
|
|
|
+ e.printStackTrace();
|
|
|
+ }
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 解密AES加密过的字符串
|
|
|
+ *
|
|
|
+ * @param content AES加密过过的内容
|
|
|
+ * @param password 加密时的密码
|
|
|
+ * @return 明文
|
|
|
+ */
|
|
|
+ public static byte[] decrypt(byte[] content, String password) {
|
|
|
+ try {
|
|
|
+ byte[] data = hexStringToByteArray(password);
|
|
|
+ SecretKeySpec key = new SecretKeySpec(data, "AES");
|
|
|
+ Cipher cipher = Cipher.getInstance(CipherMode);
|
|
|
+ cipher.init(Cipher.DECRYPT_MODE, key, new IvParameterSpec(new byte[16]));
|
|
|
+ byte[] result = cipher.doFinal(content);
|
|
|
+ return result;
|
|
|
+ } catch (Exception e) {
|
|
|
+ e.printStackTrace();
|
|
|
+ }
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+
|
|
|
+ public static String Encryption(String url) {
|
|
|
+ JSONObject object = new JSONObject();
|
|
|
+ try {
|
|
|
+ byte[] b = url.getBytes("UTF-8");
|
|
|
+ //AES加密
|
|
|
+ byte[] text = PlutusFactory.encrypt(b, SECRET_KEY);
|
|
|
+ String content = Base64.toBase64String(text);
|
|
|
+
|
|
|
+ //签名
|
|
|
+ byte[] sign = PlutusFactory.sign256(text, getPrivateKey());
|
|
|
+ String signature = Base64.toBase64String(sign);
|
|
|
+
|
|
|
+ object.put("devId", "xqHQzM5n");
|
|
|
+ object.put("content", content);
|
|
|
+ object.put("signature", signature);
|
|
|
+
|
|
|
+ } catch (UnsupportedEncodingException e) {
|
|
|
+ e.printStackTrace();
|
|
|
+ }
|
|
|
+ return object.toString();
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ public static byte[] hexStringToByteArray(String s) {
|
|
|
+ int len = s.length();
|
|
|
+ byte[] b = new byte[len / 2];
|
|
|
+ for (int i = 0; i < len; i += 2) {
|
|
|
+ // 两位一组,表示一个字节,把这样表示的16进制字符串,还原成一个字节
|
|
|
+ b[i / 2] = (byte) ((Character.digit(s.charAt(i), 16) << 4) + Character
|
|
|
+ .digit(s.charAt(i + 1), 16));
|
|
|
+ }
|
|
|
+ return b;
|
|
|
+ }
|
|
|
+
|
|
|
+ //SHA256withRSA签名
|
|
|
+ public static byte[] sign256(byte[] data, PrivateKey privateKey) {
|
|
|
+ byte[] signed = null;
|
|
|
+ Signature signature = null;
|
|
|
+ try {
|
|
|
+ signature = Signature.getInstance(SIGNATURE_ALGORITHM);
|
|
|
+ signature.initSign(privateKey);
|
|
|
+ signature.update(data);
|
|
|
+ signed = signature.sign();
|
|
|
+ } catch (NoSuchAlgorithmException | InvalidKeyException | SignatureException e) {
|
|
|
+ e.printStackTrace();
|
|
|
+ }
|
|
|
+ return signed;
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ //SHA256withRSA验签
|
|
|
+ public static boolean verify256(String data, byte[] sign) {
|
|
|
+ if (data == null || sign == null) {
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ try {
|
|
|
+ Signature signetcheck = Signature.getInstance(SIGNATURE_ALGORITHM);
|
|
|
+ signetcheck.initVerify(getPublicKey());
|
|
|
+ signetcheck.update(Base64.decode(data));
|
|
|
+ return signetcheck.verify(sign);
|
|
|
+ } catch (Exception e) {
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ public static String post(String path,String post){
|
|
|
+ URL url = null;
|
|
|
+ try {
|
|
|
+ url = new URL(path);
|
|
|
+ HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection();
|
|
|
+ httpURLConnection.setRequestMethod("POST");// 提交模式
|
|
|
+ // conn.setConnectTimeout(10000);//连接超时 单位毫秒
|
|
|
+ httpURLConnection.setReadTimeout(15000);//读取超时 单位毫秒
|
|
|
+ // 发送POST请求必须设置如下两行
|
|
|
+ httpURLConnection.setDoOutput(true);
|
|
|
+ httpURLConnection.setDoInput(true);
|
|
|
+ // 获取URLConnection对象对应的输出流
|
|
|
+ PrintWriter printWriter = new PrintWriter(httpURLConnection.getOutputStream());
|
|
|
+ // 发送请求参数
|
|
|
+ printWriter.write(post);//post的参数 xx=xx&yy=yy
|
|
|
+ // flush输出流的缓冲
|
|
|
+ printWriter.flush();
|
|
|
+ //开始获取数据
|
|
|
+ BufferedInputStream bis = new BufferedInputStream(httpURLConnection.getInputStream());
|
|
|
+ ByteArrayOutputStream bos = new ByteArrayOutputStream();
|
|
|
+ int len;
|
|
|
+ byte[] arr = new byte[1024];
|
|
|
+ while((len=bis.read(arr))!= -1){
|
|
|
+ bos.write(arr,0,len);
|
|
|
+ bos.flush();
|
|
|
+ }
|
|
|
+ bos.close();
|
|
|
+ return bos.toString();
|
|
|
+ } catch (Exception e) {
|
|
|
+ e.printStackTrace();
|
|
|
+ }
|
|
|
+ return "请求失败";
|
|
|
+ }
|
|
|
+}
|