1. 程式人生 > >java程式碼實現加密解密(MD5簽名(同步介面))

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個字元的十六進位制字串

33216進位制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