Один секрет на двоих
Один секрет на двоих: как работает симметричное шифрование
Представьте, что Алиса хочет передать Борису конфиденциальный документ. Они кладут его в ящик и закрывают на ключ. У Бориса есть копия того же ключа, поэтому он может открыть ящик и прочитать документ.
Главное условие: ключ должен быть только у Алисы и Бориса. Если посторонний получит копию, он сможет открыть все сообщения, защищённые этим ключом.
По похожему принципу работает симметричное шифрование: отправитель и получатель используют один общий секрет.
Это самый старый и интуитивно понятный вид шифрования, но он по-прежнему применяется почти повсюду — в защищённых интернет-соединениях, мессенджерах, корпоративных системах, архивах и шифровании дисков.
Один ключ для шифрования и расшифрования
В симметричной криптографии используется общий секретный ключ.
Упрощённо процесс выглядит так:
Исходный документ + Секретный ключ ↓ Шифрование ↓ Шифртекст ↓ Расшифрование + Тот же секретный ключ ↓ Исходный документ
До шифрования данные называются открытым текстом. Это может быть не только обычный текст, но и PDF-файл, фотография, видеозапись, архив или любой другой набор байтов.
После шифрования получается шифртекст — данные, содержание которых должно быть невозможно понять без ключа.
Например:
Открытый текст: Оплатить счёт до 15 августа. ↓ шифрование Шифртекст: 8F A1 37 0C 92 5D ...
Реальный шифртекст обычно представляет собой двоичные данные. Показанная последовательность нужна только для иллюстрации.
Получатель применяет к шифртексту алгоритм расшифрования и тот же секретный ключ. Если ключ правильный, восстанавливаются исходные данные.
Именно поэтому такой метод называется симметричным: обе стороны обладают одним общим секретом.
Что важнее: секретный алгоритм или секретный ключ
Кажется логичным спрятать не только ключ, но и сам способ шифрования. Например, придумать собственную замену букв и никому не рассказывать правила.
Современная криптография устроена иначе.
Алгоритмы шифрования обычно открыты: их устройство публикуют, изучают и годами проверяют специалисты. Секретным должен оставаться ключ, а не принцип работы алгоритма.
Это можно сравнить с дверным замком:
устройство замка может быть известно производителю, инженерам и специалистам по безопасности;
надёжность не должна исчезать только потому, что кто-то узнал модель замка;
открыть конкретную дверь всё равно должен позволять только подходящий ключ.
В криптографии действует тот же принцип:
Система должна оставаться защищённой, даже если злоумышленнику известен алгоритм. Секретом остаётся только ключ.
Открытость алгоритма позволяет исследователям искать слабые места до того, как технология начнёт широко использоваться. Самодельный «секретный шифр» обычно не проходит такую проверку и может содержать незаметные для автора ошибки.
Ключ — это не пароль
В бытовой речи слова «ключ» и «пароль» иногда используют как синонимы, но в криптографии это разные понятия.
Криптографический ключ — это последовательность битов определённой длины, подходящая для конкретного алгоритма.
Например, ключ можно условно представить так:
10110100 01101011 11000010 ...
Настоящий ключ намного длиннее этой строки.
Пароль создаёт человек, поэтому часто выбирает что-то запоминающееся:
Moscow2014
Такой пароль может быть слишком коротким или предсказуемым. Его нельзя просто считать полноценным криптографическим ключом.
Если система шифрует данные по паролю, обычно используется специальный алгоритм выработки ключа. Он преобразует пароль в криптографический ключ и намеренно усложняет массовый перебор вариантов.
Но даже хорошее преобразование не делает слабый пароль сильным. Если пароль легко угадать, злоумышленник может перебирать варианты, пока не получит правильный ключ.
Поэтому случайно созданные криптографические ключи обычно надёжнее паролей, придуманных человеком.
Как алгоритм шифрует большой файл
Файл может занимать несколько байтов, мегабайт или гигабайт. При этом многие современные симметричные алгоритмы являются блочными шифрами: они преобразуют данные порциями фиксированного размера.
Представим длинный документ:
Документ: ┌────────┬────────┬────────┬────────┐ │ Блок 1 │ Блок 2 │ Блок 3 │ Блок 4 │ └────────┴────────┴────────┴────────┘
Блочный алгоритм умеет преобразовать один блок фиксированной длины. Но простого независимого шифрования каждого блока недостаточно.
Если одинаковые фрагменты исходных данных всегда превращаются в одинаковые фрагменты шифртекста, в зашифрованных данных могут сохраниться закономерности. Содержание останется скрытым, но структура иногда выдаст лишнюю информацию.
Поэтому блочные шифры применяются в специальных режимах работы. Режим определяет, как обрабатывать последовательность блоков, как связывать их между собой и какие дополнительные значения использовать.
Упрощённо:
Блочный шифр + Режим работы + Ключ ↓ Шифрование данных произвольного размера
Один и тот же базовый алгоритм в разных режимах может обладать разными свойствами. Поэтому при оценке системы важно знать не только название шифра, но и способ его применения.
В российских стандартах алгоритмы блочного шифрования «Кузнечик» и «Магма» определены ГОСТ 34.12-2018, а правила применения блочных шифров в различных режимах — ГОСТ 34.13-2018.
Зачем нужно начальное значение
Во многих режимах вместе с ключом используется дополнительное значение — например, вектор инициализации или одноразовый параметр, который часто называют nonce.
Его задача — сделать так, чтобы одинаковые данные, зашифрованные одним ключом в разных случаях, не обязательно давали одинаковый шифртекст.
Представим, что Алиса дважды отправляет одно и то же сообщение:
Перевести 10 000 рублей.
Без дополнительного изменяющегося параметра две зашифрованные версии могут оказаться одинаковыми. Наблюдатель не прочитает сообщение, но заметит, что оно повторилось.
С разными начальными значениями результат будет различаться:
Сообщение + ключ + начальное значение № 1 ↓ Шифртекст A Сообщение + тот же ключ + начальное значение № 2 ↓ Шифртекст B
При этом исходное сообщение одно и то же.
Начальное значение часто не требуется скрывать и может передаваться вместе с шифртекстом. Но это не означает, что с ним можно обращаться как угодно.
В зависимости от режима оно должно быть уникальным, непредсказуемым или соответствовать другим требованиям. Повтор или неправильное формирование такого значения может серьёзно ослабить защиту, даже если сам ключ остаётся секретным.
Именно поэтому криптографические алгоритмы нельзя безопасно собирать «на глаз» из отдельных деталей. Важно правильно использовать всю схему целиком.
Шифрование не всегда защищает от изменения
Допустим, злоумышленник перехватил зашифрованный документ. Он не знает ключ и не может прочитать содержание.
Означает ли это, что он не может изменить данные? Не всегда!
Обычное шифрование прежде всего решает задачу конфиденциальности — скрывает содержание. В зависимости от используемой схемы изменение нескольких байтов шифртекста может привести к изменению расшифрованных данных или просто повредить сообщение.
Получателю нужен способ обнаружить вмешательство.
Для этого могут использоваться:
код аутентификации сообщения — MAC;
имитовставка;
режим аутентифицированного шифрования, который одновременно защищает конфиденциальность и позволяет проверить целостность данных.
Упрощённо защищённая схема выглядит так:
Исходные данные + Секретный ключ ↓ Шифрование и контроль целостности ↓ Шифртекст + проверочное значение
Получатель проверяет не только возможность расшифрования, но и корректность контрольного значения. Если данные были изменены, проверка должна завершиться ошибкой.
Это важный принцип:
Данные должны быть не только скрыты, но и защищены от незаметной подмены.
Современные протоколы часто используют аутентифицированное шифрование, чтобы решать обе задачи одновременно.
Почему симметричное шифрование используется повсюду
У симметричных алгоритмов есть важное преимущество — высокая скорость.
Они подходят для обработки больших объёмов данных:
сетевого трафика;
резервных копий;
жёстких дисков и съёмных накопителей;
баз данных;
архивов;
видеопотоков;
файлов любого размера.
Когда браузер устанавливает защищённое соединение с сайтом, асимметричная криптография может использоваться для аутентификации и согласования общего секрета. После этого основной поток данных обычно защищается быстрым симметричным шифрованием.
Получается разделение ролей:
Асимметричная криптография Помогает установить доверие и согласовать секрет ↓ Симметричная криптография Быстро защищает основной объём данных
Асимметричные методы не вытеснили симметричное шифрование. На практике они часто дополняют друг друга.
Главная проблема: как передать общий секрет
Вернёмся к Алисе и Борису.
Чтобы обмениваться зашифрованными документами, им нужен общий ключ. Но как передать его безопасно?
Если отправить ключ по обычной электронной почте, его могут перехватить.
Если положить ключ рядом с зашифрованным файлом, защита потеряет смысл.
Если заранее встретиться и передать ключ лично, это может сработать для двух людей. Но такой подход плохо масштабируется.
Представим организацию из 100 сотрудников. Если каждой паре нужен собственный общий ключ, количество связей быстро растёт.
Для трёх участников:
Алиса ─── Борис │ │ └─── Виктор
Нужно три общих секрета.
Для сотен или тысяч участников хранение, распределение, замена и отзыв общих ключей превращаются в сложную задачу.
Это называется проблемой распределения ключей.
Симметричное шифрование прекрасно защищает данные, когда общий секрет уже есть. Но оно само по себе не объясняет, как незнакомым участникам безопасно получить этот секрет через недоверенную сеть.
Именно эта проблема стала одной из причин развития асимметричной криптографии.
Почему общий секрет не заменяет электронную подпись
Предположим, у Алисы и Бориса есть общий секретный ключ. Алиса создаёт для документа специальный код проверки — MAC.
Борис проверяет код и убеждается:
документ не изменился;
код создал кто-то, кто знает общий секрет.
Но этот общий секрет знают оба.
Поэтому Борис технически мог создать такой же код самостоятельно. Если позже возникнет спор, третья сторона не сможет по одному MAC определить, кто именно его сформировал — Алиса или Борис.
Общий секрет хорошо подходит для взаимной защиты участников, которые доверяют друг другу и совместно владеют ключом. Но он не создаёт отдельного проверяемого секрета, принадлежащего только одному подписанту.
В электронной подписи роли разделены:
закрытый ключ хранится только у подписанта;
открытый ключ можно передать всем проверяющим.
Это позволяет проверять подпись, не выдавая другим участникам возможность создавать новые подписи от имени владельца ключа.
Как симметричное шифрование связано с электронной подписью
Симметричное шифрование и электронная подпись решают разные задачи.
Технология | Основная задача | Кто знает секрет |
Симметричное шифрование | Скрыть содержание данных | Все участники, которым разрешено шифровать и расшифровывать |
MAC или имитовставка | Проверить целостность и знание общего секрета | Все участники с общим секретом |
Электронная подпись | Проверить целостность и соответствие подписи закрытому ключу подписанта | Закрытый ключ знает только подписант |
Подписанный документ при этом не обязан быть зашифрован. Его содержание может быть открыто, а электронная подпись будет защищать возможность проверки целостности и подлинности подписи.
Если документ одновременно нужно скрыть от посторонних и подписать, могут применяться обе технологии:
Документ ↓ Электронная подпись ↓ Шифрование ↓ Защищённая передача
Конкретный порядок операций зависит от используемого формата и протокола.
Резюме
Симметричное шифрование использует один общий секретный ключ.
Оно:
быстро обрабатывает большие объёмы данных;
скрывает содержание от тех, у кого нет ключа;
требует безопасного хранения и распределения общего секрета;
само по себе не решает задачу электронной подписи.
Главная трудность возникает ещё до начала защищённого обмена:
Как двум участникам договориться о секрете, если они ещё не имеют защищённого канала?
Ответ дала асимметричная криптография. Вместо одного общего секрета в ней используются два связанных ключа: закрытый и открытый.
В следующей статье: «Два ключа вместо одного: как работает асимметричная криптография».