2015-06-07 8 views
3

Im пытается декодировать данные в PHP вернулись с сервера: Я знаю данные AES 256 декодируются и имею pkcs7 отступы, но не могу понять, какой режим блока его используетAES 256 с pkcs7 отступами кодированных данными имеет половину ЕЦБ и половина CBC блок

вот моя 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 

когда я расшифровывать с ЕЦБ (MCRYPT_MODE_ECB) это декодировать только начало данных и остальное unreadabl е

"Please input yo��޸̓��g|��*P�Te��� R�B 

и когда декодирование в режиме CBC (MCRYPT_MODE_CBC) она есть начало нечитаемого

��0�=v������.3ur username and password again" 

результат должен быть (что я получаю на макинтош с помощью CommonCryptor в Objective-C):

"Please input your username and password again" 

Кто-нибудь знает, что не так, или как его декодировать правильно?

ответ

5

Пожалуйста, взгляните на Wikipedia article. Посмотрите, как расшифровывается ECB и CBC. Если бы ECB использовался в режиме, вы бы правильно расшифровали весь текст. Кажется, что шифр использовал CBC, потому что он использует предыдущий текст шифрования + текущий текст шифрования + расшифровку, чтобы получить исходный текст. Вот почему вы правильно декодировали второй блок.

Теперь почему первый блок декодирован неправильно? Это связано с тем, что вам нужно предоставить правильный вектор инициализации. Это должно быть то же самое, что и для шифрования. Нам повезло, что мы знаем, что ECB декодировал первый блок, потому что ECB не использует вектор инициализации.

Ответ прост: используйте CBC с нулевым вектором инициализации (все байты равны нулю), потому что теперь ваш случайный IV изменил первый блок на неверный вывод.

+1

Спасибо! Я начал думать об этом, но mcrypt не имеет нулевых функций создания вектора, я сделал это самостоятельно: $ iv = str_repeat («\ 0», 16); – Harry

 Смежные вопросы

  • Нет связанных вопросов^_^