В какой-то момент, многие разработчики задумываются о том, что они вполне себе могут придумать какой-то хитрый алгоритм шифрования, который никто не сможет взломать просто потому, что никому о нём не расскажет: это легко ломать те алгоритмы, которые известны (перебором например), а вот он-дескать не такой. Он так зашифрует, что ничего никто не расшифрует. Никогда! И предлагает пример xor-шифрования. На практике такие шифры ломаются спецами с карандашом и бумажкой в руках; даже компьютер не нужен. В данной статье я рассмотрю только симметричные ключи (где ключ шифрования и ключ дешифрирования - одинаковы).
Немного общей информации
Когда мы говорим о шифровании, обычно, предполагается, что есть какой-то набор данных, который должен быть изменён таким образом, чтобы никто, кроме тех, кто знает ключи, не смог бы их прочитать. Это может быть как управляющий код, так и простой текст.
Далее - способ кодировки информации. Например текст может быть в кодировке UTF-8, UTF-16 или KOI8. Но это не принципиально. Важно понять то, что каждому значащему символу присваивается какой-то символ или последовательность символов (или несколько бит бинарного кода, скажем, 5 на одну букву для 32-буквенного алфавита).
Проще говоря, любое значимое сообщение - есть набор некоторых символов (или последовательностей символов), которые интерпретируются как полезная нагрузка. Переводя с казённого языка на человеческий, то, например, слово АБРАКАДАБРА - будет полезной нагрузкой, а представлена она может быть, скажем, так ААБРААКААДААБРАА (каждая буква А заменяется АА, как это бывает с экранирующими символами по каким-то, сейчас неважно каким, соображениям). Главное, что надо тут принять во внимание - представление исходного сообщения может быть уже само по себе чем-то вроде шифра.
Итак, у нас есть исходный текст, он же - полезная нагрузка. Пришло время его зашифровать. Как это сделать?
Процесс шифрования
Следующий шаг - это зашифровать сообщение. Для этого, обычно, мы собираем его в какой-то разумный "текст". Если, например, мы используем 5 бит вместо 8 (или 16) на одну букву - то выписываем последовательность бит и преобразуем в строку (при необходимости дополняя недостающие биты); если наш текст- просто текст - то берём его как есть. Если речь идёт о двоичных данных - то преобразуем их в массив байтов.
Теперь - шифруем. Шифрование - это что-то функции, куда на вход подаётся шифр, открытый текст, а на выходе появляется текст шифрованный. И если текст всегда имеет фиксированную длину, то ключ может быть бесконечным (генерироваться некоторой функцией по входным параметрам; однако это очень обширная и неоднозначная тема, пока не будем на ней останавливаться).
Но шифровать можно по-разному. Для начала - нужен ключ. Ключ - это не всегда строка; иногда это матрица (таблица X на Y клеток) или набор матриц. И вот этот самый ключ может применяться по совершенно различным алгоритмам: обычно это изменение исходного символа на символ зашифрованный; причём тот же самый ключ последовательно меняется по каким-то правилам (например, сперва ключ прикладывается от первого до последнего символа, затем от смещается на 1 символ вправо, а его последний символ становится первым и так далее; в случае с матрицей - то каждый следующий символ может выбираться в соответствии с каким-то принципом, например, "ход конём").
И вот, на выходе у нас появляется зашифрованный текст, который, как мы считаем, никто не разгадает. Откуда вообще людям знать, какой у меня хитрый способ шифрования?
Крушение надежд
Вероятно, вы слышали про метод "грубой силы" (он же bruteforce), когда идёт последовательный перебор всех возможных ключей. Это хорошо для подбора паролей, но не всегда уместно для шифрования.
С шифрованием всё немного иначе: мы исходим из соображения, что зашифрованное сообщение имеет какой-то смысл, а, значит, может быть прочитано и понятно. Или же, частично прочитано и понятно.
Когда идёт разговор про вскрытие сообщений, обычно есть более одного сообщения и, значит, несколько примеров применения ключа. А дальше вступает в дело анализ и статистика (это можно делать как вручную, так и в автоматизированном виде; способов тоже довольно много). В основном, всё сводится к тому, чтобы "поймать" одни и те же буквы (значащие символы) в последовательностях и постараться идентифицировать, что условная буква А в начале сообщения и Б на третьей позиции - это одна и та же буква.
Обратные действия профессионалов позволяют относительно точно определить длину ключа и ритм ключа. А дальше воспроизводится вскрывается сообщение. И хотя это всё происходит не то, чтобы очень быстро, однако вскрытый ключ позволяет читать зашифрованные сообщения, как открытые.
Примечательно, что процесс сбора статистики и анализа довольно легко можно автоматизировать, а натасканные на это нейронные сети, вместе со специальным дешифровальным оборудованием, могут сильно упростить процесс вскрытие шифров.
Спецслужбы тоже в деле
Ни для кого не секрет, что спецслужбы хотят знать всё. Знать всё - их хлеб с маслом. Поэтом и стандарты шифрования, которые имеют статусы "государственных" или "одобренных", чаще всего, выбираются те, которые одобряющие его службы умеют эффективно вскрывать (как это было со стандартом DES).
И коммерческие организации не отстают
Кстати, некоторые коммерческие организации, имеющие свои собственные мессенджеры и считающиеся в Российской Федерации экстремистскими, вполне открыто заявляют, что сканируют шифрованный трафик и на анализе сигнатур примерно определяют его содержимое. Насколько примерно - история умалчивает.
А генераторы случайных чисел не спасают
Как несложно догадаться, в шифровании часто нужен генератор случайных числе (например, для создания шифра). Работает это примерно так: генератор выдаёт какое-то значение, на основании значения выбирается шифросимвол.
Проблема заключается в том, что когда мы говорим про "генератор случайных чисел", мы почти всегда говорим про псевдослучайные числа - некий алгоритм, генерирующий последовательность по определённым закономерностям. И если иметь достаточно входных данных, то можно не только разгадать текущий ключ, но и будущие ключи. Не знаю насколько достоверная история, но читал, что в платном менеджере паролей от Kaspersky использовался генератор случайных, опирающийся на дату. Когда это стало известно - все текущие и будущие пароли стали условно скомпрометированными. Впрочем, за достоверность информации не ручаюсь.
Шеф, всё пропало?
Не думаю. На самом деле смысл любого шифрования заключается не в том, чтобы придумать невскрываемый шифр, а шифр, время вскрытия которого больше чем актуальность информации, содержащейся внутри. Иными словами, вовсе необязательно придумывать какой-то супершифр; достаточно заставить очень долго вскрывать тот, что есть. Но тут придётся изучить сильно больше информации, чем небольшая статья.
А у профессионалов есть специальное шифровальное оборудование (например, роторные машины, энигма - частный случай). Не знаю, применяются ли физические машины сейчас или же предпочтение отдаётся цифровым аналогам, но, согласно утверждениям ребят, занимающихся криптоанализом - они весьма эффективны. И хотя не исключено, что уже есть более эффективные средства шифрования, обычному пользователю даже роторные машины или из виртуальный аналог не особо доступны.
Заключение
Тут много чего можно сказать, но лично я для себя сделал только один вывод: надеяться на шифрование особенно не стоит. А ещё, если уж захотелось поизобретать велосипед и придумать невскрываемый шифр, то лучше, для начала, поглубже изучить вопрос. Будет обидно, что венец творческой мысли будет за 15 минут вскрыт специалистом средней руки при помощи одного лишь карандаша и бумаги.