Самое простое объяснение принципа работы современных алгоритмов симметричного шифрования
(Нашёл в твиттере тред с очень крутым объяснением работы симметричных шифров. Его написал Colm MacCárthaigh один из основных контрибьюторов Apache. Я спросил разрешение Колма на перевод, он любезно согласился).
Я объясню вам доступным языком, что происходит при шифровании данных. Надеюсь, что без мистики и сложных штук, которые были придуманы криптографами.
Итак, симметричное шифрование — это именно то, что мы используем в большинстве случаев, когда хотим зашифровать кучу данных. Ваш браузер отправляет и получает данные, используя симметричное шифрование. Если вы шифруете файлы или диск, в этом случае тоже работает симметричное шифрование. iMessage, Signal, WhatsApp — все они используют симметричное шифрование для безопасности вашей переписки.
Если вы думаете, что при шифровании данные перемешиваются так, что их никто не может прочитать без ключа, так оно и происходит на самом деле.
Вот простой пример. Допустим, у меня есть строка «Ovaltine» и я хочу её зашифровать. Я мог бы воспользоваться rot13 — очень простым олдскульным шифром Цезаря, который делает хоровод из букв, где a и z держатся за ручки, и заменяет каждую букву другой буквой алфавита, которая находится от заменяемой буквы на расстоянии 13 символов. Таким образом «O» превращается в «B», а «v» становится «i», в итоге «Ovaltine» превращается в «Binygvar». Конечно, это не очень безопасно. Это наивный пример, который очень легко взломать, так как атакующий может выяснить, какая буква встречается чаще всего (обычно в оригинальном тексте это «e») и найти оставшиеся буквы подобным образом.
Сейчас вы можете представить, что должны существовать более хитрые способы «перемешивания» букв. Например, некая сложная схема, в которой «a» переходит в «p», но при повторном шифровании — в «f». Может даже иногда эта схема начинает шифровать «a» двумя буквами, например «jd» или в что-нибудь другое. Таким образом эта усложнённая схема может зашифровать «Ovaltine» в строку «FGyswDmweeRq» (заметьте, что она стала длиннее). В прошлом появлялись алгоритмы шифрования, которые работали подобным образом, но это совсем не так, как работает современное шифрование.
Вместо «перемешивания» букв современное шифрование берёт вашу секретную строку и хитро комбинирует её со случайными данными. Это похоже на rot13 только в двух моментах: шифрование и расшифровка по сути одна и та же операция, и всё происходит «на месте». Действительно, вы заметили что rot13 является одновременно алгоритмом шифрования и расшифровки? rot13(Ovaltine) -> Binygvar, rot13(Binygvar) -> Ovaltine. Я считаю, что это очень красивая симметрия в симметричном шифровании. Но всё же вернёмся к нашей теме. Хитрость заключается в том, что мы используем побитовую операцию XOR. В криптографии, формальной логике и коде программ XOR может обозначаться по разному, но я буду использовать такую нотацию, с которой вы вероятнее всего знакомы. Она выглядит вот так: ^.
XOR — это сокращение от «exclusive OR» (исключающее ИЛИ). Это оператор (или функция, если вам так удобнее думать), которая принимает два аргумента и возвращает результат. A ^ B = C. Этот оператор называется «побитовым», так как применяется к соответствующим друг другу битам. Если A и B байты, то мы можем считать, что A ^ B = C по сути 8 разных операций, которые происходят одновременно. ^ сравнивает первый бит A и первый бит B, а затем помещает результат в первый бит C. Он повторяет тоже самое ещё 7 раз для оставшихся бит. Правила простые: если бит из A «1» ИЛИ бит из B «1», тогда мы устанавливаем соответствующий бит C в «1», но только в том случае, когда «A» и «B» одновременно не являются «1». Это и есть исключающая часть. Вот олдскульная таблица истинности:
A|B|C 0|0|0 1|0|1 0|1|1 1|1|0
Самая клёвое в XOR то, что он похож на rot13. Мы можем использовать его для шифрования и расшифровки. Покажу это на простом примере. Давайте представим, что мы хотим зашифровать обычное число «3» и что наш ключ шифрования другое число «7». Таким образом 3 ^ 7 = 4. То есть результат шифрования — «4». Давайте теперь расшифруем число. Я просто сделаю тоже самое снова: 4 ^ 7 = 3. Возьмите любое число, которое вам нравится или любые данные, и это всегда будет работать — XOR всегда сможет расшифровать себя.
Бит за битом — вот как мы в действительности шифруем и расшифровываем данные, нет никакого перемешивания, только XOR-инг. Трудная часть — поиск данных, к которым мы можем применить XOR. Один из подходов заключается в том, чтобы взять большой кусок секретных данных, лежащих под рукой, и использовать его в качестве второго аргумента XOR. При этом все участники процесса передачи зашифрованных данных должны использовать один и тот же набор секретных данных для шифрования и расшифровки. И это будет работать. Правда есть несколько проблем.
Первая проблема. Секретные данные должны казаться случайными. Вы не можете взять текст из книги или что-то в этом роде. Любые паттерны будут проявляться в зашифрованных данных. Это именно то, благодаря чему союзные войска получили преимущество во Второй мировой войне.
Вторая проблема. Вам нельзя переиспользовать секретные данные, так как паттерны проявятся снова. Таким образом вы как-то должны предоставлять большие куски секретных данных для всех, кто в них нуждается как в шифре Вернама (One-time pad). Это слишком трудно.
В современном шифровании мы «генерируем» нужные нам секретные данные из маленьких ключей. Эти ключи гораздо проще таскать с собой и защищать. Вот чем в действительности являются алгоритмы симметричного шифрования — схемами для детерминированной генерации случайных данных из ключа. Часть про «детерминированность» очень важна: два человека с одним и тем же ключом должны генерировать абсолютно один и тот же набор данных, иначе они не смогут понять друг друга. Вероятно, вы слышали про такие алгоритмы: AES, 3DES, DES, RC4, ChaCha20. Все они делают это.
Оказывается, что математическая задача генерации случайного потока данных (в котором нет паттернов в любом предсказуемом виде) с помощью ключа очень сложна. Из этого списка сегодня считаются безопасными только AES и ChaCha20. Другие алгоритмы были взломаны: люди смогли предсказывать их. Причём AES имеет немного запятнанную репутацию, потому что криптографы говорят следующее:
AES — основной и наиболее проанализированный алгоритм шифрования. Абсолютно золотой стандарт! :dark_sunglasses:
Но при этом добавляют:
Реализации AES в программном обеспечении (не в аппаратном) или небезопасны, или медленны, а иногда и не безопасны, и медленны. Он не был разработан с учётом того, что его взлом можно осуществить с помощью анализа кэша. :facepalm:
Не пугайтесь слишком сильно, если это вам непонятно. Главная мысль заключается в следующем: AES шикарен с точки зрения математики, но очень сложен в программной реализации. Но не надо беспокоиться — у нас почти всегда есть поддержка AES на уровне аппаратного обеспечения (список всех процессоров с аппаратной поддержкой AES можно посмотреть тут https://en.wikipedia.org/wiki/AES_instruction_set, — прим. переводчика).
Как бы то ни было, продолжаем… Как эти алгоритмы работают в действительности? Каким образом мы можем взять ключ и безопасно сгенерировать случайный поток данных? Я буду тут немного упрощать и начну с блоков.
Эти алгоритмы получают на вход три параметра и на выходе отдают зашифрованный текст. Входные параметры — ключ, шифруемый текст и… сюрприз — что-то странное под названием «вектор инициализации» (initialization vector, IV).
AES(key, IV, plaintext) -> encrypted_data.
Ключ и IV комбинируются между собой, чтобы создать набор «стартовых условий» для алгоритма; это подобно начальной перестановке или перемешиванию плиток в игре Скрэббл. Одинаковая комбинация ключа и IV всегда будет создавать одинаковый набор стартовых условий. Спрашиваете, почему нам вообще тогда понадобился IV? Нам нужен IV, чтобы мы могли шифровать множество сообщений, используя одинаковый ключ. Без IV, каждый генерируемый поток данных был бы одинаков, и это плохо. Это бы нарушило одно из правил, про которое мы говорили ранее: мы не можем переиспользовать одни и те же данные при шифровании. Таким образом нам нужен IV для перемешивания результата. Но в отличии от ключа IV может быть публичным.
Итак, когда вы шифруете сообщение и отправляете его кому-нибудь, вы также можете добавить: «Эй, а вот IV, который я использовал». При этом всё ещё критично, чтобы мы не переиспользовали комбинацию ключа и IV, потому что они дали бы нам повторяющиеся случайные данные. Для достижения этого условия есть два пути: 1) IV это некий счётчик, который мы увеличиваем с каждым новым сообщением. 2) IV генерируется случайно, при этом у него достаточно большое значение, поэтому нам не надо сильно беспокоиться о коллизиях. Как бы то ни было, я упомянул, что я буду говорить о блоках.
Ключи и IV «смешиваются» или комбинируются таким образом, чтобы создать набор стартовых условий… эти условия на самом деле являются начальным «блоком» случайных данных. Длина этого блока для AES128 128 бит, для AES256 — 256 бит, для ChaCha20 — 512 бит. И вот тут проявляется настоящая магия и индивидуальность конкретного алгоритма шифрования. В действительности их суть заключается в том, каким образом генерируется последовательность блоков и как каждый блок связан со своими соседями. Отношения между этими блоками остаются предсказуемы даже для тех, у кого нет ключа.
Я не буду глубоко погружаться в то, как именно работают эти алгоритмы, но если вы хотите узнать больше, я советую вам начать изучение этой темы с линейного конгруэнтного метода (linear congruential generators, LCG). LCG представляет собой функцию, которая создаёт «циклические» блоки данных в случайном и неповторяющемся виде. Затем взгляните на cеть Фе́йстеля (Feistel networks) — следующий уровень развития LCG. Затем разберитесь с S-Boxes, а потом посмотрите на то как Salsa20 создаёт чередование в алгоритме ChaCha20. Всё это гораздо доступнее, чем вы можете подумать!
Итак, мы теперь знаем, как случайный поток данных может быть скомбинирован с текстом, чтобы его зашифровать и расшифровать, и мы уже немного в теме того, как эти случайные потоки данных создаются. Разве это не всё, что нам надо? Для шифрования диска, это, действительно, почти всё. Мы можем шифровать каждый блок или сектор хранилища с использованием одного ключа и IV, который может быть получен из «позиции» на диске. Таким образом мы можем всегда расшифровать любой блок данных в любом месте на диске, до тех пор пока у нас есть ключ. Но тут есть одна проблемка… кто-нибудь может испортить наши зашифрованные данные. Если я изменю значение любого байта, даже если у меня не будет ключа, то в итоге мы не сможем расшифровать блок. И нет защиты против вмешательства такого вида. В случае отправки сообщений и данных по сети, это становится ещё критичнее. Мы не хотим, чтобы кто-нибудь мог испортить наши передаваемые данные. Таким образом нам надо добавить проверку целостности! Есть несколько схем, для того чтобы это сделать.
HMAC, GCM и Poly1305 — наиболее распространённые современные схемы для проверки целостности. Эти алгоритмы по большому счёту работают так: им на вход подаются данные и другой ключ (так называемый ключ целостности). После вычислений они выдают на выходе MAC (message authentication code) или тэг, который в свою очередь просто другой кусочек данных, выступающий подписью.
Таким образом для шифрования и защиты наша схема может выглядеть так:
AES(key, IV, "Ovaltine") -> encrypted_output HMAC(key, encrypted_output) -> MAC
и затем по проводам мы отправляем:
IV | encrypted_output | MAC
Для расшифровки мы проверяем MAC, генерируя его снова и сравнивая результат с полученным MAC, а затем расшифровываем данные. Есть внутренние различия в том, как HMAC, GCM и Poly1305 генерируют эти подписи, но вам не надо об этом беспокоиться. На сегодняшний день эту комбинацию операций обычно оборачивают в функцию с именем «AEAD» (Authenticated Encryption with Additional Data). Под капотом она делает всё то, про что я говорил ранее:
AEAD(key, IV, plaintext, additional_data) -> IV_encrypted_data_MAC
Штука под названием «additional_data» — всего лишь данные, с помощью которых вы можете убедиться в том, что эти данные есть у отправляющей стороны, хотя они и не были им отправлены. Это как мета-данные, с помощью которых устанавливаются права доступа. Часто это поле оставляют пустым.
Но тем не менее вы можете поиметь проблемы с AEAD, если будете использовать один и тот же IV. Это плохо! Есть попытки для улучшения этой ситуации: мой коллега, которого зовут Шай, работает над клёвой схемой SIV, добавляющей уровень защиты от этой проблемы. Но если вы используете уникальный IV, современное шифрование очень безопасно. То есть вы можете опубликовать зашифрованный текст в Нью-Йорк Таймс, и никто не сможет его взломать. Шифр будет оставаться неприступен, даже если «некоторая» часть текста будет известна. Например, в интернет-протоколах большое количество текста известно. HTTP-сервера всегда отвечают одинаково и первые байты всегда известны. Но этот факт совсем не имеет значения — он не поможет атакующему узнать ни кусочка оставшихся данных… Мы прошли долгий путь со времён Второй мировой войны.
Но есть атаки, которые работают! Если вы отправляете данные по сети и кто-то отслеживает время и размер сообщений, то зашифрованные данные могут быть взломаны с помощью анализа трафика.
Давайте сначала разберёмся с длиной. Очевидно, что длина — это не скрытая характеристика. И это нормально, если вы пытаетесь защитить свой пароль или номер кредитной карты где-то в середине сообщения. Не очень то и большая проблема. Но это означает, что потенциально любой человек может определить тип контента, который вы отправляете. Простой пример: если вы отправляете gif с помощью мессенджера и если размер этого изображения уникален, атакующий, перехватывающий ваши данные, может предположить какая именно гифка была только что отправлена. Есть более хитрые версии этой атаки для Google Maps, Netflix, Wikipedia и т.п. Для защиты от этой атаки можно «добивать» отправляемые сообщения дополнительными байтами, таким образом, чтобы все отправляемые сообщения были одинаковой длины несмотря ни на что. Шифрование, которое используется в военных сетях, всегда «добивает» трафик дополнительными данными, то есть для перехватчика он всегда выглядит одинаковым! Ещё одна проблема, связанная с длиной, заключается в том, что если вы используете сжатие и даёте атакующему возможность изменять любую часть контента на странице, которую видит пользователь, то это даёт возможность атакующему разузнать даже самые маленькие секреты. Поищите атаку под названием «CRIME». Она шикарна и страшна.
Я ещё говорил о том, что другая проблема — тайминг. Очевидно, что время отправки каждого сообщения открытая информация. Это может быть проблемой? Может! Например, если вы отправляете сообщение на каждое нажатие клавиши, тогда тривиально выяснить, что именно печатается с помощью анализа времени. Круто! Другой пример — VOIP. Если ваше приложение для звонков отправляет данные только тогда, когда люди говорят, но не во время молчания, этого достаточно для того, чтобы восстановить 70% английской речи. Всего лишь из тишины. Страшно клёво.
Эти примеры всего лишь верхушка айсберга. Даже когда вы используете алгоритмы и схемы шифрования, которые улучшались в течение 80 лет, всё равно остаются пробелы, с помощью которых можно взломать защиту. Вот почему про это ценно знать!
Как бы то ни было, это тот уровень объяснения, на котором я хочу сейчас остановиться, но мы рассмотрели самое необходимое, что надо знать. Если вы дочитали до этого момента — спасибо! Сейчас у вас должно быть большее понимание того, что происходит при шифровании и чего следует остерегаться.
Перевод публикуется под лицензией CC BY-NC-SA 4.0
Симметричное шифрование
Недавно мы начали разговор о шифровании. Наша цель — написать собственный шифровальщик. А для этого нужно освоить несколько важных принципов и алгоритмов. Начнем с симметричного шифрования, потом рассмотрим асимметричное и дальше всё сложнее.
Принцип работы
Симметричное шифрование работает так:
- Есть данные, которые нужно зашифровать.
- Есть ключ шифрования. С его помощью данные шифруются по какому-то алгоритму.
- Тот, кто обладает ключом и знает алгоритм, может расшифровать сообщение
- Если не знать ключа, то расшифровать данные почти невозможно. Почему почти — расскажем в статье про криптостойкость.
Слово «симметричный» связано с тем, что для шифрования и расшифровки нужен один и тот же ключ. Ключом может быть что угодно: число, слово, фраза, фрагмент текста или файл. Выбор ключа зависит от способа шифрования, но общее правило в симметричном шифровании такое: чем длиннее ключ, тем сложнее его взломать.
Алгоритмы шифрования
Симметричное шифрование в общих чертах работает так:
- Берём ключ и данные, которые нужно зашифровать.
- С помощью математических функций и преобразований мы соединяем ключ и данные. Например, берём каждый байт сообщения, умножаем на число из ключа и получаем новое число. Так делаем с каждым байтом исходного сообщения и на выходе получаем зашифрованные данные — массив из цифр.
- Эти данные можно передавать по любому каналу связи. Даже если их перехватят, то без ключа всё равно не прочитают.
- Получатель берёт этот массив из чисел, делит каждое на число из того же ключа и получает исходное сообщение, которое можно прочитать.
Если этот ключ будет знать кто-то ещё, то он тоже сможет читать и отправлять такие сообщения. А если ключ узнают все, то переписка перестанет быть секретной.
Перемножение — простой алгоритм, который давно не используется в криптографии в чистом виде. Сейчас берут что-то намного более сложное: логарифмы в конечном пространстве, факторизацию и другие математические функции.
Простой пример
Допустим, мы с другом хотим организовать тайную переписку. Для этого мы выбираем число, которое будет нашим секретным ключом. Алгоритм шифрования будет такой:
- Составляем сообщение на русском языке.
- Берём ключ (число) и сдвигаем все символы в сообщении на это число. Например, если ключ равен трём, то А (1-я позиция) сдвигается на три позиции дальше по алфавиту и превращается в Г (4-я позиция), Л превращается в О и так далее. Если при сдвиге мы выходим за границу алфавита, то возвращаемся в начало алфавита и продолжаем отсчёт оттуда.
- Таким способом шифруем всё сообщение, буква за буквой.
- Отдаём шифровку другу.
- Он берёт каждый символ и сдвигает его на три позиции назад по алфавиту. В итоге у него все буквы вернутся на свои места и получится тот текст, который мы отправляли.
Если взять ключ 10 и зашифровать им фразу «Привет, это журнал Код!», то получится так:
Щътлоь, жьш рэъчйх Фшн!
Этот алгоритм слишком прост для современной криптографии, потому что взламывается почти моментально, но для игр в шпионов с детьми — самое то.
Алгоритм из нашего примера называется шифром Цезаря, потому что так римский император шифровал важные сообщения своим генералам.
Плюсы и минусы симметричного шифрования
Симметричное шифрование работает очень быстро, потому что всё сводится к простой математике. А все математические операции выполняются за несколько процессорных тактов, что даёт нам в среднем один-два миллиарда таких действий в секунду. Даже если в алгоритме сложение и умножение выполняются миллион раз, за секунду компьютер может выполнить тысячу таких алгоритмов по шифрованию.
Единственный минус симметричного шифрования — сложность передачи секретного ключа в самом начале от одного участника к другому. Если ключ передать по открытому каналу связи, его могут подсмотреть и читать всю переписку. А чтобы организовать закрытый канал связи, нужен ключ шифрования, который тоже нужно как-то передать. Но если знать асимметричное шифрование, то и эту проблему можно решить. Про асимметричное шифрование — в следующей статье.
Симметричное шифрование в жизни
Почти всё общение в современных мессенджерах построено на симметричном шифровании.
Все наши банковские платежи, переводы и онлайн-оплата тоже шифруется симметричным методом.
Когда мы ставим замок на дверь и даём ключ всем жильцам — это тоже симметричное шифрование. Замок — это шифр, а ключ — это ключ расшифровки. Если вставить не тот ключ, то ничего не произойдёт. Открыть дверь можно только тем ключом, который был от этого замка, и сделать это может только тот, у кого есть этот ключ.
Любая защищённая линия связи, от правительственной до частной, использует симметричное шифрование.
Что дальше
Напишем свой алгоритм симметричного шифрования, чтобы получше разобраться в деталях. А потом поговорим о криптостойкости.
Шифрование: все что нужно знать
Шифрование необходимо для защиты данных от кибератак и любых других случаев получения нежелательного доступа к информации. В статье расскажем, что это такое, какие виды шифрования бывают, а также о вариантах его использования.
Что такое шифрование
Шифрование является средством защиты конфиденциальных данных, хранящихся в компьютерных системах. Сейчас это один из самых популярных и эффективных способов, который повсеместно применяется при обеспечении информационной безопасности. С его помощью можно преобразовать данные в иную форму или код, прочитать которые могут только те пользователи, которые имеют пароль или доступ к ключу дешифрования.
Зашифровка выполняется с помощью специальных алгоритмов, которые постоянно усложняются и совершенствуются, а также ключа. Он генерируется случайным образом и являются уникальными. Получить несанкционированный доступ к информации с помощью подбора (брутфорса) крайне сложно и займёт слишком много времени, чтобы всерьез рассматривать такой вариант.
Получить консультацию об облачных сервисахЗаказать звонок
Какие виды шифрования существуют
Их существует два типа: симметричное и асимметричное. Они отличаются способом применения ключей.
1. Симметричное. Здесь применяется единый симметричный ключ для шифрования и дешифрования. Он должен устанавливаться на устройстве, где происходит кодирование и на том, где декодирование.
Методы симметричного шифрования:
- DES — низкоуровневый алгоритм, который разбивает обычный текст на блоки по 64 бита и преобразует их в зашифрованный текст с использованием ключей на 48 бит.
- Тройной DES запускает шифрование DES три раза, шифруя, расшифровывая и снова шифруя данные.
- Advanced Encryption Standard (AES) – стандарт правительства США, который часто называют золотым стандартом. В нём применяется шифр с размером блока 128 бит, а длина ключа составляет 128, 192 или 256 бит.
- Twofish считается одним из самых быстрых алгоритмов и является бесплатным.
2. Асимметричное (иначе оно называется шифрованием с открытым ключом). В данном случае используется два ключа. Один ключ частный (закрытый), а второй – открытый. Первый, частный, ключ находится на шифрующем устройстве, а второй, открытый, пересылается на устройство, где будет выполняться дешифрование.
В данном случае «открытый» не означает «общедоступный».
Методы ассиметричного шифрования:
- RSA. Алгоритм, где шифрование происходит с помощью открытого ключа, а в расшифровке применяется закрытый ключ.
- PKI Инфраструктура открытых ключей. Это способ управления ключами через выдачу и управление цифровыми сертификатами.
Где используется шифрование
Применение шифрования в качестве средства защиты информации является повсеместным, от смартфонов и фитнес-браслетов до систем «умный дом». Любые данные, которые хранятся или передаются по сети находятся в зашифрованном состоянии.
Оно защищает конфиденциальные данные в процессе финансовых транзакций, сообщения, передаваемы через мессенджеры, криптографические алгоритмы лежат в основе криптовалют. При взаимодействии пользователей с сайтами в интернете криптонадстройка протокола HTTPS шифрует криптографическими протоколами SSL и TLS передаваемую информацию.
В облачных решениях кодирование информации также играет ключевую роль. Шифрование виртуальной машины позволяет обезопасить данные, расположенные на виртуальном жестком диске. С его помощью можно хранить файлы (конфигурацию и содержимое виртуальных дисков, снапшоты) виртуальной машины в зашифрованном виде.
Какой способ выбрать
Для защиты данных можно применять три вида шифрования: аппаратное, программное и программно-аппаратное. Каждый из них шифрует данные через криптографический алгоритм, но есть разница в реализации процесса.
Программное. Это более дешёвый, но менее надёжный способ. Для кодирования оно использует процессор компьютера. Пароль задаётся пользователем. Подходит для защиты домашних ПК, а также не слишком критичных корпоративных данных.
Аппаратное использует для работы собственный процессор и является более надёжным. Пароль создаётся генератором случайных чисел. Подходит для защиты критически важной информации: денежных транзакций, разработок компании и т.п.)
Глубокое погружение в мир сквозного шифрования: принципы работы систем криптографии с открытым ключом

