openssl_encrypt возвращает false если использовать OPENSSL_ZERO_PADDING

Получаю некоторые зашифрованные данные из стороннего сервиса и на php их успешно дешифрую следуюющим кодом

$secret = 'test';
$iv = '1234567890123456';
$algo = 'aes-256-cbc';

$decrypted = openssl_decrypt($encryptedString, $algo, $secret, OPENSSL_ZERO_PADDING, $iv);

Пытаюсь зашифровать тем же способом с теми же настройками

...
$encrypted = openssl_encrypt($phone, $algo, $secret, OPENSSL_ZERO_PADDING, $iv);

Но с функции openssl_error_string() получаю ошибку error:0607F08A:digital envelope routines:EVP_EncryptFinal_ex:data not multiple of block length если использую опцию OPENSSL_ZERO_PADDING

Следующий код работает но дает мне не то что нужно в результате

$encrypted = openssl_encrypt($phone, $algo, $secret, $options=0, $iv);

Изменить данные для шифрования/дешифрования не могу, т.к они задаються на стороннем сервере, а шифровать мне нужно для тестирования.


Ответы (2 шт):

Автор решения: Pak Uula

Опция OPENSSL_ZERO_PADDING означает, что ваши данные шифруются как есть, без выравнивания на границу блока.

Сообщение об ошибке говорит: длина строки $phone не кратна размеру блока.

В AES размер блока данных 128 бит, поэтому перед шифрованием вам нужно самостоятельно дополнить $phone до 128 бит.

→ Ссылка
Автор решения: Arendach

Немного поискал на stackoverflow на английском нашел решение проблемы. Дело в том что текст должен быть в длинну блока. Нашел решение в этом вопросе

Немного доработал код под себя

function makePadding(string $source, string $iv): string
{
    $ivLength = strlen($iv);

    if (strlen($source) % $ivLength) {
        return str_pad($source, strlen($source) + $ivLength - strlen($source) % $ivLength, "\0");
    }

    return $source;
}
→ Ссылка