Domanda

Sto cercando di scrivere un paio di funzioni che crittograferanno o decrittograferanno un file e sto utilizzando la classe trovata qui per provare a ottenere questo risultato:

http://www.itnewb.com/v/PHP-Encryption-Decryption-Using-the-MCrypt-Library-libmcrypt

La funzione di crittografia riportata di seguito sembra funzionare, in quanto sembra crittografare il file e inserirlo nella directory prevista.Sto provando a decrittografare il file adesso e muore con il messaggio "Impossibile completare la decrittografia" (che è codificato lì...) Non c'è niente nei log degli errori php, quindi non sono sicuro del motivo per cui non riesce , ma poiché mcrypt è completamente nuovo per me, sono più che propenso a credere che sto facendo qualcosa di sbagliato qui...

Ecco le funzioni:

//ENCRYPT FILE
    function encryptFile() {
        global $cryptastic;
        $pass = PGPPASS;
        $salt = PGPSALT;
        $key = $cryptastic->pbkdf2($pass, $salt, 1000, 32) or die("Failed to generate secret key.");

        if ($handle = opendir(PATH.'/ftpd')) {
            while (false !== ($file = readdir($handle))) {
                if ($file != "." && $file != "..") {
                    $newfile = PATH.'/encrypted/'.$file.'.txt';
                    $msg = file_get_contents(PATH.'/ftpd/'.$file);
                    $encrypted = $cryptastic->encrypt($msg, $key) or die("Failed to complete encryption.");
                    $nfile = fopen($newfile, 'w');
                    fwrite($nfile, $encrypted);
                    fclose($nfile);
                    unlink(PATH.'/ftpd/'.$file);

                }
            }
            closedir($handle);
        }       


//DECRYPT FILE
    function inFTP() {
        global $cryptastic;
        $pass = PGPPASS;
        $salt = PGPSALT;
        $key = $cryptastic->pbkdf2($pass, $salt, 1000, 32) or die("Failed to generate secret key.");

        if ($handle = opendir(PATH.'/encrypted')) {
            while (false !== ($file = readdir($handle))) {
                if ($file != "." && $file != "..") {
                    $newfile = PATH.'/decrypted/'.$file;
                    $msg = PATH.'/encrypted/'.$file;
                    $decrypted = $cryptastic->decrypt($msg, $key) or die("Failed to complete decryption.");
                    $nfile = fopen($newfile, 'w');
                    fwrite($nfile, $decrypted);
                    fclose($nfile);
                    //unlink(PATH.'/encrypted/'.$file);

                }
            }
            closedir($handle);
        }       
        //$crypt->decrypt($file);
    }
È stato utile?

Soluzione

Prova questa classe PHP5 per la crittografia usando mcrypt. In questo caso si sta usando la crittografia AES. Ti consigliamo di modificare la chiave per ogni sito si utilizza su. Se non si usa almeno si può guidare l'utente a scrivere la propria versione di esso.

<?php

class Encryption
{
    const CIPHER = MCRYPT_RIJNDAEL_128; // Rijndael-128 is AES
    const MODE   = MCRYPT_MODE_CBC;

    /* Cryptographic key of length 16, 24 or 32. NOT a password! */
    private $key;
    public function __construct($key) {
        $this->key = $key;
    }

    public function encrypt($plaintext) {
        $ivSize = mcrypt_get_iv_size(self::CIPHER, self::MODE);
        $iv = mcrypt_create_iv($ivSize, MCRYPT_DEV_URANDOM);
        $ciphertext = mcrypt_encrypt(self::CIPHER, $this->key, $plaintext, self::MODE, $iv);
        return base64_encode($iv.$ciphertext);
    }

    public function decrypt($ciphertext) {
        $ciphertext = base64_decode($ciphertext);
        $ivSize = mcrypt_get_iv_size(self::CIPHER, self::MODE);
        if (strlen($ciphertext) < $ivSize) {
            throw new Exception('Missing initialization vector');
        }

        $iv = substr($ciphertext, 0, $ivSize);
        $ciphertext = substr($ciphertext, $ivSize);
        $plaintext = mcrypt_decrypt(self::CIPHER, $this->key, $ciphertext, self::MODE, $iv);
        return rtrim($plaintext, "\0");
    }
}

Utilizzo:

$key = /* CRYPTOGRAPHIC!!! key */;
$crypt = new Encryption($key);
$encrypted_string = $crypt->encrypt('this is a test');
$decrypted_string = $crypt->decrypt($encrypted_string); // this is a test

Note:

  • Questa classe non è sicuro per l'utilizzo con dati binari (che può finire in NUL byte)
  • Questa classe non fornisce la crittografia autenticato.

Altri suggerimenti

Mentre Johns risposta è buona, utilizzando la codifica Base64 solo per risolvere il problema di sicurezza binario è eccessivo e renderà il vostro file crittografati 33% più grande rispetto all'originale. Ecco il mio PHP Attuazione del formato di file AES Crypt che risolve tutti i problemi di cui sopra in modo trasparente.

https://github.com/philios33/PHP-AES-File-Encryption

E 'binario sicuro e include la crittografia autenticato. Dal momento che utilizza l'open source aes formato di file cripta (.aes) è pienamente compatibile con il software di altri .aes.

https://www.aescrypt.com/

L'interfaccia è piuttosto semplice se si cifrare e decifrare. Basta dargli un file sorgente e una password.

Non dovresti utilizzare Mcrypt per crittografare/decrittografare i dati.Come mostrato nella tua domanda e nella risposta accettata, i dati non sono autenticati, il che significa che cadranno vittima di attacchi con testo cifrato scelto.

Inoltre, è stato fatto un grande sforzo per assicurarsi che gli sviluppatori assemblassero correttamente le primitive crittografiche.Pertanto, invece di Mcrypt, dovresti utilizzare libsodium per i tuoi progetti PHP.libsodium è una forchetta di NaCl.NaCl/libsodium è scritto per rimuovere molte delle trappole crittografiche in cui si trovano gli sviluppatori, come gli attacchi tempistici con verifica dei tag MAC.

Mcrypt è deprecato in PHP 7.1 e libsodim è il modo preferito per gestire la crittografia in PHP.

Usare libsodium nel tuo progetto PHP è facile e sicuro.Scott Arciszewski ha scritto un ampio ebook sull'uso di libsodium con PHP all'indirizzo https://paragonie.com/book/pecl-libsodium.Vale la pena leggerlo per chiunque si occupi di crittografia PHP.

CakePHP ha un buon implementazione di Rijndael. Io non sto postando codice direttamente qui perché non è sicuro le implicazioni legali.

Ecco la documentazione API per il metodo Security::rijndael().

Se la codifica di un file, si vuole base64_encode() prima di chiamare questo metodo con 'encrypt', e base64_decode() dopo aver chiamato questo metodo con 'decrypt'

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top