我想以儘可能最快的方式對文本文件進行編碼,使其無法被人讀取。如何快速創建一個文本文件不可讀取給人類?
也許翻轉每個字節的第一位,或者可以很快完成的事情,以便它不會減慢腳本。文本文件的長度是幾MB,所以無論是最快的方法,使其無法讀取。
我想以儘可能最快的方式對文本文件進行編碼,使其無法被人讀取。如何快速創建一個文本文件不可讀取給人類?
也許翻轉每個字節的第一位,或者可以很快完成的事情,以便它不會減慢腳本。文本文件的長度是幾MB,所以無論是最快的方法,使其無法讀取。
如果你的文件主要由數字組成,你可以試着用它來異或'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()
解決方案適用於相當短的字符串,但長字符串的內存使用率過高。
當然,這些解決方案都沒有提供任何安全措施來防止有人使用十六進制編輯器和兩個腦細胞揉在一起。爲此,你需要真正的加密。
通過一次ROT13拋出內容。
file_put_contents($filename, str_rot13(file_get_contents($filename));
或者,通過base64_encode
:
file_put_contents($filename, base64_encode(file_get_contents($filename));
快速測試告訴我,有在速度上沒有顯著差異。
我寫了一些已經在二進制級別加密的東西。這是適合你:
// 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,它可能比你想要的要慢。不過,儘管如此,試試吧。
@Alasdair你不應該使用這個,因爲你主要關心的是速度。 PHP中內置了更好的加密算法,因爲它們是在C中實現的,所以它的速度要快幾個數量級。 – meagar
什麼,你想'rot13()',或者什麼?這與你所要求的接近,但誰知道它是否有效。你必須自己測試各種功能才能看到。 – Brad
這不是加密,而是編碼。 – meagar