✏️ ️Посты 🌍 Путешествия Подписаться 👍 Донат
🔍
👤
End-to-end Шифрование
Как мы перестали доверять облакам и научились шифровать
29 января 2025 — 46 комментариев — 14322 просмотра — 4032 слова

Итак, знакомая всем ситуация: вы возжелали послать своему другу свежий мем из вашей редкой коллекции. Вы открываете ваш любимый мессенджер, находите ваш общий чатик с ним и...

В это время ваш любимый мессенджер идет куда-то на сервер где-то в облаках Амазона или Микрософта, читает из базы данных всю вашу переписку и показывает вам чат.

Вы прикрепляете свой мем и отправляете его туда же на сервер, который всё честно сохраняет и немедленно присылает вашему другу пуш-уведомление, что пришло время насладиться топ-контентом.

Так работает любой классический чатик в интернете последние три тысячи лет. Даже у выпускника курсов «Изучаем Python за 21 секунду в формате Ютюб Шортс» написать такой чат-сервер и чат-клиент займёт максимум один вечер и пара баночек светлого.

Да, я опустил детали, что на самом деле между вами и сервером в этот момент тоже устанавливается шифрованное соединение через SSL, а для отсылки пушей нужна гора криптографических подписей по Device ID — сути это не меняет.

Важно то, что загруженный вами мемасик оказался настолько нелегально кековым, что вы оба присели на двушечку или вам поблокировали все соцсети, потому что очередной президент вашей страны запретил пропаганду мемов, ЛГБТ или атомных электростанций — я уж не знаю где вы там живете.

Добро пожаловать в дивный новый интернет. Вы больше не решаете какие мемы слать своим друзьям. Всё за вас решила та бабушка из деревни, которая голосовала за консервативную партию, которой интернет ваш нахер не нужон.

Потому настоящие мужчины и дiвчинi, яки шарят за рил всратые мемасяны, выбирают в end-to-end encryption, peer-to-peer, DHT-дискавери и прочий селфхостинг.

Но так как мы с вами давно потеряли возможность концентрировать внимание на лонгридах длиннее 13 слов, в этом посте я пройдусь только по end-to-end части, а остальные потом подлинкую сюда, если кому-то внезапно будет интересно.



2 комментария
79
Anton

внезапно стало интересно

17
PelkiųRagana

Больно видеть отстающее на десятилетия от реальности восприятие. В XXI веке разве не бабушки, помнящие свободу и научно-технический прогресс голосуют за консерваторов, обещающих вернуть свободу и научно-технический прогресс? Разве не прогрессивная молодежь голосует за прогрессивные идеи плановой экономики и тотальной цензуры?

Итак. Современные поцаны и поцанэссы предпочитают шифровать свои данные через end-to-end encryption (E2EE). Не потому что страдания делают их смелыми и сексуальными (хотя и это тоже). Они молоды и прагматичны, потому понимают, что облака всё ещё дешманские и удобные для «неуверенных пользователей ПК», коих ща большинство.

Так что пока юзабилити «настоящего» peer-to-peer софта будет оставаться где-то на уровне кассетного магнитофона из 1988 года, от облаков нам не убежать. Надо уметь крутиться и наводить суету.

Хорошая же новость в том, что end-to-end шифрование как раз и придумали для того, чтобы передавать наши секретные мемы через незащищенные или недоверяемые каналы так, чтобы прочитать их смог только непосредственно их получатель. Как радиопереговоры.

Зашифровав нужные данные на одном конце, мы все еще может хранить их на неком сервере, то есть чужом кумплюктере, которому не доверяем. Да, мы всё еще не преисполнились магией peer-to-peer — она на нас снизойдёт только в следующей части, где мы обсудим как парламенты Германии и Франции обмениваются le мемами между собой через Matrix, так что подписывайтесь или как там щас говорят.

А сейчас представим себе, что мы хотим отправить другу Олегу свой всратый мем, но не хотим, чтобы кто-то, кроме Олега, смог над ним покекать. Сам Олег при этом находится за тысячу километров от нас, так что и по ИК-порту ему не скинуть.

Настало время немного погрузиться то, как вообще работает это ваше шифрование.



5 комментариев
5
Vladislav Onishchenko

Как радиопереговоры.

huh?

2
Nikita Ushakov

Вот да. Замечу, что радиопереговоры вообще примерно все открытые, есть некоторое подмножество с шифрованием канала - но никак не e2e

1
Ivan

Вот да. Замечу, что радиопереговоры вообще примерно все открытые, есть некоторое подмножество с шифрованием канала - но никак не e2e

Так в этом же и аналогия вроде, как все делать открытыми каналами, но чтоб никто не понял )

4
Вастрик

Под радиопереговорами имелись в виду не домашние рации, а профессиональные протоколы, которыми пользуется полиция, пожарные и военные, как например https://en.wikipedia.org/wiki/TETRA в Европе. Они шифрованные. "Полицейскую волну" тут просто так не поймать :(

3
Андрей Нефёдов

И вообще по ЗАКОНАМ радиопереговары нельзя частным лицам шифровать. А то триангулируют и заберут. TETRA кстати так себе, как и всё что сделано через одно место для публичного сектора https://media.ccc.de/v/37c3-11761-all_cops_are_broadcasting

