2017-02-16 12 views
1

Я пытаюсь узнать, как выполнить простой шифрование/дешифрование между машиной Windows 64 (мой компьютер) и PHP, работающей на веб-сервере Linux, используя openSSL ,Шифровать/расшифровывать openSSL между Windows PC и PHP, работающим на веб-сервере Linux

На моей машине Windows, я установил OpenSSL v1.0.2k для Win64, и я использую следующую команду, чтобы создать зашифрованную строку, используя простой пароль и простой ключ, расположенный в secretkey.txt.

enc -aes-256-cbc -A -base64 -nopad -nosalt -pass pass:hello -in secretkey.txt

Когда я запускаю команду выше, я получаю следующую строку:

3WE7cuBFhuLCn3/ZBnUrBn68nn3tVn0NKKz63B3uvoc=

Используя строку выше, я бы ожидать PHP на моем веб-сервере Linux, чтобы иметь возможность расшифровать это нравится:

$encrypted = '3WE7cuBFhuLCn3/ZBnUrBn68nn3tVn0NKKz63B3uvoc='; 
$enc = 'aes-256-cbc'; 
$password = 'hello'; 
$key = openssl_decrypt($encrypted, $enc, $password, OPENSSL_ZERO_PADDING); 
echo $key .' should equal this-1234-is-4567-my-8910-secret'; 

Но вместо этого я получаю это:

9 (JT] $ WMaSèzz>. (Должна равняться это-1234-это-4567-мой-8910-секрет

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

Open SSL Enc
Open SSL Command Line
PHP Decrypt

+0

не дубликат. вопрос заключается в попытке шифрования из командной строки (windows) и дешифрования с использованием php. рекомендуемое решение касается шифрования и дешифрования всего в PHP. – Marc

+0

Вы используете base64 для вывода openssl в своем PHP-коде? –

+0

Нулевая прокладка - плохая идея, в общем случае используется дополнение PKCS # 7 (né PKCS # 5). Нулевое заполнение не позволяет зашифровать двоичные данные, которые заканчиваются нулевым (0x00) байтом. – zaph

ответ

1

AES требует ключ работать. Это последовательность байтов точно точной длины (32 в случае AES-256). Вы не можете напрямую использовать пароль (если байты, составляющие пароль, не являются правильной длиной).

Кроме того, CBC mode требует: Инициализирующий вектор (IV) из 16 байт.

Команда OpenSSL enc выводит ключ и IV для использования с помощью пароля, предоставленного с использованием внутренней функции EVP_BytesToKey. Чтобы расшифровать файл, зашифрованный с помощью enc, вам необходимо воспроизвести эту функцию. Подробности алгоритма приведены в документах. В PHP, он может выглядеть следующим образом:

$password = 'hello'; 

$bytes = ""; 
$last = ""; 

// 32 bytes key + 16 bytes IV = 48 bytes. 
while(strlen($bytes) < 48) { 
    $last = md5($last . $password, true); 
    $bytes.= $last; 
} 

// First 32 bytes are the key, next 16 are the IV. 
$key = substr($bytes, 0, 32); 
$iv = substr($bytes, 32, 16); 

Вы можете использовать эти значения в команде openssl_decrypt:

$enc = 'aes-256-cbc'; 
$result = openssl_decrypt($encrypted, $enc, $key, OPENSSL_ZERO_PADDING, $iv);