При правильном использовании сквозное шифрование может обеспечить защиту содержимого ваших сообщений. Текст (как и файл) будет доступен лишь тем, кому он предназначался. Сквозное шифрование также может быть использовано для проверки целостности сообщения и подлинности личности отправителя.
За последние несколько лет популярность инструментов сквозного шифрования значительно возросла. Инструменты для безопасного обмена сообщениями, такие как Signal (для iOS или Android), используемые для голосовых и видеозвонков, чатов и обмена файлами, являются отличными примерами приложений, использующих сквозное шифрование для кодирования сообщений. Эти инструменты превращают сообщения в нечитаемую форму как для шпионов в сети, так и для самих поставщиков услуг.
Однако некоторые варианты реализации сквозного шифрования могут оказаться достаточно сложными для понимания и использования. Перед применением инструментов, использующих сквозное шифрование, мы настоятельно рекомендуем посвятить некоторое время изучению основ криптографии с открытым ключом.
Тип шифрования, о котором говорится в настоящем руководстве и на котором основываются инструменты, обеспечивающие сквозное шифрование, называется шифрованием с открытым ключом или криптографией с открытым ключом. Чтобы узнать о других видах шифрования, ознакомьтесь с нашим руководством «Что мне нужно знать о шифровании?»

Понимание основополагающих принципов криптографии с открытым ключом поможет вам в успешном применении данных инструментов. Есть то, на что шифрование с открытым ключом способно, и то, чего оно не может. И важно понять, когда и как, вам, возможно, понадобится его использовать.
Что делает шифрование? anchor link
Схема работы шифрования при отправлении тайного послания:
- Ясно читаемое сообщение («Привет, мама») зашифровано и превращено в сообщение, которое никому не будет понятно («OhsieW5ge+osh1aehah6»).
- Зашифрованное сообщение отправлено через интернет, где посторонние смогут увидеть лишь «OhsieW5ge+osh1aehah6».
- По прибытию к предполагаемому получателю только он будет обладает способом превращения послания обратно в исходное сообщение («Привет, мама»).
Симметричное шифрование: история передачи тайного послания с помощью одного ключа anchor link
Юлия хочет отправить своему другу Сезару записку с текстом: «Встретимся в саду» (meet me in the garden). Но она бы не хотела, чтобы её одноклассники увидели это послание.

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

