2011-11-10 24 views
0

我想以儘可能最快的方式對文本文件進行編碼,使其無法被人讀取。如何快速創建一個文本文件不可讀取給人類?

也許翻轉每個字節的第一位,或者可以很快完成的事情,以便它不會減慢腳本。文本文件的長度是幾MB,所以無論是最快的方法,使其無法讀取。

+1

什麼,你想'rot13()',或者什麼?這與你所要求的接近,但誰知道它是否有效。你必須自己測試各種功能才能看到。 – Brad

+2

這不是加密,而是編碼。 – meagar

回答

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()解決方案適用於相當短的字符串,但長字符串的內存使用率過高。

當然,這些解決方案都沒有提供任何安全措施來防止有人使用十六進制編輯器和兩個腦細胞揉在一起。爲此,你需要真正的加密。

5

通過一次ROT13拋出內容。

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

或者,通過base64_encode

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

快速測試告訴我,有在速度上沒有顯著差異。

+0

令人難以置信的:)我認爲我會是唯一一個通過暗示rot13勇敢潛在降價的人。 +1首先到達那裏。 –

+0

這就是我所要求的,但是因爲在PHP中專門有一個專門的功能來做到這一點,所以我認爲任何想解碼的人都會覺得這很明顯。另外,我的文本文件由數字組成,而不是字母。 – Alasdair

+1

然後使用'base64_encode'而不是'str_rot13'。它會處理任何角色。 – meagar

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,它可能比你想要的要慢。不過,儘管如此,試試吧。

+0

@Alasdair你不應該使用這個,因爲你主要關心的是速度。 PHP中內置了更好的加密算法,因爲它們是在C中實現的,所以它的速度要快幾個數量級。 – meagar