JAVA网络信息传输加密算法

为什么要进行网络加密?

请看:如何使用加密保证网络交互的绝对安全性?

下面来说一下我的实现思想:

加密:

1、一个假数据长度n+n个随机字符串+真实数据的字节流+真实数据MD5加密后的串+长度位m第二个假数据+第二个家数据的长度m

2、上述数据在进行跟字母t的按位异或 

实例:

816249737104114120b06f10347bdd0fcbb2cf86e1a45eff005509895199

按位异或

LEBF@MCGCED@EE@EFDDBEDG@CDFLBE@ADDAADMLMAEMM

解密:

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);
	}
}

猜你喜欢

转载自blog.csdn.net/qq_39429962/article/details/84106664
今日推荐