只需使用Javascript进行XOR加密并使用Java进行解密

Dra*_*mer 5 javascript java encryption xor

这样做的目的与安全性不是很相关,并且密钥很长,所以我只想对字符串使用简单的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);
}
Run Code Online (Sandbox Code Playgroud)

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());
}
Run Code Online (Sandbox Code Playgroud)

不幸的是,这产生了一些非常奇怪的结果。在JS中加密后,通过POST发送结果并在Java中解密后,某些字母有所不同。在每种情况下,它似乎都不可靠。

我认为问题一定与编码有关...有人知道对此有更可靠的解决方案吗?

提前非常感谢!:)

kai*_*rda 5

对两个字符串进行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;
}
Run Code Online (Sandbox Code Playgroud)

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();
};
Run Code Online (Sandbox Code Playgroud)

示例:用JavaScript编码:

encryptStringWithXORtoHex('Encrypt This','SecretKey');

返回字符串 160b00001c043f452d3b0c10

用Java解密:

decryptStringWithXORFromHex("160b00001c043f452d3b0c10","SecretKey")

退货 Encrypt This

请注意:所示解决方案仅适用于charChode值小于或等于255的字符。如果要将解决方案用于unicode字符(例如€),则必须更改代码以解决此问题。