我正在尝试在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
请告诉我哪一个是正确的,以及我做错了什么。
答案 0 :(得分:1)
您正在使用随机IV,它明确地用于为每次运行的函数生成不同的密文。这是为了确保您不会泄漏有关纯文本的信息。例如。否则加密单词“是”两次将导致相同的密文。请注意,密文的 size 仍然可能存在泄漏,这与纯文本的大小有关。