Java实现简单异或加密
零、需求
在做一个简单的Web项目,需要把账号密码以Cookie的形式存储到浏览器中记住,不能直接明文,故需要一种简单的加密方式,想到了异或加密。
壹、实现
/**
* 异或操作
* @param rawData 要异或的字节数组
* @param number 运算数
* @return 异或运算后的字节数组
*/
public static byte[] Xor(byte[] rawData, int number) {
byte[] encodeData = new byte[rawData.length];
for (int i = 0; i < rawData.length; i++) //遍历字符数组
{
encodeData[i] = (byte) (rawData[i] ^ number); //对每个数组元素进行异或运算
}
return encodeData;
}
/**
* 异或加密
* @param rawStr 原文
* @param key 密钥
* @return 密文
*/
public static String EncodeByXor(String rawStr, String key) {
// 通过字符串拿到密钥
int number = 1;
for (int i = 0; i < key.length(); i++) {
number *= key.charAt(i);
}
// 转成字节数组
byte[] rawData = rawStr.getBytes(StandardCharsets.UTF_8);
byte[] encodeData = Xor(rawData, number);
// 把字节数组转成某种格式的字符串,方便传输(格式可以自定义,好解析就行)
StringBuilder encodeStr = new StringBuilder();
for (byte b : encodeData) {
encodeStr.append(b).append("x");
}
return encodeStr.toString();
}
/**
* 异或解密
* @param encodeStr 密文
* @param key 密钥
* @return 原文
*/
public static String DecodeByXor(String encodeStr, String key) {
// 通过字符串拿到密钥
int number = 1;
for (int i = 0; i < key.length(); i++) {
number *= key.charAt(i);
}
// 解析EncodeByXor方法中的字节数组格式,找到加密后的字节数组
String[] strings = encodeStr.substring(0,encodeStr.length()-1).split("x");
byte[] rawData = new byte[strings.length];
for (int i = 0; i < strings.length; i++) {
rawData[i] = Byte.parseByte(strings[i]);
}
// 异或一下
byte[] encodeData = Xor(rawData, number);
// 重新编码成原始字符串
return new String(encodeData,StandardCharsets.UTF_8);
}
/**
* 测试
* @param args
*/
public static void main(String[] args) {
String enStr = EncodeByXor("异或加密如果同时知道原文和密文,则对比原文和密文可以推算出密钥,因此异或加密安全性较低,一般只用于简单的加密。","这个是一个秘钥");
System.out.println("加密后:");
System.out.println(enStr);
String deStr = DecodeByXor(enStr,"这个是一个秘钥");
System.out.println("解密后:");
System.out.println(deStr);
}
测试结果:
加密后:
-27x-68x-126x-26x-120x-106x-27x-118x-96x-27x-81x-122x-27x-90x-126x-26x-98x-100x-27x-112x-116x-26x-105x-74x-25x-97x-91x-23x-127x-109x-27x-114x-97x-26x-106x-121x-27x-110x-116x-27x-81x-122x-26x-106x-121x-17x-68x-116x-27x-120x-103x-27x-81x-71x-26x-81x-108x-27x-114x-97x-26x-106x-121x-27x-110x-116x-27x-81x-122x-26x-106x-121x-27x-113x-81x-28x-69x-91x-26x-114x-88x-25x-82x-105x-27x-121x-70x-27x-81x-122x-23x-110x-91x-17x-68x-116x-27x-101x-96x-26x-83x-92x-27x-68x-126x-26x-120x-106x-27x-118x-96x-27x-81x-122x-27x-82x-119x-27x-123x-88x-26x-128x-89x-24x-66x-125x-28x-67x-114x-17x-68x-116x-28x-72x-128x-24x-120x-84x-27x-113x-86x-25x-108x-88x-28x-70x-114x-25x-82x-128x-27x-115x-107x-25x-102x-124x-27x-118x-96x-27x-81x-122x-29x-128x-126x
解密后:
异或加密如果同时知道原文和密文,则对比原文和密文可以推算出密钥,因此异或加密安全性较低,一般只用于简单的加密。
贰、总结
异或加密如果同时知道原文和密文,则对比原文和密文可以推算出密钥,因此异或加密安全性较低,一般只用于简单的加密。