Мы уже однажды рассматривали асимметричное шифрование, с его «публичными» и «приватными» ключами, в старом посте про Блокчейн, но его никто уже не помнит, так что разберём всё заново.

Всё современное шифрование можно поделить на симметричное (AES) и асимметричное (RSA). Симметричное понять довольно просто — мы с Олегом заранее договариваемся иметь некий секретный ключ, которым можем как зашифровать, так и расшифровать любое сообщение. Примерно как если бы у нас были ключ от одной и той же квартиры и мы оба могли в любой момент в нее прийти забухать.

Проблема симметричного шифрования в том, что нам же нужно как-то передать этот ключ друг другу, га?

И если в случае с ключами от квартиры мы можем встретиться с Олегом в тихой подворотне и передать ключи из рук в руки, то в диком интернете у нас нет ни одного «безопасного места» — всё происходит в сети, где нам легко могут надавать по лицу, перехватить или скопировать наши данные, и мы даже об этом не узнаем.

Потому симметричный ключ плохо подходит для установления новых соединений.

Но мы не будем щас сразу выбрасывать его на помойку. У симметричного ключа есть свои и плюсы: он на порядок короче, чем асимметричный, и работает в разы быстрее.

Просто чтобы вы понимали: 128-битный AES ключ, который все еще считается «ну норм» по современным меркам — это 16 байт или 22 буквы в кодировке base64. То есть это литералли 22 символа, которые можно записать ручкой на ладошке. И вы уже достаточно защищены.

Только не набивайте их татушкой, плез.

🔥 Фан факт: если вы возьмете клавиатуру и раз десять жахните ей себя по лбу — то получившийся набор символов вполне можно будет использовать как херовый симметричный ключ. Попробуйте прямо сейчас!

Вся эта простота и скорость симметричных ключей нам еще пригодится, когда мы будем шифровать огромные файлы.

Чтобы не передавать секретные ключи по дикому интернету, придумали, как вы уже догадались, ассиметричное шифрование.

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

Приватный ключ считается супер-секретным, потому что может расшифровать всё то, что зашифровано публичным. А вот публичный можно рассказывать кому угодно.

Вы можете открыто переслать свой публичный ключ Олегу, да хоть запостить его у себя на сайте или в твиттере. Любой человек в мире сможет его взять и зашифровать им любое сообщение так, что только вы сможете его прочитать.

Чтобы прочитать, есесно, нужна будет вторая половина — ваш приватный ключ. Его держите в секрете :)

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

А нафига? Ну, например, так работает та самая цифровая подпись. Как на Госуслугах, да.

Для восхищенных всей этой красивой математикой, я рекомендую свою любимую «Книгу Шифров» Саймона Сигха. Она хоть и вышла в начале 2000-х, но всё еще никто не написал ничего проще и понятнее объясняющее вообще всё это шифрование от древних времен до (почти) современного TLS для чайников.

И тут вы должны вскочить из-за стола и воскликнуть: слыш, Вастрек, ну если асинхронные ключи такие офигенные, то нафига ты нам выше стелил экран текста про какие-то AES?

На что я вам скажу, что во-первых не асинхронные, а ассиметричные, читайте внимательнее, а во-вторых, вот как выглядит типичная пара таких ключей, которые я для примера щас сгенерил:

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

Так что в современном интернете используются оба варианта. И почти всегда в комбинации, чтобы нивелировать плюсы-минусы обоев.

Более того — одно из другого можно легко математически вывести!

Для этого есть популярный алгоритм Диффи-Хелмана, от которого дуреет любой криптан, потому что он позволяет красиво математически получить симметричный ключ, зная лишь пару асимметричных — свой приватник и чужой публичник.

Там вообще всё красиво и просто, ведь ключи это просто числа, которые мы можем по простой формулке пару раз возвести их в степень и поделить по модулю, и вуаля — оба чувака получают одинаковый результат, которым можно шифровать что угодно, и при этом никто не спалил свой приватник в сеть. Красиво!

Я вам больше скажу: каждый раз, когда вы открываете какой-то сайт по https, да хоть этот вот самый пост, ваш браузер сначала как раз фигачит одну из современных версий Диффи-Хелмана, чтобы установить то самое «защищенное соединение» с моим сервером в Германии и показать вам зеленый замочек сверху.

Так что всё это не какая-то там заумная херня для нердов — вы сами только что ей занимались, теперь живите с этим.

Окей, с шифрованием разобрались. Теперь вы можете добавлять в резюме «секьюрити эксперт» и стричь бабки.

Но что делать с чатом? Мы просто находим друг друга, обмениваемся публичными ключами, шифруем ими данные и отправляем? Всё чтоле? Нафига тогда целый пост?

Вострик, ты чо наше время тратишь, у нас там еще тиктоки несмотренные!

Тиктоки подождут, у нас есть проблема. И проблема в том, что всё это работает только когда у нас с Олегом чат на двоих. А в современном мире мы все плотно сидим в групповых чатах и вот там это нифига не работает.

Перейдём к ним.



3 комментария
3
agh0