Юлия решает зашифровать своё сообщение с помощью ключа 3, сдвигая буквы алфавита по порядку на 3. Таким образом буква «А» стала буквой «Г», буква «Б» стала «Д» и т.д. Если Юлия и Сезар просто будут использовать этот ключ для шифрования и расшифровывания сообщений, этот код будет легко взломать. Кто-либо сможет путём перебора возможных комбинаций установить подходящий ключ. Другими словами, можно настойчиво пытаться угадать ключ до тех пор, пока сообщение не будет расшифровано.


Способ сдвига букв алфавита на три символа является историческим примером шифрования, использовавшегося Юлием Цезарем. Этот способ называется «Шифр Цезаря». Когда один и тот же ключ используется для шифрования и расшифровывания (как в указанном примере, где ключом является цифра 3), то шифрование называется симметричным.
Шифр Цезаря является слабой формой симметричного шифрования. Однако со времён Юлия Цезаря шифрование существенно эволюционировало. С помощью математики и компьютеров мы имеем возможность сгенерировать ключ, который будет намного длиннее и который намного сложнее угадать. Существенное развитие симметричного шифрования сказалось и на широком его применении.
Тем не менее симметричное шифрование не поможет, если кто-то украдёт ключ для расшифровывания сообщений Юлии и Сезара (можно просто подслушать его, когда кто-либо из них скажет другому, что ключ для расшифровывания это «3»). А что, если Юлия и Сезар находятся в разных странах и не могут лично встретиться?
Как Сезар и Юлия могут решить эту проблему?

