Какой шифр для шифрования пакетов UDP?

У меня есть приложение, которое выполняет чувствительную ко времени связь по UDP (например, потоковое видео или игра). Пакеты могут быть утеряны и не требуют повторной передачи.

Какой шифр я должен использовать для шифрования дейтаграмм?

Я склоняюсь к финишу в режиме ECB. Я знаю, что в режиме ECB есть проблемы, но мне нужно поддерживать отсутствующие пакеты, поэтому шифрование не может основываться на предыдущих блоках. Есть ли лучший шифр или режим, который я могу использовать, чтобы уменьшить проблемы с режимом ECB и по-прежнему учитывать пропущенные пакеты?

(Я хотел бы сохранить все в чистом Java, поэтому я не могу использовать DTLS.)

3 ответа

Решение

Вы можете использовать режим CBC, вам просто нужно зашифровать каждый пакет как отдельный поток CBC. Это означает, что CBC перезапускает каждый пакет со свежим IV.

Кстати, Blowfish - это всего лишь 64-битный (размер блока) блочный шифр, что в наши дни присуще ему довольно низким пределом безопасности.

AES в режиме счетчика (CTR) является возможным вариантом. При установлении соединения вы запускаете счетчик со случайно выбранного значения, известного как отправляющей, так и принимающей программе. Если каждый пакет видеоданных содержит порядковый номер (n), достаточно длинный, чтобы не повторяться в пределах одного соединения, принимающая программа может добавить его к начальному значению счетчика, чтобы получить значение счетчика, используемого для шифрования этого пакета.

Конечно, для сообщений длиннее одного блока вам нужно будет увеличить счетчик более одного раза в пакете. Я бы определил, сколько блоков будет иметь самый длинный передаваемый пакет, например, 16 блоков, и использовал бы значения счетчиков. 16*n для первого блока в пакете, 16*n+1 для второго и тд.

ECB открыт для атаки, потому что каждый зашифрованный блок совершенно независим от всех остальных, что позволяет как сделать выводы о содержании зашифрованного текста, заметив, что некоторые два (или более) блока шифра идентичны, так и необнаружимо изменить сообщение, переставив блоки шифрования или замена блоков шифра из других сообщений, зашифрованных с использованием того же ключа (что само по себе не очень хорошая идея).

Если ваши UDP-пакеты содержат некоторую информацию о последовательности, вы можете использовать ее в качестве счетчика в режиме CTR или в режиме XEX (или XTS). XEX был разработан для ситуаций шифрования, в которых шифрование данных, возможно, придется выполнять в произвольном порядке блоков, как в случае с зашифрованными устройствами с произвольным доступом, такими как жесткие диски, и было бы идеально для такой ситуации, как ваша.

См. http://en.wikipedia.org/wiki/Disk_encryption_theory

Другие вопросы по тегам