Эта задача приносит 200 баллов за первый ответ и остается непобедимым не менее 3 дней.Заявлено пользователем 3080953 .
В последнее время много говорят о сквозном шифровании и о том, что компании вынуждены удалять его из своих продуктов. Меня не интересуют правды и неправды этого, но я задавался вопросом: насколько коротким может быть код, который заставит компанию не использовать его?
Задача здесь состоит в том, чтобы реализовать обмен ключами Диффи-Хеллмана между двумя сетевыми системами, а затем позволить пользователям обмениваться данными с использованием сгенерированного симметричного ключа. Для выполнения этой задачи никакие другие средства защиты не требуются (например, нет необходимости циклически переключать ключ, проверять идентификационные данные, защищать от DoS и т. Д.), И вы можете использовать открытый интернет (все прослушиваемые порты доступны для всех). Использование встроенных файлов разрешено и приветствуется!
Вы можете выбрать одну из двух моделей:
- Сервер и клиент: клиент подключается к серверу, затем сервер или клиент может отправлять сообщения другому. Третьи лица между ними не должны читать сообщения. Пример потока может быть:
- Пользователь А запускает сервер
- Пользователь B запускает клиент и направляет его на сервер пользователя A (например, через IP / порт), программа открывает соединение
- Программа пользователя А подтверждает соединение (опционально сначала запрашивая у пользователя согласие)
- Программа пользователя B начинает генерацию секрета DH и отправляет необходимые данные (открытый ключ, простой, генератор, все, что нужно вашей реализации) пользователю A
- Программа пользователя A использует отправленные данные для завершения генерации общего секрета и отправляет обратно необходимые данные (открытый ключ) пользователю B. С этого момента пользователь A может вводить сообщения (например, через stdin), которые будут зашифрованы и отправлены пользователю B (например, в стандартный вывод).
- Программа пользователя B завершает генерацию общего секрета. С этого момента пользователь B может отправлять сообщения пользователю A.
- Или: Сервер с двумя клиентами, подключенными к нему: каждый клиент общается с сервером, который пересылает свое сообщение другому клиенту. Сам сервер (и любые третьи стороны между ними) должен быть не в состоянии читать сообщения. Кроме начального соединения, процесс такой же, как описанный в первом варианте.
Подробные правила:
- Вы можете предоставить одну программу или несколько программ (например, сервер и клиент). Ваша оценка - это общий размер кода во всех программах.
- Ваша программа должна быть теоретически способна обмениваться данными по сети (но для тестирования подойдет localhost). Если выбранный вами язык не поддерживает работу в сети, вы можете объединить его с чем-то, что делает (например, сценарий оболочки); в этом случае ваш счет - это общий размер кода для всех используемых языков.
- Генерация ключей Диффи-Хеллмана может использовать жестко закодированные значения «p» и «g».
- Сгенерированный общий ключ должен быть не менее 1024 бит.
- Как только ключ используется совместно, выбор шифрования с симметричным ключом остается за вами, но вы не должны выбирать метод, который, как известно в настоящее время, имеет практическую атаку против него (например, смещение Цезаря тривиально, чтобы изменить его без знания ключа ). Пример разрешенных алгоритмов:
- AES (любой размер ключа)
- RC4 (теоретически сломан, но нет практических атак, о которых я могу упомянуть, поэтому здесь допустимо)
- Пользователи A и B должны иметь возможность отправлять друг другу сообщения (двусторонняя связь) в интерактивном режиме (например, чтение строк из стандартного ввода, постоянный запрос или такие события, как нажатие кнопки). Если это облегчает задачу, вы можете начать чередующийся разговор (т. Е. После того, как пользователь отправит сообщение, он должен дождаться ответа, прежде чем отправлять свое следующее сообщение).
- Язык встроенные команды не допускаются (нет необходимости писать свои собственные криптографические или сетевые методы , если они уже поддерживаются).
- Основной формат общения зависит от вас.
- Приведенные выше шаги связи приведены в качестве примера, но вы не обязаны им следовать (при условии, что необходимая информация передается, и посредники не могут рассчитать общий ключ или сообщения)
- Если детали, необходимые для подключения к вашему серверу, не известны заранее (например, если он прослушивает произвольный порт), эти данные должны быть напечатаны. Вы можете предположить, что IP-адрес машины известен.
- Обработка ошибок (например, неверные адреса, потерянные соединения и т. Д.) Не требуется.
- Задача состоит в коде гольфа, поэтому выигрывает самый короткий код в байтах.
p
иg
разрешено?