Скромный крипточатик

Аватара пользователя
dr.Faust
Член КРК
Член КРК
Сообщения: 48
Зарегистрирован: 21 окт 2013, 22:25

Скромный крипточатик

07 ноя 2013, 02:56

Сложно понять куда добавить эту тему... но добавлю пока сюда. Речь пойдет о безопасности, защите переписки и анонимности в сети. Точнее об одной маленькой идеи из обалсти онлайн общения.
Появилась идея крипточата основная задача которого сделать общение внутри безопасным и анонимным. Всё это в вэбе, т.е. прямо в браузере. Без участия в вопросах безопасности сервера и без авторизации на нем.
Т.е. нечто вроде IRC, но примитивнее (хотя казалось бы куда уж...), однако с тотальным шифрованием на стороне клиента.

Идея простыми словами:

Серверная часть:
Есть сервер который умеет следующее - принимать от пользователя произвольную строку и некоторый индентификатор. Сохрнять все это у себя.
Получив запрос содержащий индентификатор, вываливать пользователю все строки с этим индентификатором.
Всё.

Клиентская часть:
Тут немного сложнее. Но только немного. Клиентская часть должно уметь получить все сообщения по индентификатору (назовем его пока каналом) и попытаться их дешифровать. Далее выбросить все сообщения которые дешфировать не удалось и вывести в чатик сообщения которые удачно дешифровались (т.е. были отправлены и зашифрованы тем же ключом/паролем - пусть это пока одно и то-же). Так же клиенская часть должна уметь зашифровать сообщение и отправить его на сервер. Внешен выглядит не очень сложно.

На практике:
Алиса хочет пообщаться с Бобом. Она сообщает ему имя канала (индентификатор) и пароль (пока это то же что и ключ) по некоему, пологаемому надежным, каналу (не надо бросать в меня тухлыми яйцами - к этому вопросу мы чуть позже вернемся) - пусть по SMS. Ева хочет подслушать беседу Алисы с тем с кем она хочет поговорить и установить личность её респондента, но не имеет доступа к каналу обмена ключом (еще раз - к этому вернемся), однако может перехватывать трафик от Алисы к серверу.
Алиса и Боб заходят на сервер, выбирают канал общения и вводят условленный пароль. Алиса пишет Бобу: "Тук-тук, нео..." сообещение шифруется общим для Алисы и Боба ключом и посылается на сервер. Конечно у Евы есть доступ к запросу Алисы, ведь злая Ева получила SSL ключи. Она перехватывает запрос и узнает канал в котором общается Алиса и Боб (то что это Боб Ева еще не знает). Ева сама подключается к каналу вводит случайный пароль и получает все сообщения канала, в том числе и сообщение отправленное Алисой и ответ Боба ... а так же еще 100500 сообщений от over9000 исламистов которые общаются на этом же канале, но со своими паролями (скажем они разделены на 99 групп у каждой из которых свой пароль). Алиса последовательно дешифрует все 100502 сообщения своим ключом. 100500 сообщений превращаются при этом в неудобоворимый бред и выбрасываются - два сообщения которые были зашифрованы ключом Алисы ("Тук-тук, нео..." и "Ты чего, пьяная чтоле?" - ответ Боба) похожи на содержащие какой-то смысл и их Алиса и видит. Ева же видит лишь сообщение Алисы, поскольку перехватила его при отправке и 100501 сообщение, из которых невозможно понять сколько адресованы Алисе, а сколько другим людям, не дешифровав их. Т.е. из полученных данных Ева даже не может понять с кем именно из исламистов ведет переписку Алиса. Для атаки на ключ Еве остается коллекционировать только отправляемые Алисой сообщения... однако Алиса не глупая девочка и поэтому ее клиент переодически генерирует рандомные строки и зашифровав их рандомным паролем так же отправляет на сервер под видом сообщений Алисы - эти сообщения не будут дешифрованы и превратятся в еще одну волну мусора погребая под собой крупицы дыанных. В итоге через полчаса когда Алиса и Боб перекинулись десятком сообщений, Ева имеет 1000000 сообщений, 999990 либо является бессмыслецей, либо обрывками чужих бесед. И около 2-3 десятков сообщений отправленных Алисой, но только половина из них действительно сообщения - остальные полный тотальный мусор.

