2009-04-30 5 views
7

Il semble qu'il n'y a aucun moyen agréable de crypter un fichier en php.Méthodes de chiffrement de fichiers Php. Est-ce que quelque chose de simple existe?

Les méthodes intégrées de php, mcrypt, ne sont pas très portables car la plupart des serveurs ne les prennent pas en charge.

Les outils de chiffrement de ligne de commande sont comme des hacks laids.

Il y a un cryptage pour les chaînes, ce qui est sympa, mais si nous voulons crypter un fichier, cela n'aide pas beaucoup pour quelqu'un d'autre à le décrypter.

D'autres outils de cryptage nécessitent des clés publiques, des porte-clés, des clés privées, des échantillons de sang ... Cela semble beaucoup trop compliqué pour chiffrer un fichier.

Il semble que nous devrions avoir une fonction simple pour PHP qui pourrait fonctionner comme ceci:

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

Quelqu'un a des idées? Je sors les cheveux!

EDIT: Une autre chose que je devrais ajouter, pour que l'utilisateur final puisse déchiffrer le dossier avec facilité.

Fondamentalement, je suis en train de trouver quelque chose qui peut remplacer un mot de passe fichier zip protégé par

Répondre

2

Si vous ne me dérange pas d'avoir l'extension mcrypt installé, ce code devrait le faire:

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

Pourquoi voudriez-vous encode base64 le contenu d'un fichier? Il n'y a rien de mal avec les contenus binaires pour les fichiers. L'encodage en base64 augmente la taille des données de 33% – Jacco

+1

Je n'aime pas avoir de nouvelles lignes, car elles ne peuvent pas être copiées si j'ai besoin d'utiliser les données cryptées dans un scénario de copier/coller, mais cela fonctionne sans codage/décodage base64 . –

-3

Qu'en est-XOR simple?

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', 'clé'), 'clé') retourne 'aaa'.

EDIT: Bien sûr, vous devez utiliser

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

pour le fichier de lecture + écriture:]

+0

C'est un bon algorithme, mais le problème survient lorsque l'utilisateur final doit le déchiffrer. À court d'écrire une application Windows pour décoder il n'y a probablement pas un moyen facile pour eux de le décoder. Je vais probablement utiliser ce que vous avez ici dans d'autres projets, c'est bien propre et simple. – SeanDowney

+0

Erreur fatale: Impossible de redéclarer crypt() ... Erreur fatale: Appel à la fonction undefined asc() ... NULL ...? –

+0

@SeanDowney: selon Yossarian, il devrait chiffrer et décrypter les chaînes, le seul problème est que je ne peux pas le faire fonctionner même après avoir corrigé les bogues. = \ –

-3

fonction Crypte de Yossarian() fixe:

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

Est-ce que c'est XOR? -appelé "kid sister encryption", c'est-à-dire seulement utile pour cacher des trucs de votre petite soeur (ouais, vous pouvez utiliser OTP et d'autres choses, mais c'est loin d'être simple) – Piskvor

+0

Toujours utile, parfois: P –

+1

Ceci n'est pas utile dans un contexte de sécurité du tout _Crypt est un nom de fonction trompeuse Ce n'est pas un chiffrement, c'est au mieux une obfuscation – Jacco