Недавно мы начали разговор о шифровании. Наша цель — написать собственный шифровальщик. А для этого нужно освоить несколько важных принципов и алгоритмов. Начнем с симметричного шифрования, потом рассмотрим асимметричное и дальше всё сложнее.
Принцип работы
Симметричное шифрование работает так:
- Есть данные, которые нужно зашифровать.
- Есть ключ шифрования. С его помощью данные шифруются по какому-то алгоритму.
- Тот, кто обладает ключом и знает алгоритм, может расшифровать сообщение
- Если не знать ключа, то расшифровать данные почти невозможно. Почему почти — расскажем в статье про криптостойкость.
Слово «симметричный» связано с тем, что для шифрования и расшифровки нужен один и тот же ключ. Ключом может быть что угодно: число, слово, фраза, фрагмент текста или файл. Выбор ключа зависит от способа шифрования, но общее правило в симметричном шифровании такое: чем длиннее ключ, тем сложнее его взломать.
Алгоритмы шифрования
Симметричное шифрование в общих чертах работает так:
- Берём ключ и данные, которые нужно зашифровать.
- С помощью математических функций и преобразований мы соединяем ключ и данные. Например, берём каждый байт сообщения, умножаем на число из ключа и получаем новое число. Так делаем с каждым байтом исходного сообщения и на выходе получаем зашифрованные данные — массив из цифр.
- Эти данные можно передавать по любому каналу связи. Даже если их перехватят, то без ключа всё равно не прочитают.
- Получатель берёт этот массив из чисел, делит каждое на число из того же ключа и получает исходное сообщение, которое можно прочитать.
Если этот ключ будет знать кто-то ещё, то он тоже сможет читать и отправлять такие сообщения. А если ключ узнают все, то переписка перестанет быть секретной.
👉 Перемножение — простой алгоритм, который давно не используется в криптографии в чистом виде. Сейчас берут что-то намного более сложное: логарифмы в конечном пространстве, факторизацию и другие математические функции.
Простой пример
Допустим, мы с другом хотим организовать тайную переписку. Для этого мы выбираем число, которое будет нашим секретным ключом. Алгоритм шифрования будет такой:
- Составляем сообщение на русском языке.
- Берём ключ (число) и сдвигаем все символы в сообщении на это число. Например, если ключ равен трём, то А (1-я позиция) сдвигается на три позиции дальше по алфавиту и превращается в Г (4-я позиция), Л превращается в О и так далее. Если при сдвиге мы выходим за границу алфавита, то возвращаемся в начало алфавита и продолжаем отсчёт оттуда.
- Таким способом шифруем всё сообщение, буква за буквой.
- Отдаём шифровку другу.
- Он берёт каждый символ и сдвигает его на три позиции назад по алфавиту. В итоге у него все буквы вернутся на свои места и получится тот текст, который мы отправляли.
Если взять ключ 10 и зашифровать им фразу «Привет, это журнал Код!», то получится так:
Щътлоь, жьш рэъчйх Фшн!
Этот алгоритм слишком прост для современной криптографии, потому что взламывается почти моментально, но для игр в шпионов с детьми — самое то.
👉 Алгоритм из нашего примера называется шифром Цезаря, потому что так римский император шифровал важные сообщения своим генералам.
Плюсы и минусы симметричного шифрования
Симметричное шифрование работает очень быстро, потому что всё сводится к простой математике. А все математические операции выполняются за несколько процессорных тактов, что даёт нам в среднем один-два миллиарда таких действий в секунду. Даже если в алгоритме сложение и умножение выполняются миллион раз, за секунду компьютер может выполнить тысячу таких алгоритмов по шифрованию.
Единственный минус симметричного шифрования — сложность передачи секретного ключа в самом начале от одного участника к другому. Если ключ передать по открытому каналу связи, его могут подсмотреть и читать всю переписку. А чтобы организовать закрытый канал связи, нужен ключ шифрования, который тоже нужно как-то передать. Но если знать асимметричное шифрование, то и эту проблему можно решить. Про асимметричное шифрование — в следующей статье.
Симметричное шифрование в жизни
Почти всё общение в современных мессенджерах построено на симметричном шифровании.
Все наши банковские платежи, переводы и онлайн-оплата тоже шифруется симметричным методом.
Когда мы ставим замок на дверь и даём ключ всем жильцам — это тоже симметричное шифрование. Замок — это шифр, а ключ — это ключ расшифровки. Если вставить не тот ключ, то ничего не произойдёт. Открыть дверь можно только тем ключом, который был от этого замка, и сделать это может только тот, у кого есть этот ключ.
Любая защищённая линия связи, от правительственной до частной, использует симметричное шифрование.
Что дальше
Напишем свой алгоритм симметричного шифрования, чтобы получше разобраться в деталях. А потом поговорим о криптостойкости.