Ева негадуе:
Единственный для Евы вариант теперь это перехват пароля при отправке его Алисой в зщищенном канале. Так как перебор решить на основании флуда уровнение обратное Blowfish (Алиса и Боб использовали имено его) нет никаких шансов. Нет надежды даже на радужные таблицы и прочие приемчики сокращения времени перебора. Ева идет к прокурору и заплатив ему по тарифу 3000$ ставит телефон Алисы на прослушку... получает пароль и все тут же читает. Нет, так дело не пойдет - Алиса и Боб к этому времени проапгрейделись и после стандартного приветствия с упоминанием Тринити и алкоголиков обменялись сообщниями содержащими открыты части ключей в схеме Диффи-Хэлмана. Проапдейтили свой пароль и болтают не боясь быть прослушанными.

Это как бы в идеале.

Теперь давайте посмотрим, что на самом деле. Реализуема ли подобная схема вообще? Хватит ли ресурсов современного компьютера и браузера (все шифрование необходимо выполнить в нем на js) для обслуживания скажем 200-300 сообщений в секунду (мы полагаем что все в канале будут писать по сообщению в секунду и их там будет хотя бы человек 100).
Отвечаю - да хватит. У нас уже есть работающий прототип (назовем его пре-альфа версией) который на моей машине, в самом медленном браузере в обработке js показывает результат около 1500-2000 сообщений в секунду, это учитывая не только дешифровку, но и шифрование. Сегодня в этом прототипе даже удалось пообщаться.

Что реализовано в прототипе:
Да практически все кроме схемы Диффи-Хэлмана и флуда со стороны клиента. Последнее крайне просто. Первое требует определённых усилий. Пока хотелось бы услышать критику самой идеи, кроме необоснованных выкриков "ненужно" (обоснованные принимаются). А так же свежих предложений по теме. Особенно интересен обмен ключами.

P.S.
Сообщение получилось слишком длинным и хотя я собирался выложить тех.документацию по существующей реализации, я уже вижу, что даже сюда не каждый дочитает. А выкладывать ссылку на прототип пока не стану так как нет документации. Решить этот вопрос попробую в ближайшие 2-3 дня.
Аватара пользователя
ratiomaster
Администратор
Администратор
Откуда: Москва
Сообщения: 138
Зарегистрирован: 01 окт 2013, 00:03

Re: Скромный крипточатик

07 ноя 2013, 06:12

Вкусная тема

Изображение
Долой авторовладение!
Аватара пользователя
vk
Администратор
Администратор
Откуда: Ханты-Мансийский автономный округ - Югра
Сообщения: 660
Зарегистрирован: 06 окт 2013, 00:48

Re: Скромный крипточатик

07 ноя 2013, 14:23

Так-то тема интересная.
Но основной вопрос таков - если есть какой-то первичный надежный канал передачи (для пароля), то почему не передать по этому каналу полноценный открытый ключ? И что насчет PGP/GPG?
Аватара пользователя
mva
Администратор
Администратор
Откуда: Томская область
Сообщения: 108
Зарегистрирован: 29 сен 2013, 20:08

Re: Скромный крипточатик

07 ноя 2013, 14:59

