Php методы шифрования файлов. Существует ли что-то простое? - PullRequest
7 голосов
/ 30 апреля 2009

Кажется, что нет никакого приятного способа зашифровать файл в php.

Встроенные методы php, mcrypt, не очень переносимы, так как большинство серверов их не поддерживают.

Инструменты шифрования командной строки похожи на уродливые хаки.

Есть хорошее шифрование для строк, но если мы хотим зашифровать файл, это не очень поможет, особенно для того, чтобы кто-то еще расшифровал его.

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

Кажется, у нас должна быть простая функция для PHP, которая могла бы работать так:

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

У кого-нибудь есть идеи? Я вырываю волосы!

EDIT: Еще одна вещь, которую я должен добавить, чтобы конечный пользователь мог легко расшифровать файл.

В основном я пытаюсь найти что-то, что может заменить защищенный паролем почтовый файл

Ответы [ 4 ]

6 голосов
/ 30 апреля 2009

Взгляните на пакеты шифрования PEAR . Они не все полагаются на mcrypt - например, Crypt_Blowfish .

2 голосов
/ 30 апреля 2009

Если вы не возражаете против установки расширения mcrypt, этот код должен это сделать:

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 голосов
/ 30 апреля 2009

Исправлена ​​функция Crypt () Йоссариана:

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
0 голосов
/ 30 апреля 2009

как насчет простого 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;
}

=> Crypt (Crypt ('aaa', 'key'), 'key') возвращает 'aaa'.

РЕДАКТИРОВАТЬ: конечно, вы должны использовать

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

для чтения и записи в файл:]

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...