如何在PHP中执行XOR加密?

时间:2012-03-25 22:28:47

标签: php encryption

我正在尝试在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=decrypt  http://th.atguy.com/mycode/xor_js_encryption/

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

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

1 个答案:

答案 0 :(得分:1)

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