Приватный ключ считается супер-секретным, потому что может расшифровать всё то, что зашифровано публичным. А вот наоборот уже не cработает. Стопроц.

Наоборот - это расшифровать публичным ключом сообщение зашифрованное приватным? Такое наоборот сработает. Или не понимаю про какое наоборот тут речь :)

3
Вастрик

agh0, косяк, поправил, пасиба!

2
My Day

"На что я вам скажу, что во-первых не асинхронные, а ассиметричные, читайте внимательнее"

Шутка топ)

Хьюстон, у нас проблема. Мы научились шифровать сообщения 1-на-1, но у нас есть чат на 100+ человек, и мы хотим сделать так, чтобы он тоже был весь по-красоте end-to-end шифрованный и злобные облака не могли посмотреть наши групповые мемы.

Для начала давайте вместе подумаем какие есть выходы из ситуации:



Комментировать

Мы представляем себе групповой чат из 100 человек просто как 100 разных чатов один на один. Почему бы и нет?

Мы знаем публичные ключи каждого участника, а значит можем зашифровать ими каждое свое сообщение и отправить его так, что только один человек его сможет расшифровать, а все остальные проигнорируют.

То есть когда мы пишем сообщение в чат, мы его шифруем 100 раз. Ну или 1000. Ну или миллион, если участников миллион. Чуете, опять запахло говнецом?

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

Но хрен с айфоном, завтра уже новый выйдет, есть и другая проблема: никакой сервер не захочет это говно хранить. Вместо одной картинки весом 1 Мб там будет лежать 1000 одинаковых зашифрованных файлов, то есть примерно 1 ГИГАБАЙТ информации на каждый мем.

Уже после пары мемов ваш чат с друзьями начнёт занимать больше места сервере, чем атомов во вселенной, а месячного трафика вам будет хватать секунд на пятнадцать.

Это будущее, которого вы хотите? Чот кажется, что нет. Потому забудьте этот вариант нафиг, он говно, рассмотрим следующий.



1 комментарий
11
Mikalaj Karhin

Проблема тут не в этом. Сама схема рабочая, но накладная в другом месте.

Джепег шифруется и загружается только один раз и одним аес ключом, как и весь пейлоад. На паб ключе шифруется уже этот аес ключ для каждого собеседника и весело рассылается. Мобила типа 6 айфона это легко сделает сотню раз, пока анимация отправки проигрывается.

Проблема в этой схеме, что надо менеджить сотни и тыщи ключей под каждого собеседника, а это больно, тяжело и уже практически бессмысленно. Добавить еще, что у собеседника может быть несколько девайсов. Это перед каждой отправкой надо разобраться, че там не протух ли у кого ключ, а если протух или неактуальный, то че делать?

Короч, сообщения просто элементарно проебываются и эффективность этого предприятия сомнительная на больших чатах.

Участники договариваются о каком-то общем ключе шифрования на весь чат, которым каждый может зашифровать и расшифровать любые сообщения внутри. Ключ этот получается симметричный для всех, как мы уже поняли ранее.

На практике обычно создатель чата генерирует этот ключ, а потом сообщает его через безопасное соединение (с использованием ассиметричных ключей) всем другим участникам.

И вот не надо хихикать, это действительно неплохой вариант. Все ранние шифрованные чаты даже вполне себе работали по этой схеме, почему нет?

Общий ключ хоть и передаётся через сеть, но делает это в зашифрованном виде, и в такой чат легко добавлять новых участников, сообщая им наш ключ, а злобное облако никогда его не знает. Так что наши сообщения в безопасности!

Ну вот да, но есть нюансики.

Первый из них: а как мы будем удалять юзеров из чата?

Окей, если у нас с поцанами общий ICQ больше 130, то мы можем придумать систему, когда при удалении одного юзера, все остальные заново генерируют общий ключ, чтобы защитить им дальнейшую переписку.

Но уже тут мы огребаем технических проблем с тем, чтобы снова сообщить этот ключ участникам, которые находятся оффлайн, то есть они по сути временно теряют доступ к чату, пока не перезайдут и не получат себе новый ключ.

Ну окей, со временем все ключ-таки получат, этой проблемой можно пренебречь и обыграть через UX.

Но есть проблема посерьезнее: утечка ключа.

В чате на тысячу человек это рано или поздно произойдет — кто-то сольет свой незашифрованный бекап в iCloud, оставит телефон в баре, либо завтра вообще наш ключ забрутфорсят. Вероятность последнего хоть и крайне мала, но никогда не равна нулю. Чат может жить годами с одним ключом, а значит у хакиров есть достаточный запас времени, чтобы накупить жифорсов по акции и похакать вас.

Серьёзным мужчинам нужны гарантии посерьезнее.

Хотя полностью выкидывать на помойку этот метод мы не будем. Тот же протокол MTProto в секретных чатах Telegram работает именно так, несмотря на все минусы. Они еще мило пытаются обыграть это на UX, предлагая авто-удаление сообщений через 20 секунд.

🧠 Вы можете легко убедиться в этом прямо сейчас, если создадите в телеге секретный чат — он вам напишет что-то типа «жду пока другой человек выйдет онлайн и обменяется с вами ключами» и не даст отправить ни одно сообщение до этого. Сравните теперь с Signal, Matrix и WhatsApp, которые используют более совершенные протоколы. Вот теперь вы знаете почему так :)

