2012-09-27 31 views
0

我想用php「加密」一個字符串(js代碼),然後使用javascript對其進行解碼。字符串異或加密失敗,一些密鑰

這是PHP函數:

function xor_string($text, $xorKey) { 
    $xored = ''; 
    $chars = str_split($text); 

    $i = 0; 

    while ($i < count($chars)) { 
     $xored .= chr(ord($chars[$i])^$xorKey); 
     $i++; 
    } 

    return $xored; 
} 

這是js函數:

function xor_string(str, key) { 
    var xored = ""; 
    for (i=0; i<str.length;i++) { 
     var a = str.charCodeAt(i); 
     var b = a^key; 
     xored = xored+String.fromCharCode(b); 
    } 
    console.log(xored); 
} 

這項工作的方式有一定的密鑰,但與其他兩種方式是失敗的,例如:

echo urlencode(xor_string('document.location.href.search', 67)); 

返回:

%27%2C+6.%26-7m%2F%2C+%227%2A%2C-m%2B1%26%25m0%26%221+%2B 

當我嘗試使用JavaScript的 「解碼」 它使用:

var str = decodeURIComponent("%27%2C+6.%26-7m%2F%2C+%227%2A%2C-m%2B1%26%25m0%26%221+%2B"); 
xor_string(str, 67); 

它返回:

dohument.lohation.href.searhh 

任何人都知道爲什麼發生這種情況?

隨着一些「鑰匙」,如120和其他人可以正常工作,但與許多其他人失敗。

+0

你確定數據之前和之後的URL編碼/解碼是一樣的嗎? – Joe

+0

它看起來像js urldecode留空格爲「+」,而php urldecode只在加號「+」和空格爲空格的地方留下「+」號。例如,php'urldecode('1 +%2B + 2');'返回'1 + 2',但js'decodeURIComponent('1 +%2B + 2');'返回'1 +++ 2'。任何方式來解決這個問題? –

+1

這樣加密Javascript代碼有什麼意義?這不會讓它更難複製。 –

回答

4

經典:-)

PHP的urlencode不完全一樣,JavaScript的encodeURIComonent:他們處理不同的空白;一個使用+,另一個使用%20

您需要處理該問題,例如phpjs offers a PHP-compliant decodeURI function

> var phpstring = "%27%2C+6.%26-7m%2F%2C+%227%2A%2C-m%2B1%26%25m0%26%221+%2B"; 
> xor_string(decodeURIComponent(phpstring.replace(/\+/g, "%20")), 67); 
"document.location.href.search" 

正如你可能會注意到,這個錯誤命中只有被編碼到空間與xor功能(及其參數)的字符。

+0

它會影響除空間以外的其他角色嗎?到目前爲止,我只注意到這個空間的問題。 –

+0

不是我聽說過的,沒有。 – Bergi

1

更好的解決方案是使用rawurlencode()而不是urleconde()

rawurlencode()會將空格轉換爲'%20',但urlencode()會將空格轉換爲'+'。 '%20'是decodeURIComponent()預期的空間。

請參見下面的完整的例子:

<?php 
    function xor_string($text, $xorKey) { 
    $xored = ''; 
    $chars = str_split($text); 
    $i = 0; 
    while ($i < count($chars)) { 
     $xored .= chr(ord($chars[$i])^$xorKey); 
     $i++; 
    } 
    return $xored; 
    } 
?><html> 
<body> 
Encoded (php): 
<div id="phpUrlEncode"> 
<?=urlencode(xor_string('document.location.href.search', 67))?> 
</div> 
<div id="phpRawUrlEncode"> 
<?=rawurlencode(xor_string('document.location.href.search', 67))?> 
</div> 
<br /> 
Decoded (js): 
<div id="jsDecodeUrl"></div> 
<div id="jsDecodeRawUrl"></div> 
<script type="text/javascript"> 
function decodeStr(rawId,displayId) { 
    var raw = document.getElementById(rawId).innerHTML; 
    document.getElementById(displayId).innerHTML = xor_string(decodeURIComponent(raw),67); 
} 

function xor_string(str, key) { 
    var xored = ""; 
    for (i=0; i<str.length;i++) { 
     var a = str.charCodeAt(i); 
     var b = a^key; 
     xored = xored+String.fromCharCode(b); 
    } 
    //console.log(xored); 
    return xored; 
} 

decodeStr('phpUrlEncode','jsDecodeUrl'); 
decodeStr('phpRawUrlEncode','jsDecodeRawUrl'); 
</script> 
</body> 
</html>