2009-04-30 15 views
7

Sembra che non vi sia alcun modo piacevole per crittografare un file in php.Metodi di crittografia dei file Php. Esiste qualcosa di semplice?

I metodi incorporati di php, mcrypt, non sono molto portabili poiché la maggior parte dei server non li supporta.

Gli strumenti di crittografia della riga di comando sono come brutti hack.

C'è una crittografia per le stringhe che è piacevole, ma se vogliamo crittografare un file non è di grande aiuto specialmente per qualcun altro per decrittografarlo.

Altri strumenti di crittografia richiedono chiavi pubbliche, portachiavi, chiavi private, campioni di sangue ... Questi sembrano troppo complicati solo per la crittografia di un file.

Sembra che dovremmo avere una semplice funzione per PHP che potrebbe funzionare in questo modo:

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

Uno ha qualche idea? Sto tirando i capelli!

MODIFICA: Un'altra cosa che dovrei aggiungere, affinché l'utente finale sia in grado di decodificare il file con facilità.

Fondamentalmente io sto cercando di trovare qualcosa che possa sostituire un file protetto da password zip

risposta

2

Se non ti dispiace aver installato l'estensione mcrypt, questo codice dovrebbe farlo:

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

Perché si vuole base64 codificare il contenuto di un file? Non c'è niente di sbagliato nel contenuto binario dei file. la codifica base64 aumenta le dimensioni dei dati del 33% – Jacco

+1

Non mi piace avere nuove righe, poiché potrebbero non essere copiate se ho bisogno di usare i dati crittografati in uno scenario copia/incolla, ma sì funziona ancora senza codifica/decodifica base64 . –

-3

che dire di semplice 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 (Crypt ('aaa', 'chiave'), 'chiave') 'AAA' ritorni.

EDIT: ovviamente, si dovrebbe usare

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

per il file lettura e scrittura:] funzione

+0

Questo è un buon algoritmo, ma il problema si presenta quando l'utente finale deve decrittografarlo. A meno di scrivere un'app di Windows per decodificarla, probabilmente non è un modo semplice per decodificarlo. Probabilmente userò quello che hai qui in altri progetti, è bello pulito e semplice. – SeanDowney

+0

Errore irreversibile: impossibile redeclare crypt() ... Errore fatale: chiamata a funzione non definita asc() ... NULL ...? –

+0

@SeanDowney: secondo Yossarian dovrebbe cifrare e decifrare le stringhe, l'unico problema è che non riesco a farlo funzionare anche dopo aver corretto gli errori. = \ –

-3

di Yossarian Crypt() fisso:

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

È XOR? -Called "kid sister encryption", cioè utile solo per nascondere roba da tua sorella (Sì, potresti usare OTP e roba, ma è tutt'altro che semplice) – Piskvor

+0

Ancora, utile a volte.: P –

+1

Questo non è utile in un _Crypt è un nome di funzione fuorviante, non è crittografia, è offuscamento al massimo – Jacco

Problemi correlati