Question

Essayer d'écrire quelques fonctions qui crypteront ou décrypteront un fichier et j'utiliseront la classe trouvée ici pour essayer de réaliser ceci:

http://www.itnewb.com/v/php-encryption-decryption-using-the-mcrypt-library-libmcrypt

La fonction de chiffrement ci-dessous semble fonctionner, en ce qu'il semble crypter le fichier et le placer dans le répertoire prévu. J'essaie de décrypter le fichier maintenant, et il meurt juste avec le message "n'a pas réussi à terminer le déchiffrement" (qui est codé là-dedans ...) Il n'y a rien dans les journaux d'erreur PHP, donc je ne sais pas pourquoi il échoue , mais comme McRypt est entièrement nouveau pour moi, je suis plus que enclin à croire que je fais quelque chose de mal ici ...

Voici les fonctions:

//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);
    }
Était-ce utile?

La solution

Essayez cette classe PHP5 pour le cryptage à l'aide de McRypt. Dans ce cas, il utilise le cryptage AES. Vous voudrez modifier la clé pour chaque site sur lequel vous l'utilisez. Si vous ne l'utilisez pas au moins, cela peut vous guider sur l'écriture de votre propre version.

<?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");
    }
}

Usage:

$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

Remarques:

  • Cette classe n'est pas sûre pour une utilisation avec des données binaires (qui peuvent se terminer par Nul octets)
  • Cette classe ne fournit pas de cryptage authentifié.

Autres conseils

Bien que la réponse Johns soit bonne, l'utilisation de Base64 Encoding juste pour résoudre le problème de sécurité binaire est exagérée et rendra vos fichiers cryptés 33% plus grands que l'original. Voici mon implémentation PHP du format de fichier AES Crypt qui résout tous les problèmes ci-dessus de manière transparente.

https://github.com/philios33/php-aes-file-cryption

Il est en sécurité binaire et comprend un cryptage authentifié. Puisqu'il utilise le format de fichier Open Source AES Crypt (.AES), il est entièrement compatible avec les autres logiciels .aes.

https://www.aescrypt.com/

L'interface est assez simple, que vous chiffrez ou décryptez. Vous lui donnez simplement un fichier source et un mot de passe.

Vous ne devriez pas utiliser McRypt pour crypter / décrypter les données. Comme indiqué dans votre question et dans la réponse acceptée, les données ne sont pas authentifiées, ce qui signifie qu'elle sera victime des attaques choisies en texte chiffré.

De plus, beaucoup d'efforts ont été faits pour s'assurer que les développeurs ont correctement rassemblé les primitives cryptographiques. En tant que tel, au lieu de McRypt, vous devriez utiliser Libsodium pour vos projets PHP. Le libsodium est une fourche de NaCl. NaCl / Libsodium est écrit pour supprimer beaucoup de pièges cryptographiques dans lesquels les développeurs se retrouvent, tels que des attaques de synchronisation avec la vérification des balises MAC.

Mcrypt est obsolète dans PHP 7.1, et Libsodim est le moyen préféré de gérer la cryptographie en PHP.

L'utilisation de Libsodium dans votre projet PHP est facile et sécurisée. Scott Arciszewski a écrit un ebook étendu sur l'utilisation de Libsodium avec PHP à https://paragonie.com/book/pecl-libsodium. Cela vaut la peine de lire pour quiconque fait de la cryptographie PHP.

CakePHP has a pretty good implementation of rijndael. I'm not posting code directly here because not sure the legal ramifications.

Here are the api docs for the Security::rijndael() method.

If encoding a file, you will want to base64_encode() before calling this method with 'encrypt', and base64_decode() after calling this method with 'decrypt'

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top