А еще позже мы узнаем, что даже в божественном Matrix для улучшения производительности в больших чатах используется «сеансовый ключ», который как раз то же самое. Только он ротируется чаще. Так что не всё так однозначно.



7 комментариев
2
Alex

Помню, когда телеграм только создали, то end-to-end зашифрованные чатики продавали как инновацию, что-то, чего ещё не было ни в каких других чатах. И что Николай Дуров - просто гений, написал MTProto, самый секьюрный протокол на земле. Если RSA алгоритму 48 лет, то в чём тогда прикол, почему никто раньше не сделал? 🤔

Или он реально гений и реально никто до него не додумался до этого шифровать сообщения таким образом?

16
Oskar Sharipov

Alex, все, во что ты веришь, это главная заслуга маркетинга Павла Дурова. MTProto — ошибка, было решетом еще много лет, и вместо изобретения собственного криптографического протокола, главного греха, нужно было брать старый и всем известный. E2E был в XMPP (через OTR) и Jami, а в те же годы появился Signal Protocol и Matrix.

1
Alex

Я не верю, а скорее делюсь воспоминаниями. И удивляюсь, что никто раньше не занимался маркетингом шифрования для общения в чатах.

1
Андрей Нефёдов

Обязательное замечание при каждом упоминании секьюрности телеги: все группове чаты и лички (по-умолчанию) зашифрованы с тем же уровнем отсутствия E2EE что и TLS (т.е. полным). Литерали как Facebook Messenger (где тоже есть убогие секретные чаты).

2
My Day

"🧠 Вы можете легко убедиться в этом прямо сейчас, если создадите в телеге секретный чат — он вам напишет что-то типа «жду пока другой человек выйдет онлайн и обменяется с вами ключами» и не даст отправить ни одно сообщение до этого."
Хотел убедиться, но получилось, что опроверг. Не надо ждать, всё отправляет сразу. Уже даже писал тем аккаунтам, которые точно давно офлайн - всё равно.

А еще, если позволите, всегда не мог понять, как E2E шифрование может гарантировать какую-то безопасность, если клиент не опен-сорсный? Ведь он может просто по-тихому отправить ключ в облако, без ведома юзера, или слить переписку тысячью других способов. Или есть какие-то фундаментальные механизмы, которые этого не позволяют?

3
My Day

"Тот же протокол MTProto в секретных чатах Telegram работает именно так, несмотря на все минусы."
А, тут еще вопрос. Разве секретные чаты в ТГ не только 1-на-1 работают? Просто выше обсуждали групповые и почему это плохо и неудобно для групповых. Или я не понял логику?

0
Aleksandr Borisenko

создатель чата генерирует этот ключ, а потом сообщает его через безопасное соединение

Тема создания этого безопасного соединения не раскрыта.

Похоже на предыдущий вариант, только теперь мы договариваемся о новом общем ключе на каждое пересылаемое сообщение. Отныне утечка ключа нам не страшна — им можно будет расшифровать одно конкретное сообщение, а не весь чат.

Но в прошлый раз мы уже выяснили, что пересылать новый ключ каждый раз между всеми участниками — это путь в дурку. Нам здесь нужна какая-то военная хитрость.

Итак, представим себе, наш чат только начался. Участники обменялись ключами и получили один общий. ? в самом начале это сделать легко, потому что каждый юзер жмет кнопку Join Chat сам Но в третьем варианте, кроме ключа, они договариваются еще об одной штуке — специальном алгоритме, по которому каждый из участников сможет математически выводить следующий ключ, не обращаясь за помощью к другим.

Визуально это можно себе представить как волшебную коробочку, в которую мы с одной стороны кладём наш старый ключ, крутим ручку, и она выписывает нам новый.

На один и тот же входной ключ коробочка всегда будет давать один и тот же результат. Причём у всех юзеров. А провернуть ручку обратно и получить исходный ключ будет физически и математически невозможно.

Как? Да всё просто, тут даже школьник разберётся: мы можем умножать наш ключ на какое-то простое число.

Вот вам мысленный эксперимент: я даю вам листочек, на котором написано два числа — 107 и 283, и прошу вас их перемножить. Вы достаёте из кармана телефон с калькулятором и моментально говорите мне ответ — 30281.

Заняло секунды четыре, так?

А теперь представим обратную ситуацию: я даю вам бумажку, на которой написано 30281 и прошу вас рассказать мне какие два числа я только что перемножил, чтобы его получить?

Сложна? Калькулятор не помогает? То-то же.

Пример нарочито утрирован, но позволяет понять как может работать наша волшебная коробочка, позволяющая легко получить из одного ключа другой, но не обратно. ? Похоже, кстати, на Диффи-Хеллмана? А должно быть! Криптаны называют такой процесс деривацией, а новый ключ, соответственно, деривированным. Но это чисто так, чтобы вы модное слово знали, им можно шикануть перед друзьями.

Такой алгоритм, который работает в одну сторону, но не работает в другую — называют Ratchet-механизмом. Вы наверное видели хоть раз отвёртку или ключ с трещоткой, которая легко вращается в одну сторону и не вращается в другую. Вот от него и название.

