为什么要进行网络加密?
下面来说一下我的实现思想:
加密:
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);
}
}