Javascript和PHP的XOR加密因某些密钥而失败


XOR encryption Javascript and PHP fails with some keys

我正在尝试用PHP和Javascript加密/解密由随机函数生成的$session_key字符串。它可以工作,但并非适用于所有字符串。使用一些$session_key,如示例所示,结果会有所不同。您可以在打开浏览器控制台时看到结果。

<?php
function xor_this($str, $key) {
    $result = '';
    for ($i = 0; $i < strlen($str); $i++) {
        $tmp = $str[$i];
        for ($j = 0; $j < strlen($key); $j++) {
            $tmp = chr(ord($tmp) ^ ord($key[$j]));
        }
        $result .= $tmp;
    }
    return $result;
}
#session_key generated by substr(str_shuffle("0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"), 0, 40)
$session_key = 'h9PYAE6KceX5g7081SnjCFBpVfux3bRtmdyDWwHq';
$password = '9b06a9342b5ac4a825088a0f0c2a2e7cc091393f';

echo xor_this($session_key, $password);
?>
<html>
    <script>
        function xor_this(str,key)
        {
            var xor = "";
            for (var i = 0; i < str.length; ++i) {
                tmp = str[i];
                for(var j = 0; j < key.length; ++j) {
                    tmp = String.fromCharCode(tmp.charCodeAt(0) ^ key.charCodeAt(j));
                }
                xor += tmp;
            }
            return xor;
        }
        var session_key = '<?php echo $session_key?>';
        var password = '<?php echo $password?>';
        console.log(xor_this(session_key,password));
    </script>
</html>

对于给定的$session_key,PHP和JavaScript的结果是相同的。

PHP生成:g6_VNJ9DljW:h8?7>'aeLIMYizw<m]{bkvKXxG~

JavaScript生成:g6_VNJ9DljW:h8?7>'aeLIMYizw<m]{bkvKXxG~

注意,<将启动一个新的HTML标记,浏览器不会在页面上显示其余的输出。您必须使用"查看源代码"来查看它,或者使程序在输出结果之前调用htmlspecialchars

顺便说一句,这不是什么加密:长密码不会提供任何额外的保护,因为所有字符总是异或在一起。例如,$password=chr(15)会为您提供与当前密码相同的结果。