加密解密

孤寒rm-rf*發表於2020-12-09

資料加密處理:

package MD5;

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;  
        }  
    }  
}  
資料解密處理

 

package MD5;

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;
        }
    }
    
}
資料解密處理

 

package MD5;


/** 
 * 加密解密 
 * @author Administrator 
 * 
 */  
public class Demo {  
  
    /** 
     * @param args 
     */  
    public static void main(String[] args) {  
        //雙方約定好的簽名  
        final String key ="1";  
        //資料  
        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);   
        
        System.out.println("-------------------------------");    
         
        
        //對加密後的資料進行md5處理  
        //對進過md5處理後的資料進行簽名後加密 
        nt_data = "1";
        
       nt_data2 = QuickSDKDesUtil.encode(nt_data,"fds");  
        System.out.println(nt_data2);  
        
        //對加密後的資料進行解密處理  
        sign_en = QuickSDKDesUtil.decode(nt_data2, "fds");  
        System.out.println(sign_en);
        
        
          
    }  
  
}  
寫一個demo

 

相關文章