Я пытаюсь декодировать данные в php, возвращенном с сервера: я знаю, что данные AES 256 декодированы и имеют заполнение PKCS7, но не могу понять, какой режим блока он использует
вот моя функция PHP:
public function decode($data)
{
//AES decode
$iv = mcrypt_create_iv(GEServerConnection::FBENCRYPT_BLOCK_SIZE, MCRYPT_RAND);
$data = mcrypt_decrypt(MCRYPT_RIJNDAEL_128, $this->cryptKey, base64_decode($data), MCRYPT_MODE_ECB, $iv);
//return $data;
$len = strlen($data);
$pad = ord($data[$len - 1]);
return substr($data, 0, - $pad);
}
и пример закодированных данных
3KD+zb/2u5gGEWvOy0Q0nSQE9pbQZmg27iN6WLiO/Af9YjN8MhHOb8TMa5uETaab
когда я декодирую с помощью ECB (MCRYPT_MODE_ECB), он декодирует только начало данных, а остаток не читается
"Please input yo��̓��g|��*P�Te��� R�B
и при декодировании в режиме CBC (MCRYPT_MODE_CBC) он становится нечитаемым
��0�=v������.3ur username and password again"
результат должен быть (что я получаю на Mac, используя CommonCryptor в target-c):
"Please input your username and password again"
кто-нибудь знает, что не так или как правильно его расшифровать?
Пожалуйста, посмотрите на Статья в википедии. Посмотрите, как ECB и CBC выполняет расшифровку. Если бы использовался режим ECB, вы бы правильно расшифровали весь текст. Кажется, что шифр использовал CBC, потому что он использует предыдущий текст шифра + текущий текст шифра + функцию дешифрования, чтобы получить оригинальный текст. Это причина, почему вы правильно декодировали второй блок.
Теперь, почему первый блок декодирован неправильно? Это потому, что вам нужно указать правильный вектор инициализации. Это должно быть то же самое, что использовалось для шифрования. Нам повезло, что мы знаем, что ECB декодировал первый блок, потому что ECB не использует вектор инициализации.
Ответ прост: используйте CBC с нулевым вектором инициализации (все байты равны нулю), потому что теперь ваш случайный IV изменил первый блок на неправильный вывод.
Других решений пока нет …