[英]Simply XOR encrypt in Javascript and Decrypt in Java
这样做的目的不是高度安全性,密钥很长,所以我只想对字符串使用简单的XOR加密。
那么,客户端上的Javascript如下:
function dc_encrypt(str, key)
{
var ord = []; var res = "";
var i;
for (i = 1; i <= 255; i++) {ord[String.fromCharCode(i)] = i}
for (i = 0; i < str.length; i++)
res += String.fromCharCode(ord[str.substr(i, 1)] ^ ord[key.substr(i % key.length, 1)]);
return(res);
}
而Java是:
public String dc_decrypt(String str, String key)
{
StringBuilder sb = new StringBuilder();
for(int i = 0; i < str.length(); i++)
sb.append((char)(str.charAt(i) ^ key.charAt(i % (key.length()))));
return(sb.toString());
}
不幸的是,这产生了一些非常奇怪的结果 在JS中加密后,一些字母不同,通过POST发送结果并在Java中解密。 在每种情况下,它似乎都不可靠。
我认为问题必须与编码有关...有人知道更可靠的解决方案吗?
非常感谢提前! :)
对两个字符串进行XOR编码时,单个字符的结果XOR值有时不会产生可以显示的字符。 因此,一种解决方案是将结果编码为十六进制值序列,然后在服务器端解码这些十六进制值。
使用Javascript:
function encryptStringWithXORtoHex(input,key) {
var c = '';
while (key.length < input.length) {
key += key;
}
for(var i=0; i<input.length; i++) {
var value1 = input[i].charCodeAt(0);
var value2 = key[i].charCodeAt(0);
var xorValue = value1 ^ value2;
var xorValueAsHexString = xorValue.toString("16");
if (xorValueAsHexString.length < 2) {
xorValueAsHexString = "0" + xorValueAsHexString;
}
c += xorValueAsHexString;
}
return c;
}
Java的代码:
private static String decryptStringWithXORFromHex(String input,String key) {
StringBuilder c = new StringBuilder();
while (key.length() < input.length()/2) {
key += key;
}
for (int i=0;i<input.length();i+=2) {
String hexValueString = input.substring(i, i+2);
int value1 = Integer.parseInt(hexValueString, 16);
int value2 = key.charAt(i/2);
int xorValue = value1 ^ value2;
c.append(Character.toString((char) xorValue));
}
return c.toString();
};
示例:在Javascript中编码:
encryptStringWithXORtoHex('Encrypt This','SecretKey');
返回字符串160b00001c043f452d3b0c10
用Java解密:
decryptStringWithXORFromHex("160b00001c043f452d3b0c10","SecretKey")
返回Encrypt This
请注意:显示的解决方案仅适用于charChode值小于或等于255的字符。如果要将解决方案用于unicode字符(例如€),则必须更改代码才能处理此问题。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.