Весьма красочно иллюстрирует размышления на тему шифрования изображение с xkcd.com.
Но если продолжить размышления и попытаться решить проблему методами ИТ, то может родиться нечто интересное. Читателям предлагается статья-описание алгоритма, который мог бы помочь «тому с зашифрованным ноутом» с картинки выдать изображенным злоумышленникам пароль без потери важной информации. Разумеется, для этого ему пришлось бы хорошенько подготовиться, помнить несколько паролей и постоянно испытывать недостаток свободного места на компьютере, т.к. изложенный алгоритм в этом плане может быть прожорлив (если владелец захочет снизить риски быть уличенным во лжи).
Итак, если кратко, то владелец «такого ноута» при использовании изложенного алгоритма будет помнить несколько паролей, каждый из которых является ключом к своему «сейфу» (контейнеру файлов). Владелец определяет то, как распределить информацию среди контейнеров. Соответственное, он может создать несколько подставных контейнеров с заведомо ложной информацией. Итогом проиллюстрированных угроз может стать выдача пароля от одного из таких «сейфов». В случае, если злоумышленники хорошо знакомы с излагаемым алгоритмом, можно, например, выдать еще 1 или 2, и/или сказать, что больше контейнеров в этом архиве нет, а все остальное — случайная информация.
Статья изложена научным языком и местами весьма сложна для восприятия, за что прошу прощения.
Все современные криптосистемы построены по принципу Кирхгоффа, согласно которому секретность зашифрованных данных определяется секретностью ключа шифрования, т.е. даже при известном алгоритме шифрования злоумышленник не в состоянии за приемлемое время получить расшифрованные данные, если не располагает ключом. Тем не менее, ни один современный метод шифрования или программа, его реализующая, не защитят информацию, если её владелец будет поставлен в такое положение, которое вынудит его раскрыть ключ. Также стоит учесть возможность подбора ключей, например, полным перебором или атакой по словарю, применив специфические знания о владельце.
Существуют различные системы, которые позволяют скрыть наличие шифрованных данных (Вики: Отрицаемое_шифрование), но они скрывают целые разделы (например, FreeOTFE, TrueCrypt), которые, при желании, можно найти. С другой стороны, существует файловая система Rubberhose (Wiki:Rubberhose), созданная Джулианом Ассанжем (Julian Assange), Сьюлетт Дрейфус (Suelette Dreyfus), и Ральфом Вейнманном (Ralf Weinmann) в 1997–2000. Но она не позволяет как TrueCrypt создавать отдельные файлы для хранения данных, которые возможно будет, например, выложить в интернете для хранения. Вообще, описание базиса Rubberhose оказалось схоже с описанными ниже идеями, но представленный алгоритм разработан независимо от нее.
Сформулируем задачу, которую необходимо решить:
- во-первых, примем за факт то, что злоумышленник располагает созданным пользователем криптографическим контейнером, а также осведомлен об особенностях применяемого алгоритма шифрования;
- во-вторых, данные, представляющие действительную ценность, должны быть скрыты так, чтобы злоумышленник не смог вычислить общее количество вложенных субконтейнеров в исследуемый криптоконтейнер, даже после получения доступа к нескольким из них.
Решением проблемы скрытия данных о количестве субконтейнеров в криптохранилище является включение псевдослучайной информации наряду с частями скрываемых зашифрованных данных таким образом, чтобы отличить подмешанные блоки от несущих реальную информацию было бы невозможно. При этом расположение блоков относительно друг друга не должно зависеть от ключей, количества субконтейнеров, очередности работы с ними.
Алгоритм создания криптоконтейнера показан на следующем рисунке:
Для пояснения блок-схемы, приведу следующий набросок:
Таким образом, пользователь ограничен лишь разумными рамками в выборе следующих параметров:
- используемые хэш-функции и их комбинации для создания ключей шифрования субконтейнеров и заголовков для суперблоков,
- блочный алгоритм шифрования субконтейнеров (AES, Blowfish, DES и т.д.),
- количество блоков в суперблоках (их увеличение ускорит доступ к информации, уменьшит занимаемый размер за счет сокращения количества заголовков, но увеличит шансы подбора ключей полным перебором).
Информация об использованных алгоритмах шифрования и хэш-функциях может быть сохранена в заголовке контейнера, т.к. необходима для доступа к данным.
Процесс дешифрации созданного криптоконтейнера после того, как пользователь ввел пароль, включает следующие шаги:
- Создаем ключ для расшифровки заголовков на основе полученного пароля с помощью заранее определенной хэш-функции.
- Проверяем каждый заголовок всех суперблоков из состава контейнера на возможность дешифрации имеющимся ключом (для проверки его правильности в каждый заголовок включено слово-подтверждение, которое должно состоять из символов ASCII, например «OK» или «TRUE» как в TrueCrypt, а так же контрольная сумма содержащихся в суперблоке блоков, для более точной проверки ключа в случаях совпадения слова-подтверждения), и получаем таким образом множество суперблоков, поддающихся дешифрации.
- Выстраиваем полученные суперблоки в логическую цепочку в соответствии с указанными в их заголовках индексами (по возрастанию). Более заголовки суперблоков не нужны и в дальнейшем процессе не участвуют.
- Создаем ключ на основе полученного ранее пароля (алгоритмы генерации ключей шифрования для заголовков и субконтейнеров могут быть различными), и используем его для дешифрации имеющегося субконтейнера.
Перечислим некоторые особенности, которые следует учесть при создании описанного криптохранилища:
- пароли для различных субконтейнеров должны отличаться;
- вероятность получения слова-подтверждения после применения ключа к созданным из случайных байт заголовкам должна сводиться к нулю, путем проведения проверок на соответствующем шаге;
- размер заголовков суперблоков, за вычетом длины слова-подтверждения, должен быть достаточным для хранения, как минимум, общего числа суперблоков, построенных из блоков одного субконтейнера.
Главным минусом такого алгоритма является, безусловно, скорость доступа (т.к. мы подбираем ключи к каждому суперблоку, в том числе и рандомные) и необходимость хранить блоки со случайной информацией. С другой стороны, владелец контейнера сам определяет размер случайной информации, а значит, и степень риска в случае описанной в начале статьи необходимости раскрыть пароль/пароли от субкотейнеров, что непосредственно влияет на скорость доступа. Тем более, что алгоритм подразумевает автономную работу с каждым субконтейнером, т.е. один раз выбрав суперблоки, к которым подходит введенный пароль, программе больше не нужно будет обращаться к другим суперблокам.
Таким образом, представленный способ организации криптохранилища решает задачу повышения его стойкости. Считается, что злоумышленник в состоянии подобрать один или несколько паролей, использованных пользователем для шифрования некоторых субконтейнеров, поэтому алгоритм предусматривает возможность подмешивания случайной информации наряду с полезной. Такая мера, вместе с созданием нескольких субконтейнеров, позволит владельцу архива лично определить применяемую политику безопасности в отношении хранимой конфиденциальной информации. Например, становится возможным создать несколько архивов с разными уровнями сложности паролей, каждый из которых будет содержать данные разной ценности, но основное их множество станет отвлекающим фактором, поскольку благодаря возможности включения случайной информации, некоторые части таких контейнеров просто не могут быть расшифрованы. Более того, злоумышленнику придется подбирать ключ ко всем блокам, поэтому наличие случайных частей замедлит процесс перебора.
Автор: ha7y