Допустим, Юлия и Сезар узнали о криптографии с открытым ключом. Злоумышленник просто не сможет подслушать или перехватить передачу ключа расшифровывания, потому что Сезару и Юлии не нужно обмениваться ключом расшифровывания. При использовании шифрования с открытым ключом ключи шифрования и расшифровывания — разные.
Шифрование с открытым ключом: сказание о двух ключах anchor link

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

Криптография с открытым ключом (именуемая также асимметричной криптографией) имеет изящное решение этой проблемы. Шифрование с открытым ключом предполагает создание каждым собеседником пары ключей – открытого ключа (public key) и закрытого ключа (private key). Эти два ключа связаны друг с другом и являются очень большими числами с определёнными математическими свойствами. Если вы зашифруете сообщение, используя открытый ключ собеседника, расшифровать это сообщение можно лишь с помощью соответствующего закрытого ключа.
Сейчас вместо передачи записок Юлия и Сезар обмениваются зашифрованными сообщениями через компьютеры, используя при этом открытые ключи шифрования. Их одноклассники, передающие записки с парты на парту, заменены компьютерами. Однако между Юлией и Сезаром есть такие же посредники – их точки доступа Wi-Fi, интернет провайдеры, почтовые сервера. В реальности между Юлией и Сезаром могут находиться сотни компьютеров, обслуживающих их общение. Эти посредники каждый раз делают копии сообщений Юлии и Сезара и хранят их.