1) ТС, почему не p2p?
2) vk, PGP не имеет условия обмена подключами. Его можно использовать только как наружний канал а-ля SSL и для подписи.
Таким образом PGP+OTR (или PGP+zRTP для SIP'а) — самое то. Только оверхед не сказать бы, что маленький.
Аватара пользователя
ChooJoy
Администратор
Администратор
Контактная информация:
Откуда: Москва
Сообщения: 324
Зарегистрирован: 20 окт 2013, 14:39

Re: Скромный крипточатик

07 ноя 2013, 17:37

Не p2p видимо потому, что адресация. А тут адресации нет.
Аватара пользователя
mva
Администратор
Администратор
Откуда: Томская область
Сообщения: 108
Зарегистрирован: 29 сен 2013, 20:08

Re: Скромный крипточатик

07 ноя 2013, 17:39

Ты думаешь, в p2p-сети невозможно сделать бродкаст? :)

Кстати, какая редиска постоянно ковыряется в админке и то сессии уменьшает, то редактор из быстрой формы убирает?...
Аватара пользователя
dr.Faust
Член КРК
Член КРК
Сообщения: 48
Зарегистрирован: 21 окт 2013, 22:25

Re: Скромный крипточатик

07 ноя 2013, 17:42

[quote="mva"]
Ты думаешь, в p2p-сети невозможно сделать бродкаст? :)
[/quote]
Наверно можно, но я не вижу как реализовать это в браузере. И вообще не вижу как можно это прикрутить сюда...
Можешь чуть подробнее?
Аватара пользователя
dr.Faust
Член КРК
Член КРК
Сообщения: 48
Зарегистрирован: 21 окт 2013, 22:25

Re: Скромный крипточатик

11 ноя 2013, 04:59

Друзья, работа немного выбила из колеи, но я все же выложу хоть в каком-то виде то что обещал чтобы дискуссия не затухала...
Итак, идем сюда - https://theftbase.oceansites.ru/cryptochat/
Спросит пароль - вводим 0. Вы должны увидеть одно сообщения (Привет! ;)) от участника u_62775841 (это я).
И так, как работает то что уже есть:
Ну вам подгружается простенькая страница-шаблона и скрипты.
По порядку:
const.js - ну там предполагались "константы", но пока их только две.
libs.js - в этом файле скрипты написанные не мной, именно поэтому он единственный на что можно смотреть без слез - здесь сама библа Блоуфиш и конвертов в base64
utils.js - функции обвязки непосредственно шифрования
scripts.js - скрипты взаимодействующие с DOM и действиями пользователя. Внешний интерфейс если хотите
test.js - тесты, совсем простенькие.

