如何在PHP中执行XOR加密


How do I perform XOR encryption in PHP?

我正试图在PHP中执行XOR加密,但我很难找到能产生正确输出的脚本。我第一次使用http://snipplr.com/view/8421/xor-encryptdecrypt/脚本,我对其进行了修改,使其不会以base64编码的方式返回加密文本。我还把它从课堂上删除了。这是我的代码:

$key = "My key";
function get_rnd_iv($iv_len)
{
    $iv = '';
    while ($iv_len-- > 0)
    {
        $iv .= chr(mt_rand() & 0xff);
    }
    return $iv;
}
function encrypt($plain_text, $iv_len = 16)
{
    $plain_text .= "'x13";
    $n = strlen($plain_text);
    if ($n % 16)
    {
        $plain_text .= str_repeat("'0", 16 - ($n % 16));
        $i = 0;
        $enc_text = get_rnd_iv($iv_len);
        $iv = substr($key ^ $enc_text, 0, 512);
        while ($i < $n)
        {
            $block = substr($plain_text, $i, 16) ^ pack('H*', sha1($iv));
            $enc_text .= $block;
            $iv = substr($block . $iv, 0, 512) ^ $key;
            $i += 16;
        }
        //return base64_encode($enc_text);
        return $enc_text;
    } else {}
}
function decrypt($enc_text, $iv_len = 16)
{
    //$enc_text = base64_decode($enc_text);
    $n = strlen($enc_text);
    $i = $iv_len;
    $plain_text = '';
    $iv = substr($key ^ substr($enc_text, 0, $iv_len), 0, 512);
    while ($i < $n)
    {
        $block = substr($enc_text, $i, 16);
        $plain_text .= $block ^ pack('H*', sha1($iv));
        $iv = substr($block . $iv, 0, 512) ^ $key;
        $i += 16;
    }
    return stripslashes(preg_replace('/''x13''x00*$/', '', $plain_text));
}
$enc = encrypt('text');
echo 'Encrypted: '.$enc.'<br />';
echo 'Decrypted: '.decrypt($enc);

现在,当我运行这个时,我得到:

Encrypted: ¥Õlµê®M²:Ýë??ÞÂ=粸 È,ñ ™ÑÂÔ ¹
Decrypted: text

编辑:

每次运行时,我都会得到不同的输出?!

但是,以下网站产生的结果与该片段完全不同:http://www.abcel-online.com/tools.php?id=decrypthttp://th.atguy.com/mycode/xor_js_encryption/

我还尝试了这个网站的代码:http://www.go4expert.com/forums/showthread.php?t=5555

请告诉我哪一个是正确的,我做错了什么。

您使用的是随机IV,它明确用于为每次函数运行生成不同的密文。这是为了确保您不会泄露有关纯文本的信息。例如,否则对单词"yes"加密两次将产生相同的密文。请注意,您可能仍然存在关于密文的大小的泄漏,这与纯文本的大小有关。