Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
51 changes: 51 additions & 0 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,19 @@
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>

<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.7</source>
<target>1.7</target>
</configuration>
</plugin>
</plugins>
</build>

<dependencies>
<dependency>
<groupId>junit</groupId>
Expand All @@ -39,5 +52,43 @@
<artifactId>fastjson</artifactId>
<version>1.2.7</version>
</dependency>
<dependency>
<groupId>com.squareup.okhttp3</groupId>
<artifactId>okhttp</artifactId>
<version>3.10.0</version>
</dependency>
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.8.5</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>4.3.14.RELEASE</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.spring4all</groupId>
<artifactId>swagger-spring-boot-starter</artifactId>
<version>1.8.0.RELEASE</version>
</dependency>
</dependencies>
</project>
5 changes: 4 additions & 1 deletion src/main/java/com/wustrive/Main.java
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,10 @@ public class Main {
"HuGWTIUfItQfSFdjDrEBBuPMFGZtdwJAV5N3xyyIjfMJM4AfKYhpN333HrOvhHX1" +
"xVnsHOew8lGKnvMy9Gx11+xPISN/QYMa24dQQo5OAm0TOXwbsF73MwJAHzqaKZPs" +
"EN08JunWDOKs3ZS+92maJIm1YGdYf5ipB8/Bm3wElnJsCiAeRqYKmPpAMlCZ5x+Z" +
"AsuC1sjcp2r7xw==";
"AsuC1sjcp2r7xw=="


;

public static final String clientPublicKey = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCmzaI2K/Cpaig/8gjne0F7t3uE" +
"7Kx3eLM914A2FhGWYGKiI1Q3KXJ5c7cKJoIzI/cUsXacgnPORjhmtJb2tXzWaRui" +
Expand Down
9 changes: 4 additions & 5 deletions src/main/java/com/wustrive/aesrsa/util/AES.java
Original file line number Diff line number Diff line change
@@ -1,14 +1,13 @@
package com.wustrive.aesrsa.util;

import java.io.UnsupportedEncodingException;
import java.security.Key;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;

import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import java.io.UnsupportedEncodingException;
import java.security.Key;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;

/**
* Description:
Expand Down
132 changes: 132 additions & 0 deletions src/main/java/com/wustrive/aesrsa/util/AESRSAUtils.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,132 @@
package com.wustrive.aesrsa.util;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import okhttp3.FormBody;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.net.URL;
import java.util.*;

public class AESRSAUtils {
// private static String serverPublicKey=null;
private static String clientPublicKey=null;
private static String clientPrivateKey=null;
private static OkHttpConfig okHttpConfig;
private static Map<String,String> serverPublicKeys;

static{
Properties properties = new Properties();
try {
properties.load(AESRSAUtils.class.getClassLoader().getResourceAsStream("RSAKeys.properties"));
} catch (IOException e) {
e.printStackTrace();
}
serverPublicKeys=new HashMap<String,String>();
if(properties.getProperty("serverHosts")!=null && !properties.getProperty("serverHosts").isEmpty()){
String[] serverHosts=properties.getProperty("serverHosts").split(" ");
for(int hostIndex=0;hostIndex<serverHosts.length;hostIndex++){
serverPublicKeys.put(serverHosts[hostIndex],properties.getProperty("serverPublicKey."+ (hostIndex+1)));
}
}
// String[] serverHosts=properties.getProperty("serverHosts").split(" ");
// for(int hostIndex=0;hostIndex<serverHosts.length;hostIndex++){
// serverPublicKeys.put(serverHosts[hostIndex],properties.getProperty("serverPublicKey."+ (hostIndex+1)));
// }
// serverPublicKeys.put("csfz.cn",properties.getProperty("serverPublicKey"));
// serverPublicKey=properties.getProperty("serverPublicKey");
clientPrivateKey=properties.getProperty("privateKey");
clientPublicKey=properties.getProperty("publicKey");
if(clientPublicKey==null || clientPrivateKey==null){
try {
Map<String, String> map= RSA.generateKeyPair();
clientPrivateKey = map.get("privateKey");
clientPublicKey = map.get("publicKey");
} catch (Exception e) {
e.printStackTrace();
}
}
okHttpConfig=new OkHttpConfig();
}

public static <T> String sendMessage(String url,T t) throws Exception{
String json = GsonUtils.getJsonByObject(t);
TreeMap<String, Object> params = new TreeMap<String, Object>();
params.put("data",json);
params.put("publicKey",clientPublicKey);
String sign = EncryUtil.handleRSA(params,clientPrivateKey);
params.put("sign",sign);

String info= JSON.toJSONString(params);
String aesKey = SecureRandomUtil.getRandom(16);
String data = AES.encryptToBase64(ConvertUtils.stringToHexString(info),aesKey);

String encryptkey = RSA.encrypt(aesKey,serverPublicKeys.get(new URL(url).getHost()));

FormBody formBody=new FormBody.Builder().add("data",data).build();
Request request=new Request.Builder().url(url).addHeader("aesKey",encryptkey).post(formBody).build();

String returnData="";
OkHttpClient okHttpClient=okHttpConfig.okHttpClient();
Response response = okHttpClient.newCall(request).execute();
return response.body().string();
}


public static <T> T decryptMessage(String ciphertext,String encryptkey,String host,Class<T> clz) throws Exception{
String serverPublicKey = serverPublicKeys.get(host);
if(serverPublicKey == null){
String tmpAESKey=RSA.decrypt(encryptkey,clientPrivateKey);
String tmpInfo=ConvertUtils.hexStringToString(AES.decryptFromBase64(ciphertext,tmpAESKey));
JSONObject tmpJSONObject= JSON.parseObject(tmpInfo);
serverPublicKey = tmpJSONObject.getString("publicKey");
}
boolean passSign = EncryUtil.checkDecryptAndSign(ciphertext,encryptkey,serverPublicKey,clientPrivateKey);
if(passSign){
String aesKey = RSA.decrypt(encryptkey,clientPrivateKey);
String data = ConvertUtils.hexStringToString(AES.decryptFromBase64(ciphertext,aesKey));

JSONObject jsonObject = JSONObject.parseObject(data);
String json = jsonObject.getString("data");
// storeProperties();
return GsonUtils.getObjectByJson(json,clz);
}else {
serverPublicKeys.put(host,null);
}



return null;
}

private static void storeProperties(){
Properties properties = new Properties();
properties.setProperty("privateKey",clientPrivateKey);
properties.setProperty("publicKey",clientPublicKey);
String serverHosts="";
int hostIndex=0;
for(Map.Entry<String,String> entry:serverPublicKeys.entrySet()){
if(entry.getValue() != null){
serverHosts += entry.getKey()+" ";
properties.setProperty("serverPublicKey."+(++hostIndex),entry.getValue());
}
}
properties.setProperty("serverHosts",serverHosts);

FileOutputStream fileOutputStream = null;
try {
fileOutputStream = new FileOutputStream(AESRSAUtils.class.getClassLoader().getResource("RSAKeys.properties").getPath());
properties.store(fileOutputStream,new Date().toString());
fileOutputStream.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
2 changes: 1 addition & 1 deletion src/main/java/com/wustrive/aesrsa/util/Base64.java
Original file line number Diff line number Diff line change
Expand Up @@ -464,7 +464,7 @@ public static String decode(String cryptoStr) throws
String result = tempStr.substring(40, tempStr.length());
return new String(decode(result.getBytes("UTF-8")));
}
catch(java.lang.ArrayIndexOutOfBoundsException ex)
catch(ArrayIndexOutOfBoundsException ex)
{
return "";
}
Expand Down
2 changes: 1 addition & 1 deletion src/main/java/com/wustrive/aesrsa/util/ConvertUtils.java
Original file line number Diff line number Diff line change
Expand Up @@ -322,7 +322,7 @@ public static Object getObject(String type,String value) throws Exception{
else{
Object objs[]=new String[]{value};
return Class.forName(type).getConstructor(new Class[] {
java.lang.String.class
String.class
}).newInstance(objs);
}
}
Expand Down
4 changes: 2 additions & 2 deletions src/main/java/com/wustrive/aesrsa/util/Digest.java
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
package com.wustrive.aesrsa.util;

import org.apache.log4j.Logger;

import java.io.UnsupportedEncodingException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Arrays;

import org.apache.log4j.Logger;

public class Digest {
private static final Logger log = Logger.getLogger(Digest.class);
public static final String ENCODE = "UTF-8";
Expand Down
22 changes: 10 additions & 12 deletions src/main/java/com/wustrive/aesrsa/util/EncryUtil.java
Original file line number Diff line number Diff line change
@@ -1,15 +1,13 @@
package com.wustrive.aesrsa.util;

import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;
import java.util.TreeMap;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.TypeReference;
import org.apache.commons.lang.StringUtils;
import org.apache.log4j.Logger;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.TypeReference;
import java.util.Iterator;
import java.util.Map.Entry;
import java.util.TreeMap;

public class EncryUtil {
private static final Logger log = Logger.getLogger(EncryUtil.class);
Expand All @@ -19,7 +17,7 @@ public class EncryUtil {
public static String handleRSA(TreeMap<String, Object> map,
String privateKey) {
StringBuffer sbuffer = new StringBuffer();
for (Map.Entry<String, Object> entry : map.entrySet()) {
for (Entry<String, Object> entry : map.entrySet()) {
sbuffer.append(entry.getValue());
}
String signTemp = sbuffer.toString();
Expand All @@ -33,7 +31,7 @@ public static String handleRSA(TreeMap<String, Object> map,

/**
* 返回的结果进行验签
*
*
* @param data
* 业务数据密文
* @param encrypt_key
Expand Down Expand Up @@ -61,7 +59,7 @@ public static boolean checkDecryptAndSign(String data, String encrypt_key,

/** 2.用aeskey解开data。取得data明文 */
String realData = ConvertUtils.hexStringToString(AES.decryptFromBase64(data, AESKey));

TreeMap<String, String> map = JSON.parseObject(realData,
new TypeReference<TreeMap<String, String>>() {});

Expand All @@ -80,7 +78,7 @@ public static boolean checkDecryptAndSign(String data, String encrypt_key,
}
signData.append(entry.getValue() == null ? "" : entry.getValue());
}

/** 5. result为true时表明验签通过 */
boolean result = RSA.checkSign(signData.toString(), sign,
clientPublicKey);
Expand All @@ -93,7 +91,7 @@ public static boolean checkDecryptAndSign(String data, String encrypt_key,
*/
public static String handleHmac(TreeMap<String, String> map, String hmacKey) {
StringBuffer sbuffer = new StringBuffer();
for (Map.Entry<String, String> entry : map.entrySet()) {
for (Entry<String, String> entry : map.entrySet()) {
sbuffer.append(entry.getValue());
}
String hmacTemp = sbuffer.toString();
Expand Down
22 changes: 22 additions & 0 deletions src/main/java/com/wustrive/aesrsa/util/GsonUtils.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
package com.wustrive.aesrsa.util;

import com.google.gson.Gson;

public class GsonUtils {
private static Gson gson=null;

private static Gson getGson(){
if(gson==null){
gson = new Gson();
}
return gson;
}

public static <T> T getObjectByJson(String json,Class<T> clz){
return getGson().fromJson(json,clz);
}

public static <T> String getJsonByObject(T t){
return getGson().toJson(t);
}
}
Loading