Как мне сделать так, чтобы openssl зашифровал ввод до требуемого размера блока?
Мой код работает, если я вручную добавляю строку длиной 32.
Мой вопрос таков: есть ли способ заставить OpenSSL заполнять данные, или я всегда должен это делать для этого?
Работа:
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
1 answers
Как сказал Люк Парк, вместо того, чтобы явно указывать openssl_encrypt
использовать OPENSSL_ZERO_PADDING
, просто удалите эту опцию из параметра, и по умолчанию будет использоваться схема заполнения PKCS #7 (заполняет остальную часть блока 0x0n
, где n - необходимое количество байтов; +16 0x00
, если блок уже завершен). Примечание: PKCS #5, на который ссылается Люк, и 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);