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