Класс для общения с BOB в I2P на C#

Таки буду краток, как говаривал один небезызвестный дядя.

В общем, есть в I2P такая чудная приблуда как BOB — Basic Open Bridge. Протокол сей позволяет создавать/уничтожать I2P тоннели с заданными параметрами. Фактически, вы создаёте точку подключения для своего приложения — например 127.0.0.1:12345 — и работаете с ней как с обычным сетевым адресом, посредством тех же сокетов. Проблема в том, что для инициализации тоннеля надо отправить несколько команд на адрес 127.0.0.1:2827. Протокол текстовый, достаточно простой и в целом удобный… Но для прикладных программ надо ещё проще :)

В результате на C# был написан класс-посредник, позволяющий создавать тоннели i2p в своей программе, не задумываясь над реализацией обмена, работающий вот так:

CBob bob = new CBob();
CBob.DataForCreateTonnel data = new CBob.DataForCreateTonnel();
// Можно задавать, можно не задавать - тогда автоматически сгенерируется
// data.nickTonnel = "abrahas";
data.inHost = "localhost";
data.inPort = 12345;
data.inboundLength = 3;
data.inboundLengthVariance = 2;
data.inboundAllowZeroHop = "false";
data.outHost = "localhost";
data.outPort = 44010;
data.outboundLength = 3;
data.outboundLengthVariance = 2;
data.outboundAllowZeroHop = "false";
bob.SendTonnelOptions(data);
bob.StartTonnel();

Т.е. он позволяет создавать тоннель десятком строчек и не заботиться о внутренней реализации на сокетах. Кстати по поводу внутренней реализации — там использована асинхронная отправка-получение команд-ответов. И очень сильно сырой код — аффтар не пишет постоянно на C#. Код правда документирован, по мере возможностей. Любые улучшения, замечания,  и прочее — приветствуется.

Соответственно ссылка на скачивание: http://www.shpargalko.com/files/CBob.zip

Это документация по BOB: http://www.i2p2.de/bob.html

А это полезная ссылка по I2CP: http://www.i2p2.de/i2cp

Автор

Алекс Разгибалов

Сумасшедший мужчина, неопределённого возраста, наслаждающийся манией преследования. Паталогически недоверчив, эгоистичен, авторитарен. Вторичные диагнозы - программист и поц. Владеет английским языком на уровне около хренового разговорного. Также знаком с некоторыми другими языками. Интересуется всем и вся, за счёт чего в любой области знания являются поверхностными, неглубокими. Характер невыдержанный. Крепость - 55 градусов.

Класс для общения с BOB в I2P на C#: 7 комментариев

  1. Вопрос немного не по теме, но по направлению (тоже про анонимность и C#).

    Подскажите есть что-то подобное на C# для Tor?
    Хочется использовать Tor в своей программе и что бы не требовалось установки дополнительных компонент.

    Буду благодарен за любую информацию по теме.

    1. Ну, в любом случае вам придётся включать в пакет поставки сам tor — в стандартном виде, или собственную сборку, не так важно. Тут есть два пути — либо юзер ставит две программы — вашу и пакет vidalia bundle раздельно, либо они ставятся одним вашим инсталлятором. Разница не принципиальна — т.е. фактически основное требование — иметь точку для коннекта на компьютере. А затем — в C# сетевые компоненты спокойно смогут работать через прокси, который предоставляет tor. Т.е. скажем, можно задать глобальный прокси 127.0.0.1:8118 для http запросов путём применения класса WebProxy & GlobalProxySelection — по сути, если я понимаю всё верно, работа с тор намного проще — не надо задавать параметры тоннелей и прочего — он сам об этом заботится.

      Вообще, на stack overflow это описано немного… Вот: http://stackoverflow.com/questions/1962483/c-using-tor-as-proxy или вот: http://stackoverflow.com/questions/2745268/how-to-use-tor-control-protocol-in-c — там информация кое какая по этому вопросу есть.

  2. Спасибо за подробный ответ.

    >юзер ставит две программы – вашу и пакет vidalia bundle
    Вот как раз не хочу использовать vidalia.

    >включать в пакет поставки сам tor – в стандартном виде, >или собственную сборку
    существуют «собственные сборки» на .Net

  3. Правильно я понимаю, что использовать BOB можно только для исходящих соединений? Как организовать анонимный сервер на c#? SAM дает какие либо преимущества?

    1. Так BOB по сути это расширенный SAM. Вот смотрите — и BOB и SAM — это интерфейсы создания тоннелей. А с их помощью можно сделать тоннель и серверный и клиентский. По большому счёту это просто системы команд. Когда вы тоннель сделали, можно отправлять в него данные и принимать из него же, просто софт который будет вести обмен, станет пересылать в тоннель созданный (допустим 127.0.0.1:48000) данные вида:

      BASE64_ADDRESSAAAA\n

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

      DESTINATION_BASE64AAAA\n
      «PACKET»:{«address»:»BASE64_BACK_ADDRESSAAAA»},{«DATA»:»BASE64Encoded»}

      — что-то вроде формата JSON.

  4. Сори за нубовый вопрос. А в примере каким образом отослать данные? На этой расстановке параметров работа с i2p закончена, получается? И теперь мы просто через сокеты отправляем на localhost 12345 (inbound) адрес base64/base32 или site.i2p из адресной книги, а затем свои данные. И ответы приходят нам от туда же?
    А на сервере, получается, слушаем outbound на localhost 44010?? И туда же отправляем ответы?

    1. В общем и целом да. Честно говоря, я очень давно писал этот классик и не очень хорошо помню, что там где)) Вообще, можно и напрямую с BOB работать, это просто обвязка. И вы можете указывать любой доступный B64 адрес, т.е. не обязательно из адресной книги — просто точку назначения.
      Плюс смотря для каких целей. Если это надо именно на C#, то да, лучше samv3 / BOB. А если писать на java, то там есть уже готовая (и обновляемая авторами) Streamr Lib :)

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Собирать идеально - не обязательно, просто приблизительно соберите картинку (должен быть включен JavaScript).WordPress CAPTCHA