Транспортные протоколы I2P были разработаны почти 15 лет назад, когда основной целью было сокрытие содержимого трафика, а не факта использования того или иного протокола.
Никто тогда не учитывал DPI (глубокую проверку пакетов) и блокировку трафика.
Однако времена меняются, и хотя существующие протоколы I2P по-прежнему достаточно безопасны, существует потребность в новом транспортном протоколе, реагирующем на существующие и будущие угрозы, и, в первую очередь, DPI, анализирующем длину пакетов.
Кроме того, новый протокол использует последние достижения в области криптографии.
Полное описание протокола Здесь .
На основе Шум , который использует SHA256 в качестве хэш-функции и x25519 в качестве DH (в терминологии Noise).
Новая криптография
Для NTCP2, помимо уже существующих в I2P, необходимо реализовать следующие криптографические алгоритмы:- х25519
- HMAC-SHA256
- Чача20
- Поли1305
- АЕАД
- Сифаш
Для совместимости с openssl 1.0.2, который включен в большинство используемых в настоящее время операционных систем, в i2pd были добавлены собственные реализации, написанные одним из разработчиков i2pd. Джефф Беккер -om, известный в I2P как psi. По сравнению с NTCP, x25519 заменяет DH, AEAD/Chaha20/Poly1305 заменяет AES-256-CBC/Adler32, а Siphash используется для шифрования длины передаваемых сообщений.
Процедура вычисления открытого ключа стала более сложной из-за большого количества вызовов HMAC-SHA256.
Изменения в информации о маршрутизаторе
Для работы по протоколу NTCP2 помимо двух существующих ключей (шифрования и подписи) вводится третий ключ x25519, называемый статическим ключом, который должен присутствовать в некотором адресе RouterInfo в качестве параметра «s» как для клиентов, так и для серверы.Если NTCP2 поддерживает более одного адреса, например ipv4 и ipv6, то «s» везде должен быть одинаковым.
Для клиентов адрес может содержать только «s» и не содержать параметры «host» и «port».
Также обязательным параметром NTCP2 является «v», который в настоящее время всегда равен «2».
Адрес NTCP2 может быть указан как адрес типа «NTCP» с дополнительными параметрами – в этом случае соединение может быть установлено как по NTCP, так и по NTCP2, или как адрес типа «NTCP2», поддерживающий только соединения NTCP2. Java I2P использует первый метод, i2pd — второй.
Если узел принимает входящие соединения NTCP2, то он должен опубликовать параметр «i» со значением IV для шифрования открытого ключа при установлении соединения.
Установление соединения
В процессе установления соединения стороны генерируют пары временных ключей x25519 и на основе них и статических ключей рассчитывают наборы ключей для передачи данных.Он также проверяет подлинность статических ключей и сопоставляет содержимое RouterInfo. Стороны обмениваются тремя сообщениями: Запрос сеанса --------------------> < — SessionCreated Сеанс подтвержден ------------------> для каждого из которых рассчитывается общий ключ x25519, называемый «материал входного ключа», а затем с помощью операции MixKey генерируется ключ шифрования сообщения, при этом значение ck (ключ цепочки) сохраняется между сообщениями и является результатом, на основе которого ключи для передачи данных рассчитываются .
Реализация MixKey выглядит примерно так: Код MixKey
Теги: #i2p #C++ #openssl #dpi #криптография #криптография #i2pvoid NTCP2Establisher::MixKey (const uint8_t * inputKeyMaterial, uint8_t * derived) {
-
Отличные Оправдания От Техподдержки Хостинга
19 Oct, 24 -
Конфликт С Вебмани.
19 Oct, 24