Как я могу быстро сделать текстовый файл нечитаемым для людей? - PullRequest
0 голосов
/ 10 ноября 2011

Я хочу закодировать текстовый файл как можно быстрее, просто сделайте его нечитаемым для людей.

Может быть, щелкнуть первым битом каждого байта, или что-то, что можно сделать очень быстро, чтобы он нене тормозить сценарий.Текстовый файл будет иметь длину несколько МБ, поэтому любой быстрый способ сделать его нечитаемым.

Ответы [ 3 ]

5 голосов
/ 10 ноября 2011

Бросьте содержимое через один проход ROT13.

file_put_contents($filename, str_rot13(file_get_contents($filename));

Или через base64_encode:

file_put_contents($filename, base64_encode(file_get_contents($filename));

Быстрый тест показывает, что нет существенной разницы в скорости.

1 голос
/ 10 ноября 2011

Если ваш файл состоит в основном из цифр, вы можете попробовать XORing, скажем, с '0'. Это сопоставит все числа с непечатными управляющими кодами, что затруднит чтение файла без шестнадцатеричного редактора.

$n = strlen($str);
for ($i = 0; $i < $n; $i++) $str[$i] = $str[$i] ^ '0';

На практике, скорее всего, будет быстрее избежать цикла, используя либо str_repeat():

$str ^= str_repeat('0', strlen($str));

или strtr():

$from = $to = "x";
for ($i = 0; $i < 256; $i++) {
    $from[$i] = chr($i);
    $to[$i] = chr($i) ^ '0';
}
$str = strtr($str, $from, $to);

Из приведенных выше решений последнее представляется наиболее быстрым для длинных строк с пропускной способностью около 10 Мбит / с на моем компьютере. Решение str_repeat() хорошо работает для довольно коротких строк, но страдает от чрезмерного использования памяти с более длинными строками.

Конечно, ни одно из этих решений не обеспечивает какой-либо защиты от кого-либо с помощью шестнадцатеричного редактора и двух ячеек мозга, которые можно потереть вместе. Для этого вам понадобится настоящее шифрование.

1 голос
/ 10 ноября 2011

Я написал что-то, что уже шифрует на двоичном уровне.Вот он, адаптированный для вас:

// Hexadecimal to String
//  Usage: hextostr(STRING_HEXADECIMAL);
function hextostr($x)
  { 
  $s = '';
  foreach (explode("\n", trim(chunk_split($x, 2))) as $h)
    $s .= chr(hexdec($h));
  return $s;
  } 

// String to Hexadecimal
//  Usage: strtohex(STRING);
function strtohex($x)
  { 
  $s = '';
  foreach (str_split($x) as $c)
    $s .= sprintf("%02X", ord($c));
  return $s;
  }

  function encrypt($log_raw)
    {
    // Convert binary log file to hexadecimal
    $log_hex = $this->strtohex($log_raw);

    // Split hexadecimal values into an array of bytes
    $log_hex_array = str_split($log_hex, 2);

    // Flip the binary data around
    foreach ($log_hex_array as $key => $log_hex_byte)
      {
      $log_hex_array[$key] = strrev($log_hex_byte);
      }

    // Return the encoded data
    return implode("", $log_hex_array);
    }

Теперь все, что вам нужно сделать, это пропустить вашу строку через encrypt, и она будет закодирована на двоичном уровне.Передайте строку в encrypt еще раз, чтобы декодировать строку.

На самом деле я не проверял ее производительность, но, зная PHP, она может быть медленнее, чем вы хотите.Тем не менее, попробуйте, тем не менее.

...