Есть ли более быстрый вариант шифрования данных через 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? Я не знаю … спасибо за ответ.
Решение не в передаче битов, а в байтах … @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;
Спасибо, достаточно.
Других решений пока нет …