PHP шифрует данные, Bash расшифровывает их - PullRequest
4 голосов
/ 20 сентября 2011

Я пытаюсь найти способ зашифровать файл с помощью PHP. Раньше я просто использовал системный вызов PHP для запуска скрипта, который закодировал файл:

#!/bin/sh
/usr/bin/openssl aes-256-cbc -a -salt -k $1 -in $2

Аргумент 1 был паролем, а аргумент 2 - данными. Затем я использую второй скрипт на компьютере для дешифрования файла.

#!/bin/sh
/usr/bin/openssl aes-256-cbc -a -d -salt -k $1 -in $2

Этот метод шифрования не будет работать на производственном хосте, поскольку системный вызов PHP отключен. Я также предпочел бы не изменять функцию декодирования, если это вообще возможно.

Есть ли способ реплицировать вышеуказанную функцию шифрования, используя только PHP?

Ответы [ 3 ]

7 голосов
/ 20 сентября 2011

Взгляните на mcyrpt_encrypt():

string mcrypt_encrypt ( string $cipher , string $key , string $data , 
                        string $mode [, string $iv ] )

Установите $cipher на MCRYPT_RIJNDAEL_128 (AES-128) и $mode на MCRYPT_MODE_CBC.

Затем используйте base64_encode() для генерации выхода в кодировке base-64 (то есть: что делает опция -a).


openssl получает ключ и IV следующим образом:

Key = MD5(Password + Salt)
IV  = MD5(Key + Password + Salt)

Где Salt - 8-байтовая соль.Имея это в виду, я создал простые подпрограммы encrypt() и decrypt():


function ssl_encrypt($pass, $data) {

    $salt = substr(md5(mt_rand(), true), 8);

    $key = md5($pass . $salt, true);
    $iv = md5($key . $pass . $salt, true);

    $ct = mcrypt_encrypt (MCRYPT_RIJNDAEL_128, $key, $data, 
                          MCRYPT_MODE_CBC, $iv);

    return base64_encode('Salted__' . $salt . $ct);
}

function ssl_decrypt($pass, $data) {

    $data = base64_decode($data);
    $salt = substr($data, 8, 8);
    $ct = substr($data, 16);

    $key = md5($pass . $salt, true);
    $iv = md5($key . $pass . $salt, true);

    $pt = mcrypt_decrypt (MCRYPT_RIJNDAEL_128, $key, $ct, 
                          MCRYPT_MODE_CBC, $iv);

    return $pt;
}

Параметр $data принимает строку для шифрования.Если вы хотите зашифровать файл, вам нужно получить его с помощью file_get_contents() или аналогичного, а затем передать его функции.

Использование:

echo ssl_encrypt('super secret key', 'Hello World');

Создает что-то вроде (будет меняться каждый раз из-за случайной соли):

U2FsdGVkX18uygnq8bZYi6f62FzaeAnyB90U6v+Pyrk=
2 голосов
/ 21 сентября 2011

Как указано выше в дополнении комментариев необходимо сделать эту работу. Функция ниже создаст файл, который можно расшифровать в командной строке следующим образом:

openssl enc -d -aes-256-cbc -a -salt -in test.txt

Файл test.txt создается из выходных данных функции ssl_encrypt, приведенной ниже.

function ssl_encrypt($pass, $data)
{
    // Set a random salt
    $salt = substr(md5(mt_rand(), true), 8);

    $block = mcrypt_get_block_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC);
    $pad = $block - (strlen($data) % $block);

    $data = $data . str_repeat(chr($pad), $pad);

    // Setup encryption parameters
    $td = mcrypt_module_open(MCRYPT_RIJNDAEL_128, "", MCRYPT_MODE_CBC, "");


    $key_len =  mcrypt_enc_get_key_size($td);
    $iv_len =  mcrypt_enc_get_iv_size($td);

    $total_len = $key_len + $iv_len;
    $salted = '';
    $dx = '';
    // Salt the key and iv
    while (strlen($salted) < $total_len)
    {
        $dx = md5($dx.$pass.$salt, true);
        $salted .= $dx;
    }
    $key = substr($salted,0,$key_len);
    $iv = substr($salted,$key_len,$iv_len);


    mcrypt_generic_init($td, $key, $iv);
    $encrypted_data = mcrypt_generic($td, $data);
    mcrypt_generic_deinit($td);
    mcrypt_module_close($td);


    return chunk_split(base64_encode('Salted__' . $salt . $encrypted_data),32,"\r\n");
}

Пример использования:

$plainText = "Secret Message";
$password = "SecretPassword";
$test = ssl_encrypt($password, $plainText);
$file = fopen('test.txt', 'wb');
// Write the Base64 encrypted output to a file.
fwrite($file, $test);
fclose($file);
// Show the output on the screen
echo $test;

Ссылки: http://juan.boxfi.com/2010/03/16/write-openssl-files-in-php/

1 голос
/ 20 сентября 2011

Возможно, библиотека PHP OpenSSL ?

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