java代码进行加密处理
需要传入的参数:一个指定的数据,还有key值,用于加密操作,key值客户端和接口应事先商量好,首先将得到的数据和key转化为指定编码格式的字节数组,然后结合进行加密操作,解密操作需要通过正则表达式将数据重新加入到list中去,然后再将list和key值转化为指定格式编码的字节数组,进行加密算法的逆向操作,代码如下
package com.lvluo.interf.util;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* 数据加密解密处理
* @author Administrator
*
*/
public class QuickSDKDesUtil {
//正则表达式,用于匹配
private final static Pattern pattern = Pattern.compile("\\d+");
private final static String charset="utf-8";
//加密处理
public static String encode(String src,String key) {
try {
//得到一个指定的编码格式的字节数组,Linux和windows默认的编码格式不同,所以要指定特定的编码
byte[] data = src.getBytes(charset);
byte[] keys = key.getBytes();
StringBuilder sb = new StringBuilder();
for (int i = 0; i < data.length; i++) {
//结合key和相应的数据进行加密操作,ofxx的作用是补码,byte是8bits,而int是32bits
int n = (0xff & data[i]) + (0xff & keys[i % keys.length]);
sb.append("@" + n);
}
return sb.toString();
}catch (UnsupportedEncodingException e){
e.printStackTrace();
}
return src;
}
//解密处理
public static String decode(String src,String key) {
if(src == null || src.length() == 0){
return src;
}
//正则表达式字符串匹配
Matcher m = pattern.matcher(src);
List<Integer> list = new ArrayList<Integer>();
//find方法(部分匹配):尝试去发现输入串中是否匹配相应的子串
while (m.find()) {
try {
//返回匹配到的子字符串
String group = m.group();
list.add(Integer.valueOf(group));
} catch (Exception e) {
e.printStackTrace();
return src;
}
}
//如果有匹配的字符串
if (list.size() > 0) {
try {
byte[] data = new byte[list.size()];
byte[] keys = key.getBytes();
//相对于加密过程的解密过程
for (int i = 0; i < data.length; i++) {
data[i] = (byte) (list.get(i) - (0xff & keys[i % keys.length]));
}
return new String(data, charset);
} catch (UnsupportedEncodingException e){
e.printStackTrace();
}
return src;
} else {
return src;
}
}
}
md5签名操作
1签名的字段是sign
2参数进行加密处理后,结合sign验证参数的正确性
算法描述
1将所需的数据进行加密处理然后传入相应的签名方法
2将数据最终转为32个字符的十六进制字符串
3 将32位16进制MD5字符串值转换为Byte字节数组,{1,13},{5,17},{7,23}位置进行对换
4最后将第(3)步中对换后的字节数组转为字符串,即为签名字串
package com.lvluo.interf.util;
import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.apache.commons.codec.digest.DigestUtils;
import org.apache.commons.lang.StringUtils;
public class QuickSDKSignUtil {
static final String encode="UTF-8";
//对传递的数据进行md5加密
public static String sign(String signStr){
//DigestUtils.md5Hex()方法Java调用Apache commons codec实现md5加密,计算MD5摘要并返回值为32个字符的十六进制字符串
return shuffleSign(DigestUtils.md5Hex(signStr));
}
private static byte[][] shufflePos=new byte[][]{{1,13},{5,17},{7,23}};
private static String shuffleSign(String src){
if(src == null || src.length() == 0){
return src;
}
try {
//得到一个指定的编码格式的字节数组
byte[] bytes=src.getBytes("utf-8");
byte temp;
//循环遍历shufflePos,将二维数组中每位一维数组中的每个元素进行换位
for(int i=0; i<shufflePos.length; i++){
temp=bytes[shufflePos[i][0]];
bytes[shufflePos[i][0]]=bytes[shufflePos[i][1]];
bytes[shufflePos[i][1]]=temp;
}
return new String(bytes);
} catch (UnsupportedEncodingException e) {
return src;
}
}
}
加密解密和签名认证的代码如上,最后在写一个demo对上面方法进行调用
package com.lvluo.interf.util;
import javax.servlet.http.HttpServletRequest;
/**
* 加密解密
* @author Administrator
*
*/
public class Demo {
/**
* @param args
*/
public static void main(String[] args) {
//双方约定好的签名
final String key ="asd";
//数据
final String data ="{a:21}";
//对数据和签名进行加密处理
String nt_data = QuickSDKDesUtil.encode(data, key);
System.out.println("加密为:"+nt_data);
//对加密后的数据进行md5处理
System.out.println("对数据进行md5加密后在进行加密"+QuickSDKSignUtil.sign("nt_data=" + nt_data));
//对进过md5处理后的数据进行签名后加密
String nt_data2 = QuickSDKDesUtil.encode(QuickSDKSignUtil.sign("nt_data=" + nt_data), key);
System.out.println(nt_data2);
//对加密后的数据进行解密处理
String sign_en = QuickSDKDesUtil.decode(nt_data2, key);
System.out.println(sign_en);
}
}
输出的结果为
加密为:@[email protected]@[email protected]@[email protected]
对数据进行签名操作:b5aed7a6e55dea4dedd9e92f25ad290d
对数据签名后进行加密操作:@[email protected]@[email protected]@[email protected]@[email protected]@[email protected]@[email protected]@[email protected]@[email protected]@[email protected]@[email protected]@[email protected]@[email protected]@[email protected]@[email protected]@[email protected]@[email protected]
对数据进行解密操作:b5aed7a6e55dea4dedd9e92f25ad290d