Юлия и Сезар не против того, чтобы посредники знали, что они общаются, но хотели бы оставить содержание своего общения в тайне.
Для начала Юлии необходимо получить открытый ключ Сезара. Он отправляет свой открытый ключ (в виде файла) по незащищённому каналу связи, например в незашифрованном сообщении электронной почты. Он не против того, чтобы посредники получили доступ к его открытому ключу, потому что открытый ключ может свободно распространяться. Имейте в виду, что здесь метафора с ключом перестаёт быть подходящей – не нужно отождествлять открытый ключ с реальным ключом от замка. Сезар отправляет свой открытый ключ по множеству каналов связи, поэтому посредник не сможет подменить его на свой открытый ключ, отправив его Юлии вместо подлинного.

Юлия получает файл, содержащий открытый ключ Сезара. И теперь она может зашифровать своё сообщение Сезару этим ключом! Она пишет в сообщении: «Встретимся в саду».
Она отправляет зашифрованное сообщение. И оно зашифровано лишь для Сезара.


И Юлия и Сезар смогут прочесть сообщение, но для всех остальных оно будет выглядеть как бред. Посредники смогут видеть метаданные письма, например строку «тема», дату и время отправки, адреса отправителя и получателя сообщения.

Так как сообщение зашифровано с помощью открытого ключа Сезара, прочитать сообщение смогут лишь сам Сезар и отправитель (Юлия).
Сезар может прочитать это сообщения, используя свой закрытый ключ.

