如何快速使文本文件对人类不可读?

时间:2011-11-10 14:09:05

标签: php string encoding obfuscation

我想以最快的方式对文本文件进行编码,只是让人类无法读取它。

可能会翻转每个字节的第一位,或者可以非常快速地执行某些操作,这样就不会减慢脚本的速度。文本文件的长度将是几MB,因此无论哪种方法都可以使其无法读取。

3 个答案:

答案 0 :(得分:5)

通过ROT13的单次传递丢弃内容。

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

或者,通过base64_encode

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

快速测试告诉我速度没有显着差异。

答案 1 :(得分:1)

我写了一些已经在二进制级别加密的东西。这是适合你的:

// 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,它可能比你想要的要慢。尽管如此,还是尝试一下。

答案 2 :(得分:1)

如果您的文件主要由数字组成,那么您可以尝试将其与'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 Mb / s。 str_repeat()解决方案适用于相当短的字符串,但是使用较长的字符串会导致内存使用过多。

当然,这些解决方案都没有为使用十六进制编辑器和两个脑细胞的人提供任何安全保护。为此,您需要真正的加密。