JAVA網路資訊傳輸加密演算法
阿新 • • 發佈:2018-12-21
為什麼要進行網路加密?
下面來說一下我的實現思想:
加密:
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); } }