我正在尝试使用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 :(得分: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
函数(及其参数)编码到空格的字符。
答案 1 :(得分: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>