Реализация Нового Транспортного Протокола Ntcp2 Для Сети I2P.

Транспортные протоколы I2P были разработаны почти 15 лет назад, когда основной целью было сокрытие содержимого трафика, а не факта использования того или иного протокола.

Никто тогда не учитывал DPI (глубокую проверку пакетов) и блокировку трафика.

Однако времена меняются, и хотя существующие протоколы I2P по-прежнему достаточно безопасны, существует потребность в новом транспортном протоколе, реагирующем на существующие и будущие угрозы, и, в первую очередь, DPI, анализирующем длину пакетов.

Кроме того, новый протокол использует последние достижения в области криптографии.

Полное описание протокола Здесь .

На основе Шум , который использует SHA256 в качестве хэш-функции и x25519 в качестве DH (в терминологии Noise).



Реализация нового транспортного протокола NTCP2 для сети I2P.



Новая криптография

Для NTCP2, помимо уже существующих в I2P, необходимо реализовать следующие криптографические алгоритмы:
  • х25519
  • HMAC-SHA256
  • Чача20
  • Поли1305
  • АЕАД
  • Сифаш
Все они, за исключением Siphash, реализованы в openssl 1.1.0. В свою очередь, Siphash появится в openssl 1.1.1, который выйдет в ближайшее время.

Для совместимости с 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

   

void NTCP2Establisher::MixKey (const uint8_t * inputKeyMaterial, uint8_t * derived) {

Теги: #i2p #C++ #openssl #dpi #криптография #криптография #i2p
Вместе с данным постом часто просматривают:

Автор Статьи


Зарегистрирован: 2019-12-10 15:07:06
Баллов опыта: 0
Всего постов на сайте: 0
Всего комментарий на сайте: 0
Dima Manisha

Dima Manisha

Эксперт Wmlog. Профессиональный веб-мастер, SEO-специалист, дизайнер, маркетолог и интернет-предприниматель.