2009-04-30 16 views
7

Parece que no hay ninguna forma agradable de encriptar un archivo en php.Métodos de cifrado de archivos Php. ¿Existe algo simple?

Los métodos integrados de php, mcrypt, no son muy portátiles ya que la mayoría de los servidores no los admiten.

Las herramientas de cifrado de línea de comandos son como feos hacks.

Hay encriptación para cadenas, lo que es bueno, pero si queremos encriptar un archivo no ayuda mucho, especialmente para que alguien más lo desencripte.

Otras herramientas de cifrado requieren claves públicas, llaveros, claves privadas, muestras de sangre ... Parecen demasiado complicadas para encriptar un archivo.

Parece que deberíamos tener una función simple para PHP que podría funcionar así:

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

Cualquiera tiene alguna idea? ¡Estoy sacando cabello!

EDITAR: Otra cosa que debería agregar, para que el usuario final pueda descifrar el archivo con facilidad.

Básicamente estoy tratando de encontrar algo que puede reemplazar un archivo zip protegido por contraseña

Respuesta

2

Si no te importa tener instalada la extensión mcrypt, este código debe hacerlo:

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

¿Por qué se quiere codificar base 64 el contenido de un archivo? No hay nada de malo con los contenidos binarios para los archivos. la codificación de base64 aumenta el tamaño de los datos en un 33% – Jacco

+1

No me gusta tener líneas nuevas, ya que podrían no copiarse si necesito usar los datos cifrados en un escenario de copiar/pegar, pero sí funciona sin codificar/decodificar base64 . –

-3

¿qué pasa con sencillo 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; 
} 

=> cripta (cripta ('AAA', 'llave'), 'clave') 'AAA' retornos.

EDIT: por supuesto, se debe utilizar

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

de archivos de lectura + escritura:] función

+0

Es un buen algoritmo, pero el problema surge cuando el usuario final necesita descifrarlo. Si no se escribe una aplicación de Windows para decodificar, probablemente no sea una forma fácil de descifrarla. Probablemente use lo que tienes aquí en otros proyectos, es agradable, limpio y simple. – SeanDowney

+0

Error grave: No se puede redeclarar crypt() ... Error fatal: llamada a la función no definida asc() ... NULL ...? –

+0

@SeanDowney: según Yossarian, debe encriptar y desencriptar cadenas, el único problema es que no puedo hacer que funcione incluso después de corregir los errores. = \ –

-3

Yossarian cripta() fija:

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

¿Eso es XOR? -llamado "cifrado de hermana menor", es decir, solo útil para ocultar cosas de su hermana menor (sí, podría usar OTP y esas cosas, pero eso está lejos de ser simple) – Piskvor

+0

Aún así, a veces útil: P –

+1

Esto no es útil en una contexto de seguridad en absoluto. _Crypt es un nombre de función engañoso. No es encriptación, es ofuscación en el mejor de los casos. – Jacco