Давайте отныне я буду называть нашу волшебную коробочку генерации новых ключей просто «рáчетом». Пускай меня снова отменяют за англицизмы, но в разговорах я никогда не слышал, чтобы кто-то в жизни говорил «трещотка» или «храповик», разве что диды всякие душные.



2 комментария
3
My Day

а я ни разу не слышал чтобы кто-то в разговорах говорит "рачет", видимо я душный дед)

Окей, значит наш математически-волшебный рачет выдает нам новый ключ на каждое новое сообщение.

Значит при утечке одного ключа у хакера не будет возможности «раскрутить» рачет обратно, получить старые и прочитать предыдущие сообщения — с этим всё хорошо. ? криптаны называют это свойство «Forward Secrecy», хотя какой она Forward, если Backward, но кто мы такие чтобы умных людей судить Но что делать с новыми сообщениями? Вперёд-то он всё так-же легко крутится.

Проблема в том, что алгоритмов работы нашего рачета довольно конечное количество. Ну типа десяток, если брать стандартные. Или под сотню, считая нестандартные.

Мы же не изобретаем свой алгоритм каждый раз в каждом новом чат-приложении. В криптографии вообще изобретать алгоритмы — дикий моветон, за такое по лицу дают.

Но с таким раскладом получается, что хакир, угнавший один ключ, может просто на изиче перепробовать известные алгоритмы и найти нужный, который расшифровывает все наши будущие сообщения. С этим надо что-то делать. Мемы всё еще в опасности!

А что если на нашем рачете будет написан некий код, как на кодовом замке? И два одинаковых рачета будут выдавать один и тот же результат только в том случае, если код на них совпадает?

То есть по сути, как говорят программисты, у рачета появляется состояние, влияющее на логику его работы.

У тех, кто помнит как работала та самая шифровальная машинка Энигма, сейчас в голове военные флешбеки должны пойти. Мы литералли изобретаем то же самое раз за разом...

Так пажжи, это ведь снова отбрасывает нас на Вариант 2 со всеми вытекающими: как мы все будем об этом коде договариваться? Как сообщим его тем, кто сейчас оффлайн?

Вдруг другой участник чата в это время пьёт пивасик где-нибудь в баре на районе и не может прям щас вот отвлечься, чтобы сгенерировать тебе новый публичный ключ в чат.

Окей. Пусть допивает. Вы пока следите за руками: мы ведь можем не договариваться о новом коде на каждое сообщение, а только когда другой человек нам хочет ответить. Ну типа:

То есть смена кода происходит только когда второй участник вышел в онлайн и решил ответить нам. А до этого мы фигачили свои ключи с одинаковым кодом.

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

Второй участник прикладывает к своим сообщениям свой новый публичный ключ, а мы вычисляем новый общий код и настраиваем наш рачет на него, чтобы расшифровать что он там написал.

Получается полностью асинхронный обмен — нам не надо для этого быть в чате и передавать что-то в ответ. Мы прочитаем и вычислим все коды и рачеты когда вернёмся онлайн.

В следующий раз, когда мы захотим написать ответ, мы точно так же приложим к ним новый публичник, а другой участник сможет точно так же его взять (зачастую прямо из сообщения) и вычислить код на своей стороне. Проблема оффлайна решена!

Даже если хакир ворвётся к нам в чат где-то в середине моего монолога, он сможет расшифровать несколько сообщений, но после нового обмена кодами снова потеряет возможность дешифровать наш уютный чатик.

Такой алгоритм назвали Double Ratchet (двойной рачет!) и его способность к «самоизлечению» после взлома — одна из главных его особенностей.

Рекомендую вот это классное видео с визуализацией прочитанного:

Именно на разновидности Double Ratchet механизма работают все шифрованные 1-1 чаты в современных месседжерах типа WhatsApp, Signal, Matrix. Кроме Telegram, который не шифрует обычные чаты вообще, в секретных использует старый вариант с общим ключом, а групповые вообще не поддерживает.

Как, в целом, и Double Ratchet...

В смысле? А как же групповые чаты? Мы проделали весь этот путь, чтобы прийти к алгоритму, который снова работает только в чатах один-на-один? Совсем обдолбался чтоле?

Да. Так что на этом пост еще не заканчивается. Вам придётся еще потерпеть меня.



4 комментария
18
Morj

криптаны называют это свойство «Forward Secrecy»

🤓☝️ потому что защита от угрозы из будущего. В отличие от классических схем, которые защищают только от угрозы в настоящем, типа активного прослушивателя; в случае FS мы защищаемся от атакующего, который через пять лет украдёт ключ и захочет прочитать наши мемы из сегодняшнего дня.

Ну а защиты от угрозы из прошлого не существует, потому что если тебя сломали год назад, то это всё

2
Андрей Нефёдов

защиты от угрозы из прошлого не существует
Существует, в определённом смысле. Называется Post Compromise Security.

0
My Day

"Кроме Telegram, который не шифрует обычные чаты вообще" - вообще не шифрует или не шифрует E2E? Я думал оно зашифровано "от хакеров", но на сервере типа можно прочитать (?). Или оно просто в отрытом виде передается?

