PHP Encrypt Data, Bash Расшифровать его

Я пытаюсь придумать способ 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?

Взгляните на 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= 

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

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

 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/