- Шифрование (криптография) с открытым ключом позволяет отправить свой открытый ключ по небезопасным каналам связи.
- С помощью имеющегося открытого ключа друга вы сможете зашифровать сообщения для него.
- Ваш закрытый ключ используется для расшифровывания сообщений, зашифрованных с помощью вашего открытого ключа.
- Посредники – такие как сервера электронной почты, интернет провайдеры – могут постоянно видеть метаданные: кто кому отправляет сообщения, когда и в какое время сообщение получено, что содержится в поле «тема», зашифровано ли сообщение и т.д.
Другая проблема: если злоумышленник захочет выдать себя за вашего собеседника? anchor link
В нашем примере с Юлией и Сезаром посредники постоянно способны получать метаданные.

Допустим, что один из посредников оказался злоумышленником. Под злоумышленником мы будем подразумевать любого, кто намеревается нанести вам урон, пытаясь украсть либо подменить ваши данные . И по какой-либо причине наш злоумышленник желает узнать о содержимом сообщения Юлии для Сезара.
Допустим, этот злоумышленник смог обмануть Юлию, и она получила подложный файл открытого ключа «Сезара». Юлия не заметила, что это на самом деле не открытый ключ Сезара. Злоумышленник получает сообщение Юлии, просматривает его и передает дальше Сезару.

Злоумышленник может даже изменить содержимое сообщения (файла) перед тем, как передать его Сезару.

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

Это называется «атакой посредника», где посредником может оказаться человек либо компьютер.
К счастью, использование шифрования с открытым ключом способно предотвратить атаку посредника.
Шифрование с открытым ключом позволяет осуществить двойную проверку соответствия цифрового ключа и личности собеседника посредством так называемой «проверки отпечатков». Лучше всего такую проверку осуществлять при личной встрече. Ваш собеседник сравнит каждый символ отпечатка открытого ключа, предоставленного вами, с отпечатком вашего открытого ключа, находящегося у собеседника. Немного утомительно, но это действительно стоит сделать.

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


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



