PHP - XOR加密

时间:2017-03-27 11:30:46

标签: php encryption xor

通过XOR加密数据有比这更快的选项吗?

private static function getBinary($string)
{
    $output = '';
    for($i = 0; $i < strlen($string); $i++)
    {
        $value   = decbin(ord($string[$i]));
        $binary  = str_pad($value, 8, '0', STR_PAD_LEFT);
        $output .= $binary;
    }

    return ($output);
}

private static function getCrypted($key, $value)
{
    $output = '';
    $key_index = 0;
    $max = strlen($key);

    for($i = 0; $i < strlen($value); $i++)
    {
        if($key_index >= $max){ $key_index = 0;}
        $output .= ($key[$key_index] XOR $value[$i]) ? '1' : '0';
        $key_index++;
    }

    return ($output);
}

对于小文本,它相对较快,但我需要加密大文本(3MB数据)。但是对于这个文件,getCrypted()函数需要10-20秒,这是不可接受的。

$bin_text = self::getBinary($text);   // cca 4 sec.
$bin_key  = self::getBinary("12345"); // 0 sec.

return self::getCrypted($bin_key, $bin_text); // 11 sec+

那么,它有什么最快的方法吗?也许将文本转换为二进制而不使用0和1创建另一个字符串?我不知道......谢谢你的回复。

1 个答案:

答案 0 :(得分:0)

解决方案不是传输位,而是字节... @CBroe

$byte_text = unpack('C*', 'asasdkasndaksdnkas');
$byte_key  = unpack('C*', '12345');

$output    = '';
$key_index = 1;

for($i = 1; $i < count($byte_text)+1; $i++)
{
    if($key_index > count($byte_key)){ $key_index = 1;}
    $output .= dechex(($byte_text[$i] ^ $byte_key[$key_index]));
    $key_index++;
}

echo $output;

这就是全部,谢谢。