php8 openssl openssl_cipher_iv_length возвращает 0

#php #wordpress

Вопрос:

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

  private static function encrypt_tripledes($data, $secret)
{
    $method = 'DES-EDE3';
    $iv = openssl_random_pseudo_bytes(openssl_cipher_iv_length($method));
    $encrypted = openssl_encrypt($data, $method, $secret, 0, $iv);
    return $encrypted;
}
 

Проблема в том, что openssl_cipher_iv_length возвращается 0, и весь плагин и WordPress вылетают, когда он хочет перенаправить на веб-сайт банковских платежей. как я могу решить эту проблему?

Вот сообщение об ошибке, когда оно хочет перенаправить в банк:

 Fatal error: Uncaught Error: Length must be greater than 0
 

Комментарии:

1. Режим «DES-EDE3» является синонимом тройного DES с режимом ECB — режимы ECB, как правило, не используют IV, поэтому PHP/OpenSSL возвращает нулевую длину.

2. @MichaelFehr Спасибо за ваш ответ. Но этот точный код некоторое время работал правильно, и внезапно он сломал всю систему. Я проверил все параметры, которые изменяются при обновлении, и единственное, что было, это версия PHP и версия WordPress…

3. Возможно, в более старых версиях PHP возврат всегда был «8», когда алгоритм начинается с «DES», а в более новых версиях они решили вернуть «ноль», когда алгоритмы указывают на режим ECB.

4. @MichaelFehr Понижение версии PHP также не сработало 🙁

5. Другими словами: PHP работает правильно, так как алгоритм шифрования «DES-EDE3» означает использование алгоритма DES в режиме ECB — режим ECB в целом не использует или не требует вектора инициализации, поэтому PHP возвращает длину «0» (означает, что не требуется или не требуется. Теперь у вас есть два варианта: использовать режим, для которого требуется капельница (например, режим CBC) ИЛИ не используйте капельницу.