Я боролся с расшифровкой данной строки, созданной удаленным сервером ColdFusion, на PHP с использованием AES в режиме CBC с дополнением PKCS5. Я дошел до того, что могу расшифровать строку почти идеально, проблема в том, что в начале строки есть какая-то трещина. Я думал, что заполнение произошло в конце, но, глядя на расшифрованную строку, в конце ничего нет, но начало отлаживается, поэтому строка имеет длину 64 символа (исходная строка длиной 32 символа). Я попытался переключить свое дополнение код удаления, чтобы посмотреть на начало, а не на конец, но эти символы не предоставляют никакой информации, которую я могу использовать, чтобы расшифровать количество удалений, поэтому я думаю, что они происходят откуда-то еще. Вот мой код
function decrypt($hash) { $enc_key = "Oq2vh+gswPn2CRPccODtKg=="; $cipher = "rijndael-128"; $str = mcrypt_decrypt($cipher, base64_decode($enc_key), base64_decode($hash), MCRYPT_MODE_CBC); $block = mcrypt_get_block_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC); $pad = ord($str[($len = strlen($str)) - 1]); $len = strlen($str); $decrypted = substr($str, 0, strlen($str) - $pad); if($decrypted != NULL) { $params = explode ('|', $decrypted); } return (object)array( 'input' => $hash, 'pad' => $pad, 'len' => $len, 'blocksize' => $block, 'aes_key' => $enc_key, 'cipher' => $cipher, 'result' => $params, 'decrypted' => $decrypted, 'padded' => $str );
Если я зашифрую строку (используя ColdFusion, «AES / CBC / PKCS5Padding» и кодировку base64):
"test@example.com|test|1400863515"
Я получаю зашифрованную строку:
QRO04vmtw76Qvl0hscmYZ/SFGNv/8d88H9kT60JA5IJdg/KMT7udrn2IZuQzkOPvLjXoc4novzTMGsk0CMxjvg==
и когда я запускаю это через вышеупомянутую функцию PHP, я получаю это как вывод:
¹¾Sò'->äe¿fÏäJ±test@example.com|test|1400863515
Что это за персонажи в начале? Почему в конце нет прокладки? Я прочитал десятки сообщений на SO и в других местах (так я дошел так далеко), но этот последний кусок заставляет меня почесывать голову.
(Из комментариев …)
Для режима CBC требуется iv
. « Расшифровка с неправильным IV вызывает повреждение первого блока открытого текста … ». Попробуйте использовать тот же iv
с обеих сторон