1
Дмитрий Скрыльников

My Day, Всё так, MTProto шифрует сообщения между девайсом и сервером. На сервере Пашка уверяет что всё пошифровано и данные лежат на одном сервере, ключи на другом. Но у нас нет никаких механизмов чтоб проверить это, поэтому считаем что всё лежит открыто.

Ну кроме секретных чатов, которые таки P2P

Современные мессенджеры почти всегда используют разные алгоритмы для групповых чатов и одиночных. Логика групповых чатов обычно на порядок сложнее и полна мелких хитростей, с помощью которых разрабы стараются выдержать тот самый баланс между безопасностью чата и тем, чтобы его пользователей не тошнило от кривого и тормозного интерфейса.

Получается пока плохо :) Кто хоть раз по-серьезке пользовался Матриксом, хотя бы в группах на 500+ человек, знает насколько.

Чтобы вы понимали насколько темка свежая — первый настоящий стандарт шифрования сообщений в групповых чатах MLS (Messaging Layer Security) вышел аж только в 2023-м году. Это свежее, чем ChatGPT, братишки! Мы с вами реально о bleeding edge щас будем разговаривать. ? хотя конечно разрабатывали его еще с прошлого десятилетия

До появления MLS каждый разработчик сам выдумывал себе крышесносные алгоритмы шифрования для групп, но сейчас все наконец-то акстились и плавно на него переезжают.

Штош, отложите свои Double Ratchet в тумбочку и встречайте — Ratchet Tree! «Дерево трещоток»? Сорян, я снова буду использовать оригинальный термин, а то это кринж.

Главная проблема, которую решает такое дерево — как бы нам всем чатом быстро договориться о едином «ключе» для наших шифровальных рачетов и не передавать его NxN раз каждому участнику.

Строится оно достаточно просто: сначала каждый участник чата становится в самый низ простого советского бинарного дерева.

Не все ветки дерева обязательно должны быть заняты. Ведь в чате может быть и нечетное количество участников, а кто-то может входить и выходить.

Дальше идут ноды выше — от пользователей до корня. Эти промежуточные ноды ничего не делают, они просто удобная абстракция для получения общего корневого ключа.

Каждая нода дерева имеет свою пару из публичного и приватного ключей. Вот как-то так:

Публичные ключи нод никакого секрета не представляют, так что их могут знать все участники чата. А вот с приватниками интереснее.

В стандарте MLS приватные ключи от нод дерева известны только тем юзерам, от которых непосредственно проходит путь до корня дерева. То есть пользователь Олег, например, знает только вот эти приватные ключи:

Каждый участник чата хранит у себя всё дерево локально. Для «своих» нод он знает приватники, для «чужих» — только публичники. Но самое главное, ради чего вся эта свистопляска и затевалась — каждый участник чата знает приватный ключ самого верхнего узла дерева. Его корня. Этот ключ и является тем самым «кодом», который все вводят в свои коробочки-рачеты, чтобы читать и подписывать новые сообщения.

Все юзеры такого чата живут в гармонии и спокойствии, генерируют новые ключи, используя общий корень, и шифруют ими сообщения. Всё чинно-мирно.

И вот однажды начинается суета.

Олег такой говорит: «а давайте позовём Андрюху в чат?». Все-таки групповые чаты для того и придумали, чтобы звать в них людей, не правда ли?

Андрюха врывается в чат. Первым делом он занимает любое свободное место в дереве. ? Если свободных мест нет — все дерево начинает расти и заново пересчитывает ключи для новых промежуточных нод.

Олег берёт публичник Андрюхи, шифрует ему весь актуальный слепок дерева со всеми ключами, кроме приватников, и пересылает его Андрюхе. Это называется Welcome Message.

Тут сразу есть проблемка — приватных ключей у Андрюхи пока нет. А значит весело шифровать с нами сообщения он пока не может. Для этого ему нужен корневой ключ.

И мы не можем просто рассказать ему старые приватники вверх по дереву, потому что тогда он сможет прочитать наши предыдущие сообщения, а вдруг там были неприятные мемы про него?

Кажется, пришло время создавать новый корневой ключ!

Красота нашего дерева в том, что кто угодно из участников чата, в принципе, может создать новый корневой ключ (ну кроме Андрюхи).

Так что пусть Олег за всех и трудится.

Шаг 1: Олег выбрасывает свои ключи на помойку и создает себе новые. Он может создать их с нуля или использовать рачет для красоты — это неважно.

Шаг 2: Олег крутит ручку своего рачета, чтобы сгенерировать новые ключи для всех нод от себя вверх по дереву до самого корня. Именно из-за вот этих регенераций вверх дерево и называется Ratchet Tree.

Теперь хитрожопый Олег знает новый корневой ключ, но остальные пока нет.

Шаг 3: Теперь Олег должен как-то безопасно сообщить новый ключ другим участникам чата.

Начнем с самого ближайшего соседа Олега. Они живут рядом, потому им обоим известен ключ непосредственно над ними в дереве.

Олег может зашифровать новый ключ старым публичником этой общей ноды и передать это сообщение своему соседу — Володя, лови, теперь используй его.

