2015-11-04 188 views
1

這樣做的目的不是高度安全相關,關鍵將會很長,所以我只是想對字符串使用簡單的XOR加密。是只需在JavaScript中進行XOR加密並在Java中進行解密

好了,客戶端的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解密。 在任何情況下,它似乎都不可靠。

我認爲這個問題必須與編碼有關...有人知道一個更可靠的解決方案嗎?

巨大的感謝提前! :)

+0

您能否提供樣本輸入和兩種實現中的不同輸出? – RealSkeptic

+0

嘗試使用Base64編碼您的加密輸出,然後使用Java對其進行解碼 –

回答

1

對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字符的解決方案(例如€)你將不得不改變代碼來照顧這一點。

相關問題