Эта задача приносит 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
разрешено?Ответы:
Node.js (
372423 + 94 = 517513 байт)Golfed
Добавлены разрывы строк для «читабельности».
chat.js (
423419 байт)Без разрывов строк
Разрывы строк
echo_server.js (94 байта)
Ungolfed
Узел имеет встроенные сетевые и криптографические возможности. Это использует TCP для работы в сети (потому что это проще, чем интерфейс Node для HTTP, и он прекрасно работает с потоками).
Я использую потоковый шифр (RC4) вместо AES, чтобы избежать необходимости иметь дело с размерами блоков. Википедия, похоже, считает, что она может быть уязвимой, поэтому, если у кого-то есть понимание того, какие шифры предпочтительнее, это было бы здорово.
Запустите эхо-сервер
node echo_server.js
который будет прослушивать порт 9. Запустите два экземпляра этой программы с помощьюnode chat.js <server IP>
иnode chat.js <server IP> 1
(последний аргумент просто устанавливает, какой из них отправляет простое число). Каждый экземпляр подключается к эхо-серверу. Первое сообщение обрабатывает генерацию ключа, а последующие сообщения используют потоковый шифр.Эхо-сервер просто отправляет все обратно всем подключенным клиентам, кроме оригинала.
клиент
Эхо сервер
Спасибо Дейву за все советы + отзывы!
источник
Node.js,
638607 байтТеперь, когда это было хорошо и действительно побеждено (и на том же языке), вот мой тестовый ответ:
Или с упаковкой:
использование
Это реализация сервер / клиент; одним экземпляром будет сервер, а другим - клиент. Сервер запускается с определенным портом, затем клиент указывает на порт сервера. Для настройки DH может потребоваться несколько секунд, если на вашей машине низкий уровень энтропии, поэтому первые сообщения могут быть немного задержаны.
Сломать
Единственное требование к токенам состоит в том, чтобы они содержали хотя бы один не шестнадцатеричный символ, поэтому в минимизированном коде используются другие строковые константы (
data
иhex
).источник