Володя может его расшифровать и прочитать, ведь тоже знает ключ общей ноды, и потом расчехлить свой рачет и тоже, как раньше делал Олег, просчитать все ключи от себя выше по дереву. А так как рачет у всех одинаковый, сработает магия математики и Володя получит абсолютно те же ключи, что получил Олег ранее! Включая новый корневой!

Шаг 4: С соседями из другого района примерно такая же история. Олег берёт общеизвестный ключ соседнего поддерева, шифрует им новый приватник и передает его в чат работягам.

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

С оставшейся частью дерева происходит то же самое. Тут уж вы сами догадаетесь по аналогии, не глупенькие все-таки.

Итого Олегу нужно передать всего лишь 3 сообщения, чтобы все 8 участников чата узнали новый корневой ключ. Что на маленький цифрах выглядит фигнёй, но если в чате, скажем, 15000 человек, то полная ротация ключей займет всего 14 таких передач, а не 15000. Вот за такое уже можно и ящик пива разработчикам проставить.

Зубрившие ночами LeetCode к собесам должны тут всем прийти рассказать, что раньше была сложность O(n^2), а теперь O(log), потому так красиво-дорого-богато стало.

Та же самая ситуация происходит и при удалении юзера из чата. Корневой ключ ротируется, чтобы удалившийся не мог читать новые сообщения. Ответственным за ротацию ключей в этом случае назначается либо тот, кто удалил, либо просто любой крайний чел из чата, которому не повезло.

Вуаля!

Такое дерево ключей даже не нужно хранить прямо на сервере, оно может быть виртуальным и храниться непосредственно на кумплюктере каждого из участников чата. В этом вторая сила MLS — он отлично работает в peer-to-peer чатах. Но о них мы поговорим в следующий раз.



Комментировать
Комментарии 👇
Konstantin 3 дня, 11 часов назад #
81

Ответственно заявляю, в этом месяце доллор окупился 👍🏻

Геннадий Колобежко 3 дня, 8 часов назад #
37

Старый добрый Вастрик. ♥️

Dmitry 2 дня, 12 часов назад #
9

Если честно не понял с последним:

  1. Как отправок ключа может быть меньше чем участников чата. Как можно за 14 передач передать ключ 15к людей если каждый должен в итоге получить ключ? Как будто какие-то широковещательные пакеты используются, но мы же про мессенджер говорим. Или имеется ввиду что ключ всего 14 раз придётся шифровать и будет всего 14 вариантов шифрованного пакета?
  2. Если речь идёт об этом, зачем дерево? Можно тогда просто новый ключ зашифровать старым корневым и все юзеры его смогут прочитать. Имеет смысл при удалении когда нужно чтобы получили все кроме одного, но при добавлении зачем так сложно?
Dmitry 2 дня, 12 часов назад #
3

А и
3. Откуда берется 15000*15000? Если ключ ротирует один человек и дерево не используется, он по идее может просто сгенерировать новый ключ и всем отправить. Получается просто 15000.

Вастрик 2 дня, 12 часов назад #
2
  1. Как отправок ключа может быть меньше чем участников чата. Как будто какие-то широковещательные пакеты используются

Так и есть — ты просто отправляешь новый ключ в общий чат, а участники его оттуда читают. В случае с центральным сервером или федерацией такой сервер у нас всё еще пока есть, вот туда все и отправляют. По сути это как обычные сообщения, просто сервисные.

  1. Имеет смысл при удалении когда нужно чтобы получили все кроме одного, но при добавлении зачем так сложно?

А тут ты прав и хорошо заметил — при добавлении нового участника даже не всегда нужно ротировать рутовый ключ! :) Зависит от алгоритма.

  1. Откуда берется 15000*15000?

Косяк, поправил.

treboit 2 дня, 10 часов назад #
5

Я в школе за какое-то там место в конкурсе Кенгуру (помните такой?) получил книжку про историю шифрования. Возможно, это была сокращенная версия Книги шифров Сингха. Помню, что объяснение шифра RSA (который на основе Диффи-Хелмана), казалось какой-то магией

Aleksandr 2 дня, 8 часов назад #
5

Задам глупые вопросы, потому что ту им и место:

  1. Я правильно понимаю, что когда я вхожу в телеграмм с нового устройства и мне подтягивается вся история сообщений, то это говорит о том, что в облаке лежит мой приватный ключ, который мне доставляется после ввода кода из смс (и пароля)

  2. Я правильно понимаю, что если ответ на первый вопрос Да, то сотрудники телеграмма могут прочитать мои сообщения - чисто теоритически

Oskar Sharipov 2 дня, 8 часов назад #
4

Aleksandr, обычные сообщения в телеграме не шифруются E2E, шифруются только "secret chats" и они в новое устройство не подгружаются. Телеграм может читать чужие сообщения в приватных и публичных чатах. Бывший сотрудник телеграма даже утверждал, что его переписку почистил сам Дуров, чтобы не осталось доказательств каких-то внутренних разборок.

Вастрик 2 дня, 8 часов назад #
4

Я правильно понимаю, что когда я вхожу в телеграмм с нового устройства и мне подтягивается вся история сообщений, то это говорит о том, что в облаке лежит мой приватный ключ, который мне доставляется после ввода кода из смс (и пароля)

