2009-04-30 10 views
7

Es scheint, dass es keine angenehme Möglichkeit gibt, eine Datei in PHP zu verschlüsseln.PHP-Dateiverschlüsselungsmethoden. Gibt es etwas Einfaches?

Die eingebauten Methoden von PHP, Mcrypt, sind nicht sehr portabel, da die meisten Server sie nicht unterstützen.

Befehlszeilen-Verschlüsselungstools sind wie hässliche Hacks.

Es gibt Verschlüsselung für Strings, das ist nett, aber wenn wir eine Datei verschlüsseln wollen, hilft es nicht sehr viel, besonders für jemand anderen, um es zu entschlüsseln.

Andere Verschlüsselungstools erfordern öffentliche Schlüssel, Schlüsselringe, private Schlüssel, Blutprobe ... Diese scheinen viel zu kompliziert, um nur eine Datei zu verschlüsseln.

Es scheint, dass wir nur eine einfache Funktion für PHP haben sollte, die wie so funktionieren könnte:

$crypt = new Crypt(); 
$crypt->encryptFile("Password1245!", 'secret_file.txt', 'encrypted_file.txt'); 
$crypt->decryptFile("Password1245!", 'encrypted_file.txt', 'original_file.txt'); 

Jeder irgendwelche Ideen? Ich ziehe Haare aus!

EDIT: Eine andere Sache, die ich hinzufügen sollte, damit der Endbenutzer die Datei mit Leichtigkeit entschlüsseln kann.

Grundsätzlich Ich versuche, etwas zu finden, die eine passwortgeschützte ZIP-Datei

Antwort

2

Wenn Sie nichts dagegen haben die mcrypt Erweiterung installiert hat, dieser Code sollte es tun:

function Encrypt($string, $key) 
{ 
    if (extension_loaded('mcrypt') === true) 
    { 
     return base64_encode(mcrypt_encrypt(MCRYPT_BLOWFISH, substr($key, 0, mcrypt_get_key_size(MCRYPT_BLOWFISH, MCRYPT_MODE_ECB)), trim($string), MCRYPT_MODE_ECB, mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_BLOWFISH, MCRYPT_MODE_ECB), MCRYPT_RAND))); 
    } 

    return false; 
} 

function Decrypt($string, $key) 
{ 
    if (extension_loaded('mcrypt') === true) 
    { 
     return trim(mcrypt_decrypt(MCRYPT_BLOWFISH, substr($key, 0, mcrypt_get_key_size(MCRYPT_BLOWFISH, MCRYPT_MODE_ECB)), base64_decode($string), MCRYPT_MODE_ECB, mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_BLOWFISH, MCRYPT_MODE_ECB), MCRYPT_RAND))); 
    } 

    return false; 
} 

function Encrypt_File($source, $destination, $key) 
{ 
    if (extension_loaded('mcrypt') === true) 
    { 
     if (is_file($source) === true) 
     { 
      $source = file_get_contents($source); 

      if (file_put_contents($destination, Encrypt($source, $key), LOCK_EX) !== false) 
      { 
       return true; 
      } 
     } 
    } 

    return false; 
} 

function Decrypt_File($source, $destination, $key) 
{ 
    if (extension_loaded('mcrypt') === true) 
    { 
     if (is_file($source) === true) 
     { 
      $source = file_get_contents($source); 

      if (file_put_contents($destination, Decrypt($source, $key), LOCK_EX) !== false) 
      { 
       return true; 
      } 
     } 
    } 

    return false; 
} 
+0

Warum möchten Sie base64 kodieren wollen der Inhalt einer Datei? Es gibt nichts Falsches an binären Inhalten für Dateien. Die base64-Kodierung erhöht die Datengröße um 33%. – Jacco

+1

Ich mag keine neuen Zeilen, da sie möglicherweise nicht kopiert werden, wenn ich die verschlüsselten Daten in einem Copy/Paste-Szenario verwenden muss, aber ja funktioniert es auch ohne base64-Kodierung/Dekodierung . –

-3

was über einfache xor?

function Crypt($source, $key) 
{ 
$rv=''; 
for($i=0;$i<strlen($source);$i++) 
{ 
    $rv.=chr(ord($source[$i])^ord($key[$i%strlen($key)])); 
} 
return $rv; 
} 

=> Crypt (Crypt ('aaa', 'Schlüssel'), 'Schlüssel') gibt 'aaa'.

EDIT: natürlich sollten Sie

file_put_contents(Crypt(file_get_contents('file'), 'key')); 

für Datei schreiben lesen + verwenden:]

+0

Das ist ein netter Algorithmus, aber das Problem kommt, wenn der Endbenutzer es entschlüsseln muss. Kurz davor, eine Windows-App zu schreiben, um sie dort zu dekodieren, ist wahrscheinlich kein einfacher Weg, sie zu entschlüsseln. Ich werde wahrscheinlich verwenden, was Sie hier in anderen Projekten haben, es ist schön sauber und einfach. – SeanDowney

+0

Schwerwiegender Fehler: crypt() kann nicht redeclariert werden ... Schwerwiegender Fehler: Aufruf zu undefinierter Funktion asc() ... NULL ...? –

+0

@SeanDowney: Laut Yossarian sollte es Strings verschlüsseln und entschlüsseln, das einzige Problem ist, dass ich es nicht funktionieren kann, selbst nachdem ich die Bugs behoben habe. = \ –

-3

Yossarian Krypta() Funktion festgelegt:

function _Crypt($source, $key) 
{ 
    $result = ''; 

    for($i = 0; $i < strlen($source); $i++) 
    { 
     $result .= chr(ord($source[$i])^ord($key[$i % strlen($key)])); 
    } 

    return $result; 
} 

_Crypt('aaa', 'key'); // 
_Crypt(_Crypt('aaa', 'key'), 'key'); // aaa 
+2

Ist das XOR? Das ist ein so "Kind Schwester Verschlüsselung", dh nur nützlich, um Sachen von Ihrem Kind Schwester zu verstecken. (yeah, Sie könnten OTP und so, aber das ist alles andere als einfach) – Piskvor

+0

Noch nützlich, manchmal.: P –

+1

Dies ist nicht nützlich in a Sicherheitskontext überhaupt. _Crypt ist ein irreführender Funktionsname. Es ist keine Verschlüsselung, es ist bestenfalls Verschleierung. – Jacco

Verwandte Themen