关于异或加密的二次加密

今天同事写了个中文的异或的加密算法,但是这个加密比较夸张的缺点是再次加密会返还成原来得数据,所以晚上想了个再进行一个逻辑位移操作

 

该方法可以对一个加密后的数据中的第0到第10位进行一次逻辑位移,逻辑位移的长度为11 & index 保证不会超过11

@Test
public void jiamiTest(){
String string = "张易方张易方张易方张易方张易方张易方"; //假设第一次异或加密后为张易方

Integer length = 11 ; //前十一位置需要移动
char en = (char)2047; // 0000011111111111

// 加密
char[] chars = string.toCharArray();
char[] newChars = new char[chars.length];
for (int i=0;i<chars.length;i++) {
char input = chars[i];
// input < '\uD080' || input > '\uDFFF' 保留11-15位置,0-10位置需要修改
Integer moveLength = (7 & i) + 1 ; // 位移长度
char flag = (char)(input >> length << length) ; //高位保持不懂
char enFlag = (char)(en & input); //取0-10位置的低位
newChars[i] =(char)(flag | (enFlag << moveLength & en) | (enFlag >>(length-moveLength)));
}
System.out.println(newChars); //幁恏旍娎扸晭塲揂捳岃悞掛尜擰擛壤搧曦

//解密 从newChars 解密到newInput
char[] newInput = new char[newChars.length];
for (int i=0;i<newChars.length;i++){
char input = newChars[i];

Integer moveLength = (7 & i) + 1;
char flag = (char)(input >> length << length) ; //高位保持不懂
char enFlag = (char)(en & input); //取0-10位置的低位
newInput[i] =(char)(flag | (enFlag << (length-moveLength) & en) | (enFlag >>moveLength));
}
System.out.println(newInput); //张易方张易方张易方张易方张易方张易方
}

  

posted @ 2020-12-16 00:06  猪是得念来过倒  阅读(507)  评论(0编辑  收藏  举报