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);
}

Для небольшого текста это относительно быстро, но мне нужно зашифровать большой текст (3 МБ данных). Но для этого файла функция 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

Решение

Решение не в передаче битов, а в байтах … @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;

Спасибо, достаточно.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]