Всё еще проще — вся твоя переписка лежит в открытую на серверах телеграма (ну кроме секретных чатов). Она просто загружается тебе на новый девайс с сервера по-старинке (ну разве что через стандартный SSL/TLS).

А для секретных чатов телеграм не поддерживает логин на новых устройствах, насколько я помню. То есть секретный чат остается секретным только между двумя конкретными девайсами, они не умеют передавать ключ на новый девайс.

Это умеет WhatsApp, хотя тоже через жопу, он синкает ключи с девайса напрямую по пир-ту-пир. Matrix и Signal тоже, хотя там надо отдельно аппрувить новые девайсы со старых.

то сотрудники телеграмма могут прочитать мои сообщения - чисто теоритически

Да, изян

_AMD_ 2 дня, 7 часов назад #
6

А был где-то видос или микропост/упоминание о том, как рисуются эти картинки к постам? Вроде помню, что в скетчес, но дьявол кроется в деталях ведь. Интересно на чем и чем рисуется (планшет + стилус?), сколько времени это занимает, как делаются изменения версий одной и той же картинки, а также возможно перевод всех картинок на разные языки (это же нужно хранить каждую версию картинки, чтобы на другие языки текст менять?), как выглядит процесс создания сложных изображений в стиле той коробки-шифроватора с крутилками «пыхтеть, крыхтеть и тд». Да и в целом очень интересен воркфлоу создания поста хотя бы в общих чертах

yhaskell 2 дня, 4 часа назад #
0

проблема, которую хотелось бы ещё решить — это возможность при заходе в чат скачать его закриптованную историю, которую сервер сам прочитать не может ;)

Вастрик 2 дня назад #
3

А был где-то видос или микропост/упоминание о том, как рисуются эти картинки к постам?

В каждом посте спрашивают :)

Да, это всё делается на уже старом iPad + Apple Pencil. Я перебрал много приложений, начиная от встроенных «Заметок» (ранние посты про блокчейн рисовались в них), заканчивая всеми популярными платными типа Procreate и Adobe Illustrator, но в итоге уже много лет использую довольно малоизвестную аппку Tayasui Sketches https://www.tayasui.com/sketches/

Она ничем не выделяется, просто очень простая и как будто сделана специально под меня — позволяет быстро и просто рисовать картиночки разными кисточками без миллиона кликов по меню и настроек.

Вастрик 1 день, 23 часа назад #
4

Причем с этим Tayasui Sketches смешно получилось, что я вот уже много лет хочу как-то задонатить авторам за действительно добротное приложение, например, купив платную версию. Но в ней они наоборот добавили кучу ПРО-ФИЧЕЙ, типа настроек кисточек, градиентов и синхронизации в облако, а мне наоборот их приложение нравится тем, что там всей этой херни нет!

И вот я теперь просто боюсь покупать платную версию, потому что вдруг там все эти «про-фичи» окажутся неотключаемыми и мне придётся опять страдать с непонятными мне про-настройками!

Так и не могу занести им долор...

Денис Дмитриев 1 день, 23 часа назад #
0

Konstantin, пост открытый так-то :D

Ivan 1 день, 23 часа назад #
0

О, крутой пост.

Переходим в матрикс?

Вастрик 1 день, 23 часа назад #
6

Ivan,

Переходим в матрикс?

Я почти 4 года сидел на матриксе как на основном рабочем мессенджере. И могу ответственно заявить следующее:

Unable to decrypt message

kawaii 1 день, 13 часов назад #
7

Так чо, какой мессенжер веганам посоветуешь, а на какой семью подсадишь?

My Day 1 день, 11 часов назад #
5

Задам, наверное, самый тупой вопрос. Правильно ли я понимаю, что во всем этом Е2Е шифровании нет никакого смысла, если мы не доверяем клиенту (например, у него закрытый код)? Ведь кто мешает ему отправлять все-все ключи по-тихому в облако, которое будет всё расшифровывать.
Или есть какие-то фундаментальные механизмы противодействия такому?

Avonae 9 часов назад #
0

спасибо, очень интересно было прочитать - давно хотел разобраться как работает шифрование, но читать статьи в википедии было верхом духоты

Alesil 5 часов назад #
0

E2EE тему можно еще раскрывать далее.

  1. для файлов - можно упомянуть Mega.nz , как пример. У них протокол открыт, Клиент (в браузере) open-source. проверен временем 12 лет.
  2. EMail - Protonmail
  3. Password Managers - LastPass.

И Самый лучший пример модерации (инспекция) E2EE контента - Apple PSI. Тут нужна отдельная статья.

Morj 5 часов назад #
0

Alesil, раскрытие темы e2ee в емейле: https://www.latacora.com/blog/2020/02/19/stop-using-encrypted/

Morj 5 часов назад #
0

Какую мысль из этой статьи можно легко применить к протонмейлу и меге: если ты можешь скачать свои данные без аутентификации новых устройств, значит ключ не у тебя, а у провайдера. Значит твои данные, пусть они и зашифрованы когда-нибудь в полёте, может прочитать тот кто их хранит (например сам протон)

Еще? Тогда вот