Мой код работает, если я вручную дополняю строку длиной до 32.
Мой вопрос: есть ли способ сделать openSSL pad данными или мне всегда нужно это делать?
За работой:
openssl_encrypt ("my baba is over the ocean1111111", 'AES-256-CBC', $MY_SECRET_KEY,OPENSSL_RAW_DATA|OPENSSL_ZERO_PADDING,$MY_IV);
Не работает:
openssl_encrypt ("my baba is over the ocean", 'AES-256-CBC', $MY_SECRET_KEY,OPENSSL_RAW_DATA|OPENSSL_ZERO_PADDING,$MY_IV);
Я решаю это в настоящее время путем самостоятельного заполнения:
$pad = 32 - (strlen("my baba is over the ocean") % 32);
$clear = "my baba is over the ocean" . str_repeat(chr($pad), $pad); //encrypt this string
Как сказал Люк Парк, вместо того, чтобы явно рассказывать openssl_encrypt
использовать OPENSSL_ZERO_PADDING
просто удалите эту опцию из параметра, и она по умолчанию будет PKCS # 7 схема заполнения (заполняет остальную часть блока 0x0n
где N количество необходимых байтов; + 16 0x00
если блок уже завершен). Примечание: PKCS # 5, на который ссылаются Luke и PKCS # 7, фактически идентичны в этом сценарии.
От PHP документы:
Без использования OPENSSL_ZERO_PADDING вы автоматически получите заполнение PKCS # 7.
Так что вы должны звонить:
openssl_encrypt("my baba is over the ocean", 'AES-256-CBC', $MY_SECRET_KEY, OPENSSL_RAW_DATA, $MY_IV);
Других решений пока нет …