Как мне сделать так, чтобы 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
Author: jww, 2017-02-13

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);
 4
Author: Andy, 2017-02-14 07:33:13