Пропуск / поиск позиции с шифрованием RC4 - PullRequest
3 голосов
/ 06 марта 2012

У меня возникает эта проблема, когда я хочу "пропустить" позицию во время потоковой передачи зашифрованного видео

Итак, что у меня есть:

HTTP-сервер потоковой передачи (локальный, работает на устройстве Android) родной Android Media Player Утилита шифрования RC4

По сути, я храню зашифрованное видео на SD-карте и хочу передать его на медиаплеер, используя мой потоковый HTTP-сервер. Сервер уже выполняет шифрование «на лету», которое на самом деле работает, преобразовывая байты с помощью утилиты шифрования RC4 перед записью его в OutputStream.

Шифрование файла не проблема - просто запустите весь файл с использованием сгенерированных битов утилиты шифрования - что я просто делаю при попытке воспроизвести видео. Проблема в том, что когда я хочу «искать» позицию в видео, например, я хочу просмотреть среднюю часть двухчасового фильма. В настоящее время я работаю, хотя и очень медленно, но и сбрасываю утилиту шифрования RC4, передавая ее на сумму, равную продолжительности, к которой я перешел в видео.

Прошу прощения, если я не очень ясно изложил свое объяснение здесь, но если вы действительно работали с шифрованием RC4 с потоковой передачей, вы должны были столкнуться с той же проблемой.

Итак, вопрос в том, возможно ли это, и если да, то как я могу "искать" позицию в моем битовом генераторе RC4, не пропуская все ненужные байты, которые я только что пропустил?

Каждое видео имеет размер около 500 МБ или около того, поэтому, если я попытаюсь приблизиться к концу видео, это будет около 500 000 000 бесполезных итераций, которые нужно выполнить, прежде чем можно будет передавать правильные данные.

1 Ответ

5 голосов
/ 06 марта 2012

Нет, алгоритм RC4 не доступен для поиска. Каждая итерация генерации потока ключей включает в себя перестановку зависимой от ключа перестановки S с использованием обмена состоянием из двух элементов способом, который трудно воспроизвести без фактического выполнения всех промежуточных перестановок.

Было бы тривиально выполнить то, что вы хотите, если бы вы использовали, например, AES в режиме CTR , поскольку режим CTR был разработан для обеспечения полного поиска.

Edit: Тем не менее, одна вещь, которую вы могли бы сделать, если не мало памяти, это использовать собственную реализацию RC4 (см. Ссылку, это легко сделать) и регулярно кэшировать внутреннее состояние (всего 258 байт в каждой позиции). Это помогло бы, если пользователь много перескочил назад и вперед, но в первый раз, когда пользователь пропускает вперед, весь поток ключей RC4 должен быть сгенерирован в эту позицию.

...