java代码实现加密解密(MD5签名(同步接口))

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  3216进制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

点赞