PHP - Что ожидает функция 'openssl_decrypt'? - PullRequest
1 голос
/ 14 июня 2019

(Извините, я не являюсь носителем английского языка)

Я зашифровал данные с помощью AES-256-ECB, я использую функцию 'openssl_decrypt', но всегда получаю ложное значение.

$encrypted = '86090e16c5d950a35efe801f8eb5201b';
$key = 'PasswordExample_PasswordExample_';
$text = openssl_decrypt($encrypted, 'aes-256-ecb', $key);
echo "Result: $text";

Я пытался с опцией OPENSSL_RAW_DATA и передачей $encrypted и $key с base64_encode(), но ничего не получалось.

Друг посылает мне этот зашифрованный текст программным обеспечением, и я могу прочитать ответ на этом сайте: http://aes.online -domain-tools.com / (.:Text example:.), но я хочу использовать PHP для автоматизированного процесса.

Кто-то может мне помочь? Я не думаю, что на веб-странице PHP достаточно документации об этой функции.


Обновление:

Этот тестовый код показывает мою проблему:

<?php

$encrypted_hex = '86090e16c5d950a35efe801f8eb5201b';
$encrypted_str = pack("H*", $encrypted_hex);
$encrypted_64 = base64_encode($encrypted_str);

echo "Encrypted (str): '$encrypted_str'<br>\n";
echo "Encrypted (hex): '$encrypted_hex'<br>\n";
echo "Encrypted (64): '$encrypted_64'<br>\n";
echo "<br>\n";

$key_str = 'PasswordExample_PasswordExample_';
$key_hex = implode(unpack("H*", $key_str));
$key_64 = base64_encode($key_str);

echo "Key (str): '$key_str'<br>\n";
echo "Key (hex): '$key_hex'<br>\n";
echo "Key (64): '$key_64'<br>\n";
echo "<br>\n";

$result_str = openssl_decrypt($encrypted_str, 'aes-256-ecb', $key_str);
$result_hex = openssl_decrypt($encrypted_hex, 'aes-256-ecb', $key_hex);
$result_64 = openssl_decrypt($encrypted_64, 'aes-256-ecb', $key_64);

echo "Result (str): '$result_str'<br>\n";
echo "Result (hex): '$result_hex'<br>\n";
echo "Result (64): '$result_64'<br>\n";
echo "<br>\n";

Сгенерированный HTML-код:

Зашифровано (стр.): ' P ^ '
Зашифровано (в шестнадцатеричной форме): '86090e16c5d950a35efe801f8eb5201b'
Зашифровано (64): 'hgkOFsXZUKNe / oAfjrUgGw =='

Ключ (str): 'PasswordExample_PasswordExample _'
Ключ (шестнадцатеричный): '50617373776f72644578616d706c655f50617373776f72644578616d706c655f'
Ключ (64): 'UGFzc3dvcmRFeGFtcGxlX1Bhc3N3b3JkRXhhbXBsZV8 ='

Результат (стр.): ''
Результат (гекс): ''
Результат (64): ''

Если я добавлю OPENSSL_RAW_DATA, изменений не будет. Проблема сохраняется в Windows 10 и Ubuntu 18.04 (как в Apache 2, так и в PHP 7). Где моя ошибка? Может кто-нибудь показать мне пример использования с aes-256-ecb?

1 Ответ

2 голосов
/ 14 июня 2019

Расшифровка может быть выполнена с помощью:

$result = openssl_decrypt(hex2bin($encrypted_hex), 'aes-256-ecb', $key_str, OPENSSL_RAW_DATA|OPENSSL_ZERO_PADDING);
  • Относительно флага OPENSSL_ZERO_PADDING: веб-сайт использует заполнение нулями байтов , openssl_encrypt/decrypt заполнение PKCS7 . С помощью флага OPENSSL_ZERO_PADDING можно отключить заполнение PKCS7. Обратите внимание, что OPENSSL_ZERO_PADDING -flag отключает заполнение, это не означает, что используется Zero-Byte-padding (имя флага как-то сбивает с толку), см. openssl_encrypt, openssl по адресу mailismagic dot com . Заполнение нулями байтов не поддерживается напрямую openssl_encrypt/decrypt, то есть заполнение нулями байтов должно быть реализовано пользователем. Поскольку на стороне PHP происходит только дешифрование, только ручное удаление (то есть удаление нулевых значений в конце) должно выполняться вручную (чего в настоящее время нет в PHP-коде). Для текущего открытого текста (.:Text example:.) отсутствующее растяжение не замечено, поскольку открытый текст имеет длину ровно один блок (16 байт), поэтому заполнение нулями не будет происходить во время шифрования (в отличие от PKCS7 - отступ, к которому добавляется полный блок).

  • Относительно флага OPENSSL_RAW_DATA: зашифрованный текст не кодируется Base64, поэтому необходимо установить флаг OPENSSL_RAW_DATA. В качестве альтернативы:

    $result = openssl_decrypt(base64_encode(hex2bin($encrypted_hex)), 'aes-256-ecb', $key_str, OPENSSL_ZERO_PADDING);
    

    можно использовать для расшифровки.

  • Относительно первого параметра: поскольку зашифрованный текст хранится в виде шестнадцатеричной строки, его сначала необходимо декодировать (hex2bin($encrypted_hex) или pack("H*", $encrypted_hex)), как уже отмечалось в комментариях.

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