核心就是异或运算
异或运算详解
异或运算是二进制数按位做异或运算再赋值,其运算规则是: 0^0=0; 0^1=1; 1^0=1; 1^1=0 即:如果两个相应位为“异”(值不同),则该位结果为1,否则为0。 同与运算相同,参与异或运算的两个操作数,位数必须相同,也就是数据类型必须相同。不同类型的数据做与运算,需要强制转换为同一类型。 例如:数据类型同为int的数值8和14异或运算的结果是6,下图给出了异或运算过程,int类型的数据是16位,因为高8位都是0,因此下图只列出了低8位的运算过程: 从下图结果可以看出,两个数值做异或运算,相同位不同时结果为1,其它都为0。 |
代码实现(java版,因为鄙人只会一点java,嘿嘿)
package com.wlc.encrypt.utils;
import java.util.Base64;
/**
* 描述: 对称加密 </br>
* 时间: 2022-01-09 12:44 </br>
* 作者:王林冲
*/
public class WlcAes {
public static void main(String[] args) {
String content = "{\"name\":\"老王\",\"age\":18}"; //需要加密的字符
String key = "你的密钥"; //密钥
String encryptStr = encrypt(content, key);
System.out.println(encryptStr);
String decryptStr = decrypt(encryptStr, key);
System.out.println(decryptStr);
}
/**
* 加密
* @param content 明文文本
* @param key 密钥
* @return String - 密文文本
*/
public static String encrypt (String content, String key){
char[] chars = content.toCharArray();
cryptCore(chars, key);
return new String(Base64.getEncoder().encode(new String(chars).getBytes()));
}
/**
* 解秘
* @param content 密文文本
* @param key 密钥
* @return String - 明文文本
*/
public static String decrypt (String content, String key){
//Base64解码
byte[] result = Base64.getDecoder().decode(content);
char[] chars = new String(result).toCharArray();
cryptCore(chars,key);
return new String(chars);
}
/**
* 加密解密处理核心-异或运算
* @param chars 处理 char[]
* @param key 密钥
* @return char[]处理后的char数组
*/
private static char[] cryptCore(char[] chars, String key){
byte[] keyBytes = key.getBytes();
//异或运算值
byte bitwise = 0;
//采用密钥的ASCII编码进行异或运算获取最终bitwise
for(byte b : keyBytes){
bitwise ^= b;
}
//对chars数组进行异或运算,获取运算前或者后的结果chars
for(int i=0; i<chars.length; i++){
chars[i] = (char)(chars[i] ^ bitwise) ;
}
return chars;
}
}