Вопрос

Попытка написать пару функций, которые будут шифровать или расшифровать файл, и я использую класс, найденный здесь, чтобы попытаться сделать это:

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

Функция шифрования ниже, по -видимому, работает, поскольку она, по -видимому, шифрует файл и помещает его в предполагаемый каталог. Я пытаюсь расшифровать файл сейчас, и он просто умирает с сообщением «не удалось завершить дешифрование» (которое там кодировано ...) В журналах ошибок PHP нет ничего, поэтому я не уверен, почему это не удалось , но, как Макрипт совершенно новый для меня, я более чем склонен поверить, что делаю что -то не так ...

Вот функции:

//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);
    }
Это было полезно?

Решение

Попробуйте этот класс PHP5 для шифрования с помощью McRypt. В этом случае он использует шифрование AES. Вы захотите изменить ключ для каждого сайта, на котором он его использует. Если вы не используете его, по крайней мере, это может направить вас на написание собственной версии.

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

Применение:

$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

Заметки:

  • Этот класс небезопасен для использования с бинарными данными (которые могут заканчиваться байтами NUL)
  • Этот класс не обеспечивает аутентифицированного шифрования.

Другие советы

В то время как ответ Johns хорош, использование кодирования Base64, только для решения проблемы бинарной безопасности, является излишним и сделает ваши зашифрованные файлы на 33% больше, чем оригинал. Вот моя реализация PHP формата файла крипта AES, который прозрачно решает все вышеперечисленные проблемы.

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

Это бинарный сейф и включает в себя аутентифицированное шифрование. Поскольку он использует формат файла крипта с открытым исходным кодом (.aes), он полностью совместим с другим программным обеспечением .aes.

https://www.aescrypt.com/

Интерфейс довольно прост, независимо от того, шифруете ли вы или дешифровали. Вы просто даете ему исходный файл и пароль.

Вы не должны использовать McRypt для шифрования/расшифровки данных. Как показано в вашем вопросе, и в принятом ответе, данные не аутентифицируются, что означает, что он станет жертвой выбранных атак шифрового текста.

Кроме того, были предприняты большие усилия, чтобы убедиться, что разработчики правильно собрали криптографические примитивы. Таким образом, вместо McRypt вы должны использовать Libsodium для своих проектов PHP. Libsodium - вилка NaCl. NaCl/Libsodium написан, чтобы удалить многие криптографические ловушки, в которых оказываются разработчики, такие как атаки времени с проверкой тегов Mac.

McRypt устарел в PHP 7.1, а Libsodim является предпочтительным способом обработки криптографии в PHP.

Использование Libsodium в вашем проекте PHP легко и безопасно. Скотт Арсишевский написал обширную электронную книгу об использовании Libsodium с PHP в https://paragonie.com/book/pecl-libsodium. Анкет Это стоит прочитать для всех, кто делает криптографию PHP.

CakePhp есть довольно хорошо реализация Риджндаэль. Я не публикую код прямо здесь, потому что не уверен, что юридические последствия.

Вот документы API для Security::rijndael() метод

При кодировании файла вам захочется base64_encode() Прежде чем называть этот метод с 'encrypt', а также base64_decode() После вызова этого метода с 'decrypt'

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top