Перейти к основному содержанию

Ликбез к битве при Telegram

Криптография для самых маленьких

А между прочим, Instagram надо закрывать, потому что теракт в Ленинграде в прошлом году был совершён при помощи Instagram.

глава Следственного комитета РФ А.Бастрыкин

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

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

Представьте, что вас попросили создать способ шифрования, который защитит вашу переписку от врагов, которые могут перехватить любое сообщение. Самое элементарное решение — просто взять и заменить все символы алфавита на какие-нибудь другие закорючки. Или можно использовать тот же самый алфавит, но в качестве «зашифрованной» буквы использовать букву, которая отстоит от «базовой» на некотором фиксированном расстоянии. Например, слово «ПЕТР», зашифрованное со сдвигом 4 (то есть вариантом «Г») превратится в «ФІЧХ»

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

Такой алгоритм называется шифром Цезаря и он вообще никуда не годится. Проблем две.

  • Для всех абонентов приходится использовать один и тот же код. Точнее, если использовать разные буквы, то получится, что количество вариантов на один меньше, чем букв в алфавите — этого очень мало.
  • Код взламывается даже бытовой логикой, как это сделал Шерлок Холмс в рассказе «Пляшущие человечки».

Обе эти проблемы были отчасти решены в шифре Виженера. Суть такова: задаётся некоторое секретное слово (ключ шифрования), которое записывается вдоль текста много-много раз. «Зашифрованную» букву получают как в шифре Цезаря, прибавляя букву текста к букве ключевого слова. Например, чтобы зашифровать букву «І» в примере ниже, нужно использовать «Е». «Е» стоит в алфавите на седьмом месте, поэтому сдвигаем «І» на семь позиций и получаем «Н».

Буква «Е» исходного слова каждый раз зашифровывается по-разному, поэтому расшифровать закодированное сообщение будет довольно сложно.

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

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

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

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

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

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

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

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

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

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

В алгоритме Диффи-Хелмана используются функции, для которых обратное значение посчитать практически невозможно. Точнее, выдвигаются такие формальные требования:

  • Коммутативность. Например, для числа P и любой пары целых чисел 7 и 5 должно соблюдаться равенство 5*(7*P) = 7*(5*P).
  • Невозможность обратной операции. Например, если есть пара чисел P и Q, и Q=n*P то вычисление числа n должно занимать неимоверное количество времени.

Сам алгоритм очень прост:

  • стороны (традиционно их зовут Алиса и Боб) задумывают свои секретные числа, соответственно A и B. Эти числа никому не сообщают;
  • стороны вместе договариваются использовать число С, это число становится известно злоумышленнику, который подслушивает разговор;
  • Алиса вычисляет число A*C, используя функцию, описанную выше, и отправляет его Бобу. Боб, в свою очередь, вычисляет B*C и отправляет Алисе;
  • каждая из сторон умножает своё секретное число на то, которое получила, и в итоге получается общий секретный ключ вида A*(B*C)=B*(A*C). Злоумышленник никак не может посчитать значение секретного ключа.

Если что, вот в этом видео есть ещё более простое объяснение, а заодно там рассказывается, что именно представляет собой «необратимая» функция.

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

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

  • Совсем посторонний человек, просто ищущий «что-то интересное». Грубо говоря, слова «Путин» и «бомба» в одном предложении.
  • Человек без специальных полномочий, типа школьника, который хочет сделать гадость учительнице.
  • Человек с законными требованиями. Можно разделить на две подгруппы: рядовые милиционеры/сбушники или те, у кого есть решение суда.
  • Атакующий со специальной подготовкой, возможно со своим физическим оборудованием, которое, например, позволяет перехватывать SMS, отправленные на телефон жертвы.

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

Понятно, что от каких-то из этих случаев можно защититься с помощью Телеграма, а от других — практически невозможно.

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

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

  • Протокол MTProto, по которому общаются приложения, открыт и неплохо документирован.
  • Код клиентских приложений открыт, с ним может ознакомиться любой желающий.
  • Серверное ПО таки закрыто. Теоретически можно предположить, что разработчики, нанятые Дуровым, спрятали там какие-то бекдоры. Недавно был открыт код прокси-сервера MTProto, но там ничего интересного нет, потому что он только пересылает информацию на основные сервера.

Есть определённое сообщество, которое изучает протокол MTProto, пытаясь найти в нём ошибки. Например, можно вспомнить исследование, в котором говорилось о том, что он уязвим для MITM-атак. Суть мan-in-the-middle заключается в том, что злоумышленник не просто подслушивает переговоры (как в рассмотренных выше примерах), а вмешивается в процесс передачи данных. То есть, в примере с Диффи-Хеллманом сначала «человек посередине» устанавливает соединение с Алисой от имени Боба, потом с Бобом от имени Алисы, в обоих случаях используя все нужные методы шифрования. Потом сообщения, полученные от Алисы, он читает, перешифровывает ключом Боба и отправляет этому самому Бобу и точно так же в обратном направлении. Авторы исследования сами признают, что такой сценарий сложно реализовать, но всё же вполне возможно, если цель того стоит.

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

У самурая нет цели, есть только путь. Мы боремся за объективную информацию.
Поддержите? Кнопки под статьей.