PHP PKCS7 Ошибка заполнения
Я пытаюсь применить отступ PKCS7 к моему PHP-коду. Я вывел свой код из этой сути
https://gist.github.com/Halama/5956871
Ожидается, что размер блока будет 16 байтов. Данные представляют собой "пароль" длиной 8 байт. Получив планшет, он добавит его в конец данных для шифрования.
$blockSize = mcrypt_get_block_size(MCRYPT_RIJNDAEL_128, $thisMCRYPT_MODE_CBCmode);
$pad = $blockSize - (strlen($data) % $blockSize);
$data = $data . str_repeat(chr($pad), $pad);
Проблема в том, что есть (много) случаев, когда данные не могут расшифровать их.
Ниже приведены примеры данных в кодировке base64. Первые 16 байтов декодированного образца представляют IV
работает: cjg1RYWxlc8bDH2de43t0bv1ug36i8ayjWDQTela938 = (длина площадки: 8)
не работает: 9wWI + MyYj5ZVj2sC4xr7EgOsgNSoeTZW1yM8ddmqg18 = (длина площадки: 122)
Длина площадки, упомянутая выше, определяется с помощью этой
$pad = ord($data[strlen($data) - 1]);
Я использую mcrypt_enrypt для шифрования строки "пароль". Ключ, который я использую для mcrypt,
lGbsVE+qVO1P2ue0iCjrTPMU5hKX9aHE7r1aUUeqFag=
2 ответа
Решил это. знаки "+" в закодированных в base64 данных преобразуются в пробелы при транспортировке через http, что приводит к различным значениям.
Что я сделал, так это то, что клиент закодировал двоичные данные в base64 и передал их через функцию urlencode(). Сторона PHP обрабатывает данные, используя rawurldecode, поэтому игнорирует знаки "+".
Процедура заполнения / разгрузки выглядит правильно. То, что он не обеспечивает, является защитой от значений заполнения, превышающих размер блока.
Если зашифрованный текст расшифровывается с использованием неправильного ключа, или если зашифрованный текст поврежден (и для короткого зашифрованного текста, даже если IV неправильный), результатом будет (дополненный) открытый текст, который имеет, казалось бы, случайные данные. Таким образом, последний байт может иметь любое случайное значение во время распаковки неверного результата.
Чтобы защитить от таких сбоев, используйте значение MAC поверх зашифрованного текста, предпочтительно с использованием другого ключа. На данный момент проблема, скорее всего, не в (не) подпрограмме заполнения.