- Атака посредника – перехват злоумышленником сообщения, предназначенного вашему собеседнику. Атакующий может внести изменения в это сообщение, а может переслать его дальше, просто ознакомившись с содержимым.
- Криптография (шифрование) с открытым ключом позволяет противостоять атаке посредника с помощью проверки личностей отправителя и получателя. Это делается с помощью проверки отпечатков ключей.
- Открытый ключ вашего собеседника используется для шифрования сообщений, отправляемых ему. У каждого открытого ключа есть сокращенная версия — так называемый «отпечаток открытого ключа». Вы можете использовать его для проверки личности вашего собеседника.
- Закрытый ключ используется для шифрования сообщений в качестве цифровой подписи, подтверждающей ваше авторство.
Не забудьте подписаться! anchor link
При использовании шифрования с открытым ключом вам не обязательно каким-то образом передавать получателю сообщения ключ для расшифровывания, потому что у него уже есть этот ключ. Ключом для расшифровывания сообщения является закрытый ключ получателя. Таким образом, для отправки зашифрованного сообщения вам нужен лишь подходящий открытый ключ получателя. А его вы можете с лёгкостью получить, потому что получатель волен свободно им обмениваться с кем угодно, так как открытый ключ подходит лишь для шифрования сообщений, а не для их расшифровывания.
Но есть кое-что ещё! Мы знаем, что, зашифровав сообщение определённым открытым ключом, расшифровать его можно лишь с помощью соответствующего закрытого ключа. Но обратное утверждение будет также верно. При шифровании сообщения с помощью определённого закрытого ключа, расшифровать его можно, лишь используя соответствующий открытый ключ.
Какова польза от этого? На первый взгляд кажется, что преимуществ в шифровании сообщений своим закрытым ключом нет никаких, ведь их сможет расшифровать любой, у кого окажется открытый ключ. Но представьте, что вы напишите в сообщении: «Я должен заплатить Борису 100 долларов», а затем зашифруете его своим закрытым ключом. Расшифровать это сообщение сможет любой, у кого окажется ваш открытый ключ. Однако написать данное сообщение могли только вы – обладатель закрытого ключа, при условии, что вы надёжно храните свой закрытый ключ. В результате, подписав сообщение своим закрытым ключом, вы подтверждаете, что данное сообщение могло быть отправлено только вами. Другими словами, с цифровым сообщением вы делаете то же самое, что и с обычным письмом на бумаге, когда подписываете его.
Подписывая письмо, вы также защищаете его от внесения в него изменений со стороны злоумышленника. Если кто-либо изменит содержимое сообщения с «Я должен заплатить Борису 100 долларов» на «Я должен заплатить Владимиру 100 долларов», то он не сможет снова подписать это сообщение вашим закрытым ключом. Таким образом, подписывая письмо закрытым ключом, вы гарантируете, что сообщение действительно пришло от вас и что в пути следования в него не было внесено никаких изменений.
Повторим: использование шифрования с открытым ключом anchor link
Давайте повторим основные положения. Шифрование с открытым ключом позволяет вам зашифровывать и безопасно отправлять сообщения любому человеку, чей открытый ключ у вас имеется.
Если другим людям известен ваш открытый ключ:
- — они могут посылать вам зашифрованные сообщения, и только вы можете их расшифровать, используя свой соответствующий закрытый ключ, а также
- — вы можете подписывать сообщения своим закрытым ключом, чтобы получатели были уверены в том, что сообщения могли прийти только от вас.
Если вы знаете чей-то открытый ключ:
- Вы сможете расшифровать сообщение, подписанное этим человеком, и быть уверенным в том, что это сообщение могло прийти лишь от него.
Теперь должно быть понятно, что криптография с открытым ключом становится тем более полезной, чем больше людей обладают вашим открытым ключом. Публичным ключом можно и нужно делиться с максимально большим количеством людей, особенно с теми, с кем вы постоянно общаетесь. И не важно, что этот ключ может оказаться у посторонних, ведь любой, кто захочет отправить вам зашифрованное сообщение, сможет им воспользоваться лишь для того, чтобы зашифровать сообщение.
Файл открытого ключа создаётся в паре с файлом закрытого ключа. Аналогия закрытого ключа – реальный ключ от замка, который вы должны хранить в надёжном месте. Закрытый ключ используется для шифрования и расшифровывания сообщений.
Также должно быть очевидно, что вы должны хранить свой закрытый ключ в полной безопасности. Если вы случайно удалите закрытый ключ с вашего устройства, то не сможете прочитать адресованные вам зашифрованные сообщения. Если же кто-то скопирует ваш закрытый ключ (получив доступ к вашему компьютеру физически или с помощью вредоносного ПО, а также если вы случайно опубликовали свой закрытый ключ или поделились им с кем-то), то посторонние смогут прочитать зашифрованные сообщения, отправленные вам. А также они смогут выдавать себя за вас и подписывать сообщения от вашего имени.
Для правительственных служб стало обыденной практикой получение закрытых ключей определённых людей (путём изъятия компьютеров или установки на них вредоносных программ с использованием физического доступа или фишинговых атак). Это полностью нивелирует все ваши усилия по защите конфиденциальности с помощью шифрования. Это похоже на то, что вы установили на входную дверь замок, который невозможно взломать. Однако на улице ваш ключ выкрали из кармана, скопировали его и незаметно вернули обратно в ваш карман. Таким образом злоумышленники получили возможность проникать в ваш дом, даже не взламывая замок, а вы можете этого и не заметить.

Это возвращает нас к моделированию угроз: определите риски и учтите их надлежащим образом. Если вы чувствуете, что кто-либо пойдёт на многое, лишь бы заполучить ваш закрытый ключ, то вы, возможно, откажетесь от использования встроенного в браузер сквозного шифрования. Вместо этого вы можете просто сохранить свой закрытый ключ на своём устройстве (компьютере), а не на чужом (в облаке или на сервере).
Обзор шифрования (криптографии) с открытым ключом и конкретный пример: PGP. anchor link
Итак, мы отдельно рассмотрели симметричное шифрование и шифрование с открытым ключом. Однако следует отметить, что шифрование с открытым ключом также использует симметричное шифрование! С помощью шифрования с открытым ключом просто зашифровывается симметричный ключ, используемый впоследствии для расшифровывания сообщения.