В конце страницы подключается init.js - тоже думаю понятно что это - они инициализирует начальную работу чата + тут две функции которые конектятся к серваку.
Начинает исполняться init - первым делом выполняется простенький автотест кодирования/декодирования.
Дальше считываются сохраненные у пользователя его ID и последний канал (эти данные сохраняются в локалсторадж браузера), если их нет канал устанавливается в nullchan и генерится случайный id.
Далее запрашивается пароль и если он вводится то на сервер отправляется первый запрос за содержимым канала. Пользователю сбрасывается все содержимое канала. Это набор сообщений в строках без всякого там JSONа и т.п. и ID последнего переданного сообщения - далее клиент должен его передавать при каждом запросе чтоб не перекачивать всю ленту.
Все полученные сообщения дешифруются и если это не удалось выбрасываются. Дешифрованные добавляются в ленту. В частности с паролем 0 на этом канале вы получите минимум 2 сообщения которые будут выброшены при дешифровке. В этом смысл крипторазделения комнат в канале.
Вобщем назовем пока множество сообщений в канале которые можно дешифровать одним паролем "криптокомнатой чата". Для понятности.
Что нам дает криптокомната? Она дает возможность скрыть не только содержимое переписки, но и делает невозможным понять с кем именно общается человек в данном канале, без дешифровки сообщений. А сделать это не зная пароля крайне не просто учитывая что шифрование ведется неплохим блочным шифром, малый объём шифротекста и большое количество помех. Предположительно клиентская часть может спокойно обрабатывать до 500 соощений в секунду практически на любом компьютере. Если мы будем считать, что в канале общается 1000 человек попарно в 500 разных криптокомнататх и отправляют по 1 сообщению каждые 2 сек. то в этом случае, при атаке на одну пару общающихся мы получим 499 кратное превышение количества мусорных сообщений над полезной для нас информацией. Причем этот мусор не так-то просто отделить. Не зная ни одного из 500 паролей.
Единственным уязвимым местом для нас является пароль который мы вынуждены передать по открытому каналу.  Очевидно это очень серьёзная уязвимость. И тут я хочу использовать алгоритм Диффи-Хэлмана для реализации функционала "запирания комнат".
Как это будет выглядеть для пользователя... Войдя в комнату по паролю, он будет видеть сообщение о том что комната не заперта, что означает что в нее может войти любой знающий пароль. Кроме того он будет видеть всех вошедших в комнату. Далее пользователь может нажать кнопочку Закрыть конмату и когда все в ней находящиеся сделают тоже самое комната станет более неприступной ни для кого, кто в ней остался.
На техуровне это должно выглядить так - каждый раз когда вы заходите в комнату, ваш клиент отправляет открытую часть вашего ключа DH в специальном сообщении, которое не выводится на экран, а запоминается на всех остальных клиентах. Далее нам остается на каждом клиенте собать все открытые ключи и с помощью своей секретной части вычислить новый пароль комнаты и переключиться на него как только будет нажата кнопка Запереть комнату.
Вроде всё по этой части.
Описания процесса шифрования есть в скриптах, но я скопирую его сюда, чтобы было понятно как мы передаем id пользователя внутри сообщения и понимаем что сообщение расшифровано правильно:
// Алгоритм шифрования:
//  Преобразовываем текст в Base64 (самый простой способ избавится от всех "неожиданных" символов в тектсе)
//  Генерируем хэш длинной до 7 знаков: [-]CRC32 в системе по основанию 36 (хэш нужен как раз для того чтобы проверить корректность дешифровки)
//  Дополняем хэш до 8 знаков случайными символами (имеем в кадждом сообщении ~1-2 байта соли - просто для того чтобы хэш было удобно отрезать при дешифровке, надо чтобы он имел постоянную длину)
//  Интегрируем в тело сообщение индентификатор пользователя отделяя его разделителями в случайноем место (т.е. индентификатор вставляем в случайное место, отделяя его в текущей версии ":" - двоеточия не может быть ни в индентификаторе, ни в хэше, ни в сообщение - оно переведно в base64 как мы помним)
//          начиная с позиции 2 и до позиции end-1, функцией injectUserId
//  Добавляем хэш в начало тела сообщения (в начало просто для того, чтобы рассеить байты соли по всему сообщению - не забываем что bf блочный)
//  Дополняем сообщение случайными символами до длинны кратной 8 байтам (я обнаружил что текущая реализация плохо работает с сообщением не кратным блоку итерации - не проблема ;) )
//  Шифрумем сообщение функцией _crypt:
//      Это по сути сейчас просто обертка для bf
// Шифротекст

Очевидно дешифровака проходит в обратной последовательности.

О развертывании ключа:
Ключ в данной реализации bf развертывается совсем хреново - простым повторением до длины 56 байт. Кто помнит как работает bf сразу поймет что пароли 8 и 888 развернуться в 56 восьмерок и по сути дадут одинаковый ключ шифрования. Что плохо.

Поэтому я делаю предварительное преобразование пароля. Тут легко понять что достаточно дописать ключу длину и мы избавимся от коллизий. Я сделал так: Pass.length+Pass+getHash(Pass) - те в начало добавляю дину, а в конец хэш вычисляемый так же как и для соощения. Думаю всем понятно что так развернутый пароль не слабее чем исходный в подавляющем большинстве случаев. Но всегда можно переписать так - Pass+Pass.length+getHash(Pass) - в данном виде он будет не слабее чем исходный во всех случаях.
denya
Член Партии
Член Партии
Откуда: Красноярский край
Сообщения: 17
Зарегистрирован: 12 ноя 2013, 16:05

Re: Скромный крипточатик

12 ноя 2013, 16:11

