Сергей Панасенко,
начальник отдела разработки ПО фирмы "Анкад",
develop@ancud.ru

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

Предположим, есть два пользователя (назовем их I и J), решивших обмениваться зашифрованными сообщениями через Интернет. Посмотрим, как можно это сделать, на примере комплексного метода шифрования.

Комплексный метод

Этот метод применения алгоритмов симметричного и асимметричного шифрования устраняет ряд недостатков, свойственных каждому из них при раздельном применении. Итак, чтобы обменяться зашифрованными сообщениями через Интернет, пользователям I и J необходимо предварительно сделать следующее.

1. Выбрать алгоритмы шифрования и их параметры. Вспомним (см. статью "Современные алгоритмы шифрования", "BYTE/Россия" No 8'2003), что каждый алгоритм имеет множество параметров, которые должны быть идентичны, - иначе даже при наличии правильного ключа шифрования будет невозможно расшифровать информацию. Например, для алгоритма ГОСТ 28147-89 должны быть согласованы таблицы замен, используемый режим алгоритма и принципы формирования синхропосылок.

2. Сгенерировать свои ключи асимметричного шифрования. Пользователь I генерирует пару ключей KsI (secret - секретный) и KpI (publIc - открытый), пользователь J создает пару KsJ и KpJ.

3. Обменяться открытыми ключами или сделать их доступными друг другу. Предположим, что открытые ключи KpI и KpJ пользователи пересылают друг другу по электронной почте.

Не будем рассматривать здесь проблему перехвата открытых ключей при передаче и их подмены злоумышленником - это тема отдельного разговора. Предположим, ключи успешно переданы и получены, после чего можно отправлять зашифрованное сообщение. Это и делает пользователь J, отправляя пользователю I сообщение M.

Процесс обмена иллюстрирует рис. 1. Перед передачей сообщения пользователь J создает случайный ключ симметричного шифрования (назовем его Ksimm). Пользователь J асимметрично зашифровывает ключ Ksimm на открытом ключе пользователя I KpI и отправляет зашифрованный ключ пользователю I. Затем пользователь J зашифровывает ключом Ksimm сообщение M, и полученный шифртекст C отсылается пользователю I. Пользователь I получает зашифрованный ключ Ksimm и асимметрично расшифровывает его своим секретным ключом KsI. С помощью полученного ключа Ksimm пользователь I расшифровывает сообщение M.

Fig.1 Рис. 1. Комплексный метод шифрования.

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

Ключевые схемы

Манипуляции с зашифрованием ключа Ksimm и его передачей вместе с сообщением являют собой пример ключевой схемы (так называются схемы использования ключей шифрования). В общем случае для разработки какой-либо системы, позволяющей шифровать файлы или сообщения, недостаточно просто реализовать алгоритм шифрования. Необходимо также продумать принципы генерации, передачи, хранения и использования ключей шифрования: так как недостаточная защита ключей на любом из этих этапов или неправильное их применение поставит под угрозу всю зашифрованную информацию. Ведь любая "слабость" этапов шифрования даст возможность злоумышленнику атаковать систему защиты с тем, чтобы получить ключ шифрования вместо того, чтобы пытаться взломать сильный криптоалгоритм. И если он сделает это достаточно грамотно - секретов от него уже не будет.

Рассмотрим типичные ключевые схемы, но для начала введем ряд определений (см. врезку "Типы шифрования").

Типы шифрования

Архивное шифрование - шифрование информации для хранения в защищенном виде.

Абонентское шифрование - шифрование информации для последующей передачи по сети определенным пользователям (абонентам).

Прозрачное шифрование - незаметное для пользователя автоматическое шифрование информации для ее хранения или передачи в закрытом виде.

Абонентское шифрование

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

Файловые ключи предназначены для шифрования собственно информации. Часто их название соответствует конкретному виду шифруемых данных: пакетные, сеансовые или дисковые. Обычно такие ключи генерируются случайным образом для каждого шифруемого объекта, например, для каждого файла, сообщения электронной почты, а иногда и IP-пакета. В нашем примере с пользователями I и J ключ Ksimm - это файловый ключ.

Долговременные ключи используются для шифрования и передачи файловых. В схеме на рис. 1 ключ KpI - долговременный.

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

Независимо от количества ключей, используемых для шифрования конкретного объекта, существует некий особый долговременный ключ, на котором построена вся защита. Если такой ключ попадет в руки злоумышленника, защищенный объект будет им расшифрован независимо от количества других используемых при шифровании ключей. Именно этот ключ необходимо хранить, не допуская его компрометации (т. е. утери или хищения).

Обычно для хранения подобных ключей используется некий персональный ключевой носитель: дискета, смарт-карта, USB-токен, iButton и т. д., который всегда должен находиться у пользователя - владельца ключа. На схеме с рис. 1 такой ключевой элемент в явном виде отсутствует - это секретный ключ пользователя I, KsI, который должен находиться только у пользователя I. В противном случае злоумышленник, завладевший ключом KsI, легко расшифрует сообщение (сначала с помощью ключа KsI расшифровывается ключ Ksimm, а затем - и само сообщение).

Архивное шифрование

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

Fig.2 Рис. 2. Архивное шифрование.

Может показаться, что в данном случае нет логики в использовании файлового ключа: почему бы не шифровать файл непосредственно на долговременном ключе, не затрачивая время и ресурсы на генерацию, шифрование и передачу файлового? Однако использование файлового ключа (помимо описанного выше комбинирования симметричных и асимметричных алгоритмов) преследует иные цели.

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

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

Прозрачное шифрование

При прозрачном шифровании от пользователя обычно требуется лишь однократная настройка системы, после чего все, что необходимо, будет зашифровываться автоматически.

В настоящее время существует множество программ шифрования логических дисков. Большинство из них создают виртуальный логический диск, который физически представляет собой файл-контейнер, размещаемый на одном из существующих в системе логических дисков. Обычно пользователю достаточно один раз настроить программу прозрачного шифрования. Для этого он должен создать файл-контейнер, задать его размер, создать долговременный ключ шифрования логического диска (или задать пароль, из которого будет формироваться долговременный ключ) и т. д. При предъявлении данного долговременного ключа контейнер предстанет перед пользователем в виде дополнительного логического диска с прозрачным шифрованием: при записи на такой логический диск файлы автоматически зашифровываются, при чтении - расшифровываются.

Ключевая схема такого шифрования очень схожа с представленной на рис. 2. Разница лишь в том, что файловый ключ создается не для каждого записываемого на логический диск файла, а для всего логического диска (отсюда и название - дисковый ключ), и каждая из операций (получение дискового ключа с помощью датчика случайных чисел, его зашифрование на долговременном ключе и запись в заголовок виртуального логического диска) выполняется при создании файла-контейнера однократно. Если пользователь предъявляет верный долговременный ключ, то хранящийся в заголовке файловый ключ расшифровывается и участвует в дальнейших операциях шифрования файлов данного логического диска.

Трехключевая схема

Вернемся ненадолго к абонентскому шифрованию. Бывает, что в этом случае применяются только симметричные алгоритмы без асимметричного шифрования (хотя бы из-за того, что отечественный стандарт на алгоритм асимметричного шифрования попросту отсутствует). При этом предполагается, что ключи симметричного шифрования распространяются до начала использования такой системы по доверенным каналам связи (например, курьером).

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

Такая матрица ключей генерируется выделенным администратором безопасности, а не самими пользователями, причем последние получают лишь строки матрицы с набором ключей парной связи между конкретным пользователем и остальными пользователями системы. Такая строка называется сетевым набором.

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

Fig.3 Рис. 3. Абонентское шифрование с использованием сетевого набора.

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

Формат зашифрованного объекта

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

Имитоприставка вычисляется перед зашифрованием, записывается в заголовок, а после расшифрования ее значение вычисляется повторно и сравнивается с хранящимся в заголовке. Кроме того, чтобы не расшифровывать весь объект, в его заголовке хранится и другая имитоприставка - файлового ключа, которая вычисляется на долговременном ключе перед зашифрованием файлового и проверяется после его /расшифрования, но (!) до расшифрования всего объекта. С помощью этой второй имитоприставки можно легко диагностировать большинство ошибок расшифрования на ранней стадии.

Итак, зашифрованный объект обычно содержит как минимум следующие данные:

  • собственно информация, зашифрованная на файловом ключе;
  • файловый ключ, зашифрованный на долговременном ключе;
  • имитоприставка файлового ключа на долговременном ключе;
  • имитоприставка исходных данных на файловом ключе.

***

Описанные в данной статье ключевые схемы - не единственно возможные. В зависимости от целей конкретной системы защиты информации ключевые схемы могут быть как существенно более сложными, так и совсем простыми. Главное - ключевая схема не должна быть "слабым звеном" всей системы.