PGP является протоколом, использующим как симметричную криптографию, так и криптографию с открытым ключом (асимметричную). Использование сквозного шифрования, реализованного в PGP, позволит вам подробно изучить методы применения шифрования с открытым ключом.
Чем являются эти ключи? И как они связаны друг с другом? anchor link
Шифрование с открытым ключом основано на существовании двух ключей: один ключ для шифрования и один ключ для расшифровывания. Принцип работы заключается в безопасности передачи открытого ключа по небезопасному каналу, например через интернет. Вы можете публиковать этот открытый ключ везде, где посчитаете нужным, не опасаясь за конфиденциальность содержимого своих зашифрованных сообщений.

Этот общедоступный ключ является открытым ключом – файлом, который вы можете рассматривать в качестве вашего адреса в телефонной книге и распространять его как можно шире. Люди смогут связаться с вами, зашифровав сообщение с помощью этого ключа.
Файл открытого ключа создаётся в паре с файлом закрытого ключа. Вы можете представить, что закрытый ключ — это реальный ключ от замка, который вы должны надёжно хранить в безопасном месте. Закрытый ключ используется для шифрования и расшифровывания сообщений.
Мы собираемся изучить процесс создания ключей в широко используемом алгоритме шифрования с открытым ключом, который называется RSA (Rivest-Shamir-Adleman). Алгоритм RSA часто используется для создания пар ключей для PGP-шифрования электронной почты.


Открытый и закрытый ключи генерируются одновременно и связываются вместе. Оба ключа основаны на одних и тех же громадных простых числах, держащихся в секрете. Закрытый ключ — это представление двух таких чисел, вычисленное посредством определённого алгоритма. А открытый ключ – это произведение тех же двух чисел, которые использовались для создания закрытого ключа. Что удивительно, так это то, что очень трудно выяснить, какие именно два больших простых числа создали конкретный открытый ключ.
Поиск двух первоначальных простых чисел называется факторизацией; и она является весьма сложной и трудоёмкой задачей для компьютерных систем, чем и пользуются некоторые варианты шифрования с открытым ключом. Современная криптография позволяет использовать случайно выбранные, абсурдно гигантские простые числа, которые трудно угадать как людям, так и компьютерам.
А преимущество всего этого состоит в том, что люди могут делиться друг с другом своими открытыми ключами по незащищённым каналам! Но при этом свой закрытый ключ (алгоритмическое представление первоначальных простых чисел), используемый для расшифровывания сообщений, нельзя никому и никогда раскрывать.
Напоминаем: для использования шифрования с открытым ключом отправителю и получателю необходимы открытые ключи друг друга.
Можно представить себе это иначе: открытый ключ и закрытый ключ связаны друг с другом как символ инь-янь. Они сплетены в единое целое.

Открытым ключом можно как свободно обмениваться, так и искать его. Вы можете разослать его кому угодно. Вы можете разместить открытый ключ в социальных сетях, если вас не смущает публичное оглашение адреса вашей электронной почты. Также вы можете разместить его на своём личном сайте. Вы можете свободно публиковать открытые ключи.
Закрытый ключ должен храниться в безопасности, неподалёку. Он должен быть у вас лишь в одном экземпляре. Нельзя его терять, делиться им или делать копии, которые могут достаться кому-либо ещё, так как всё это крайне усложнит задачу по обеспечению конфиденциальности ваших личных сообщений.
Как работает PGP anchor link
Давайте ознакомимся с работой шифрования с открытым ключом на примере PGP. Допустим, вы хотите отправить Артёму секретное сообщение:
- У Артёма есть закрытый ключ и, как опытный пользователь шифрования с открытым ключом, он разместил соответствующий открытый ключ на своём (HTTPS) сайте.
- Вы скачиваете его открытый ключ.
- Вы зашифровываете сообщение для Артёма, используя его открытый ключ, и отправляете ему.
- Лишь Артём сможет расшифровать ваше сообщение, потому что только у него есть соответствующий закрытый ключ.
PGP (Pretty Good Privacy) в основном занимается рутиной создания и использования открытых и закрытых ключей. С помощью PGP вы можете создать пару ключей (открытый и закрытый ключи), защитить закрытый ключ паролем и использовать его вместе с вашим открытым ключом для подписи и шифрования сообщений.
Если из всего сказанного в данном руководстве нужно было бы выделить что-то одно, то это была бы фраза: храните свой закрытый ключ в надёжном месте и защитите его длинной парольной фразой.
Метаданные. На что неспособно шифрование с открытым ключом anchor link
Шифрование с открытым ключом нужно для того, чтобы содержимое сообщения осталось в тайне, было подлинно и не могло быть взломано. Но перечисленное не отражает все возможные проблемы, связанные с обеспечением конфиденциальности. Как мы уже отмечали, информация о ваших сообщениях может быть такой же показательной, как и их содержание (см. «метаданные»).
Если вы обмениваетесь зашифрованными сообщениями с известным в вашей стране диссидентом, то у вас могут быть неприятности лишь из-за факта обычного общения с ним, даже и без расшифровывания этих сообщений. А в некоторых странах вам может грозить тюремное заключение за отказ расшифровать сообщения.
Скрыть факт общения с конкретным человеком сложнее. При использовании PGP одним из способов является использование обоими собеседниками анонимных ящиков электронной почты. Заходить на них необходимо лишь с помощью Tor. Поступая так, вы будете использовать преимущества PGP, обеспечивая конфиденциальность ваших сообщений и уверенность в том, что никто не может подменить содержимое и авторство этих сообщений.
Теперь, когда вы узнали о шифровании с открытым ключом, попробуйте использовать один из инструментов сквозного шифрования, например Signal для iOS или Android.