我正试图在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(" ", 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"加密两次将产生相同的密文。请注意,您可能仍然存在关于密文的大小的泄漏,这与纯文本的大小有关。