2016-02-19 2 views
0

У меня есть приложение iOS, которое шифрует строку с помощью [NSData AES128EncryptWithKey:] и отправляет ее по HTTP. Мы не писали приложение и почему это не просто использование HTTPS и вместо этого использование HTTP с AES-128-битным шифрованием - я понятия не имею. Я знаю, что это не идеально, но я работаю с тем, что дал мне клиент, и, прямо сейчас, у меня нет возможности/полномочий исправить это.Расшифровка AES-128-ECB, первый символ расшифровывается до 4 байтов

Мне поручено писать серверное приложение, чтобы принимать эти данные, которые отправляются в виде необработанного бинарного HTTP-сообщения POST и дешифрования тела POST, а затем работают с этими отправленными данными. Я использую PHP, так как это язык, на котором я могу написать серверную сторону быстрее (я изменяю аналогичное серверное приложение, которое уже выполняет ту работу, которая нам нужна для этого. Последнее использование данных не было зашифровано и отправлено через HTTPS)

Когда я дешифрую строку, используя либо mcrypt_decrypt (MCRYPT_RIJNDAEL_128), либо openssl_decrypt (AES-128-ECB), используя предоставленный разработчиком 16-байтовый ключ, первый символ строки расширяется до 4 байтов, все неправильно, и остаток строки расшифровывается просто отлично. Строка начинается с имени пользователя = WHATEVER, а затем за ней стоит около 700 байт других данных (общая длина кратная 16, она правильно заполнена на сервере, насколько я могу это объяснить). Вся строка является правильным, но когда расшифрован, что я получаю:

[email protected]{asername=WHATEVER... 

Каждый поиск Я сделал мне говорит о плохих 16 байт при использовании AES-CBC с неправильным IV, но он правильно расшифровывает с ECB - только первый байт ошибочен и расширен до 4 байтов.

Что мне не хватает?

+1

Это звучит как префикс длины. – SLaks

+0

Пожалуйста, добавьте код примера php для дешифрования, включая реальные входные данные и ожидаемое значение дешифрованных данных. – maxhb

+0

Существует две возможности: это дополнение для выравнивания данных до 16 байтов (но обычно оно добавляется в конце алгоритмом), или это индикатор с длиной содержимого для проверки размера, попробуйте прочитать его как двоичное целое. – Gusman

ответ

-1

Основываясь на комментариях о префиксе длины, я проверил известную длину строки и длину расшифрованной строки, и она была отключена примерно на 20 символов. Кажется, передняя часть была дополнена некоторыми двоичными данными, что при печати на экран терминала приводило к пустым символам и каким-то образом стертым символам, которые пришли после него (отсутствующий «u» в имени пользователя)? Когда я сделал substr ($ data, 20), строка напечатала правильно. Первые 20 байтов, не уверен, что это такое, но я нашел нужные мне данные. Благодарю.

+0

Если вы не понимаете данные, вы не можете создать правильное решение. Моя ставка заключается в том, что 20 байтов - проверка подлинности SHA-1. Режим ECB небезопасен, не используйте его. – zaph

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