Вечер в хату, криптоны!

Пришёл сказать что всё уже придумано до нас! Сегодня исполняется 1 год со дня создания http://ru.wikipedia.org/wiki/Bitmessage

========================
Bitmessage — децентрализованная P2P система обмена электронными сообщениями с открытым исходным кодом, которая позволяет пользователю Bitmessage отправлять зашифрованные сообщения другим пользователям системы аналогично электронной почте. Сеть Bitmessage сходна с сетью Bitcoin, тем, что опирается на криптографию и жертвует некоторым удобством ради безопасности и децентрализации, однако она предназначена для задачи пересылки сообщений, а не денежных транзакций. Сеть получила резкий всплеск популярности[2] после разглашений Эдварда Сноудена о системе тайного слежения за интернет-пользователями PRISM.
В данный момент, сеть Bitmessage обрабатывает несколько тысяч частных сообщений в день[3].


[...]

[size=0.7em]Начиная с версии 0.3.5, Bitmessage протокол поддерживает децентрализованные анонимные группы общения, называемые chan. В отличие от обычных тематических электронных рассылок, использующих электронную почту:[/size][size=0.7em]внутри chan сообщения пользователей анонимны в такой степени, что неизвестен ни Bitmessage адрес получателя, ни Bitmessage адрес отправителя.[/size]
  • [size=0.7em]chan невозможно отключить, убрав какой-либо центральный сервер или группу серверов, благодаря полной децентрализованности сети.[/size]
  • [size=0.7em]chan невозможно подвергнуть цензуре, поскольку для того, чтобы знать криптографические ключи к chan, достаточно знать лишь имя chan. Таким образом, любой пользователь Bitmessage, знающий имя рассылки, может анонимно читать chan и анонимно отправлять новые сообщения в chan.[/size]
  • [size=0.7em]любой пользователь Bitmessage может создать свой собственный chan, просто придумав имя и поделившись этим именем с приглашенными им пользователями.[/size]
  • ========================
    • пользуюсь этой штукой ежедневно - замечательно работает! и будет продолжать работать даже если любые пиратские серверы будут взяты в плен или арестованы

      пусть этот чан будет официальным русским пиратским чаном в BitMessage:
    • BM-2cXb3xnokUYaGr6id1L3fYBZLY2LrpES91

    [/li]
Последний раз редактировалось denya 12 ноя 2013, 16:47, всего редактировалось 1 раз.
Аватара пользователя
Temych
Супермодератор
Супермодератор
Контактная информация:
Откуда: Московская область
Сообщения: 3484
Зарегистрирован: 20 окт 2013, 16:30

Re: Скромный крипточатик

17 ноя 2013, 19:11

может ламерский вопрос - а криптокэта нельзя для наших целей нарастить?
довольно френдли и удобный крипточатик, одним кликом по плагину))
Аватара пользователя
in_spector
Член Партии
Член Партии
Откуда: Новосибирская область
Сообщения: 12
Зарегистрирован: 21 окт 2013, 17:25

Re: Скромный крипточатик

17 фев 2014, 06:39

А кто-нибудь из этой ветки форума разбирается в i2p? К слову о децентрализованном интернете и крипте
Аватара пользователя
aka_Kerber
Член Партии
Член Партии
Откуда: Санкт-Петербург
Сообщения: 10
Зарегистрирован: 21 окт 2013, 17:56

Re: Скромный крипточатик

17 фев 2014, 23:55

Собственно было бы не плохо иметь пиратский чат собственного производства)
Аватара пользователя
dr.Faust
Член КРК
Член КРК
Сообщения: 48
Зарегистрирован: 21 окт 2013, 22:25

Re: Скромный крипточатик

01 мар 2014, 04:26

[quote="aka_Kerber"]
Собственно было бы не плохо иметь пиратский чат собственного производства)
[/quote]
Я работаю над этим. Можешь помочь?

Вернуться в «Обсуждение текущих вопросов»