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將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