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 шт):
Опция OPENSSL_ZERO_PADDING означает, что ваши данные шифруются как есть, без выравнивания на границу блока.
Сообщение об ошибке говорит: длина строки $phone не кратна размеру блока.
В AES размер блока данных 128 бит, поэтому перед шифрованием вам нужно самостоятельно дополнить $phone до 128 бит.
Немного поискал на 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;
}