1. 程式人生 > >JAVA網路資訊傳輸加密演算法

JAVA網路資訊傳輸加密演算法

為什麼要進行網路加密?

下面來說一下我的實現思想:

加密:

1、一個假資料長度n+n個隨機字串+真實資料的位元組流+真實資料MD5加密後的串+長度位m第二個假資料+第二個家資料的長度m

2、上述資料在進行跟字母t的按位異或 

例項:

816249737104114120b06f10347bdd0fcbb2cf86e1a45eff005509895199

按位異或

[email protected]@[email protected]@[email protected]

解密:

1、按位異或(t)轉為原來的串

816249737104114120b06f10347bdd0fcbb2cf86e1a45eff005509895199

2、按照上邊的 “第一個假資料長度n+n個隨機字串+真實資料的位元組流+真實資料MD5加密後的串+長度位m第二個假資料+第二個家資料的長度m”進行拆分加密比較。

實現程式碼:

package com.util;

import java.io.UnsupportedEncodingException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

/**
 * 
 * @ClassName: MD5Util 
 * @Description: TODO
 * @author: HRX
 * @date: 2018年11月15日 下午3:52:45
 */
public class MD5Util {
	//還可以用這種對應的鑰匙進一步加密,我這沒有用到
	private static char[][] keys = {{'a','c'},{'w','f'},{'z','x'},{'r','t'},{'p','g'},{'q','h'},{'r','x'}};
	
	//字串通過MD5轉換為32位串
	public String convertToMd5(String str) throws NoSuchAlgorithmException, UnsupportedEncodingException{
		//宣告MD5類並例項化
		MessageDigest md5 = MessageDigest.getInstance("md5");
		//將字串以UTF-8的格式轉為位元組陣列
		byte[] b = str.getBytes("UTF-8");
		//將字元數字進行MD5轉換
		md5.update(b);
		//獲取轉換完成後的位元組陣列
		byte[] result = md5.digest();
		StringBuffer buffer = new StringBuffer();
		for(byte aa : result){
			//只要二進位制的後八位
			int val = ((int)aa) & 0xff;
			//維數不滿組八位有效,一個位元組佔八個二進位制位
			if (val < 16) {
				buffer.append("0");
			}
			//忽視符號位轉化為字串
			buffer.append(Integer.toHexString(val));
		}
		return buffer.toString();
	}
	
	//解密得到md5加密前的串
	public String getUniqueKey(String str){
		int begin = (str.charAt(0) - '0' )+1;
		int end = str.length() - (str.charAt(str.length()-1) - '0') - 33;
		String key = str.substring(begin, end);
		return key;
	}
	
	//將解密後的字串進行查分獲取到加密的md5串
	public String getMD5Key(String str){
		int n = str.charAt(str.length()-1) - '0' -1;
		String key = str.substring(str.length() - n - 34,str.length() - n - 2);
		return key;
	}
	
	//根據從傳來的串進行解密和比對
	public boolean getFlag(String str) throws NoSuchAlgorithmException, UnsupportedEncodingException{
		if(judgeNull(str)){
			str = changeString(str);
			//提取資訊
			String message = getUniqueKey(str);
			message = new String(message);
			//將資訊轉化為md5
			String messageToMD5 = "";
			if(judgeNull(message))
				messageToMD5 = convertToMd5(message);
			//獲取比對字串
			String key = getMD5Key(str);
			if(judgeNull(messageToMD5) && judgeNull(key) &&messageToMD5.equals(key))
				return true;
		}
		return false;
		
	}
	//判斷字串是否為空
	private boolean judgeNull(String str){
		if(str == null || str == "")
			return false;
		return true;
	}
	//將生成的key整體與t進行異或,二次加密
	public String changeString(String key){
		char[] params = key.toCharArray();
		for (int i = 0; i < params.length; i++){  
			params[i] = (char) (params[i] ^ 't');  
        }  
        String result = new String(params);  
		return result;
	}
	
	/**
	 * 
	* @Title: makeString 
	* @Description: TODO 生成帶解密的字串
	* @param str
	* @param m	//填充假資料的第一個長度
	* @param n	//填充假資料的第二個
	* @return
	* @throws NoSuchAlgorithmException
	* @throws UnsupportedEncodingException String
	* @author HRX
	* @date 2018年11月15日下午4:00:41
	 */
	public String makeString(String str,int n ,int m) throws NoSuchAlgorithmException, UnsupportedEncodingException{
		StringBuffer temp = new StringBuffer();
		StringBuffer key = new StringBuffer();
		for(byte b : str.getBytes())
			temp.append(b);
		key.append(n);
		key.append(String.valueOf((int)(Math.random()*Math.pow(10, n))));
		key.append(temp);
		key.append(convertToMd5(temp.toString()));
		key.append(String.valueOf((int)(Math.random()*Math.pow(10, m))));
		key.append(m);
		System.out.println(key.toString());
		return changeString(key.toString());
	}
	public static void main(String[] args) throws NoSuchAlgorithmException, UnsupportedEncodingException {
		MD5Util md5 = new MD5Util();
		//生成一個加密後的串用於測試
		String str = md5.makeString("hrx",8,9);
		System.out.println(str);
		//進行解密額
		boolean flag = md5.getFlag(str);
		System.out.println(flag);
	}
}