Вот все говорят “безопасность”, а как на практике всё это применить? Именно практическому аспекту криптографии посвящена эта работа.
Сейчас вопросы защиты информации стоят наиболее остро. Это связано как с общим бурным развитием информационных технологий, так и c появлением новых языков и технологий программирования самостоятельно не способных решить все проблемы безопасности, кроме как административным методом.
Например, в XML-документе хранятся в открытом виде логины и пароли пользователей удаленной базы данных, что позволяет злоумышленнику, при условии чтения, им данного файла, осуществлять практически неограниченные изменения в базе данных.
В качестве основного средства ограничивающего доступ к конфиденциальной информации можно использовать метод хранения информации в закодированном виде.
Проблема решается следующим образом. Указанный XML документ кодируется и в закодированном виде хранится на сервере. При обращении к этому файлу на сервере запускается декодер, который декодирует и выполняет XML-документ на сервере, без создания открытой копии документа на жестком диске.
Остановимся подробнее на механизме доступа к данным.
Могу привести свой пример, для которого программа и была написана.
Интернет пользователь формирует запрос, через WWW-интерфейс к WEB-сайту. После запуска файла INDEX.php, данный скрипт формирует обычную HTML-страницу со статическими ссылками, заголовками и т.д. Между тегами “<?php” и “?>” расположен текст скрипта, который добавляет динамичность в страницу, т.к. “налету” обрабатывает файл students.xml, и если там появились новые узлы, тут же показывает их в таблице.
Заметим, что в файле students.xml хранятся в открытом виде логины и пароли пользователей базы данных.
Рис 1.
После применения разработанной программы процесс доступа
к данным несколько меняется (Рис 2.). После формирование запроса скриптом
index.php на выполнение файла students.xml, последний файл автоматически
декодируется на сервере лишь в том случае, если пользователь правильно
ввёл свой секретный ключ, после чего выполняется. Конечно, даже если пользователь
ввёл неверный секретный ключ,
декодирование всё равно осуществляется, однако вместо XML-файла с логинами
и паролями получается абракадабра и students.xml соответственно не обрабатывается.
Пользователю становится доступна только информация сформированная после
обработки файла students.xml.
Рис 2.
"Проблема рюкзака" (или "ранца") может быть сформулирована следующим образом. Пусть задано множество натуральных чисел А = (a1, а2,..., аn) и натуральное число S. Требуется установить, имеется ли такое подмножество множества А, сумма элементов которого была бы равна S. Эквивалентной является следующая формулировка: существует ли такой набор чисел хi из
Данная проблема получила свое название в связи с тем, что поставленная задача может быть переформулирована также в следующем виде. Имеется набор предметов с известными весами и рюкзак, который может выдержать вес, не превышающий заданной величины. Можно ли выбрать набор предметов для погрузки в рюкзак так, чтобы они в точности имели максимально возможный вес.
"Проблема рюкзака" является весьма сложной, ее решение с полиномиальной сложностью в настоящее время не известно.
Идея построения системы шифрования на основе проблемы рюкзака заключается в выделении некоторого подкласса задач об укладке рюкзака, решаемых сравнительно легко, и "маскировки" задач этого класса (с помощью некоторого преобразования параметров) под общий случай. Параметры подкласса определяют секретный ключ, а параметры модифицированной задачи – открытый ключ. В качестве легко решаемой задачи Р. Меркль и М. Хеллман в 1978 г. предложили задачу об укладке "супервозрастающего" рюкзака. Изложим ее суть.
Назовем супервозрастающей последовательность натуральных чисел (b1,b2,..., bn ), обладающую свойством
Можно убедиться в том, что проблема рюкзака для супервозрастающей последовательности может быть решен помощью процедуры, состоящей в выполнении следующих шагов:
В системе, основанной на проблеме рюкзака, величина S является параметром системы.
Для вычисления открытого и соответствующего секретного ключа каждый из абонентов системы осуществляет следующую последовательность действий.
Открытым ключом является набор (а1 ,а2,...,аn), секретным ключом – набор ( , m, W, (b1, b2,…,bn)).
Чтобы зашифровать сообщение М, предназначенное для абонента А, абонент В осуществляет следующие шаги с помощью открытого ключа (а1, а2,...,аn) абонента А:
Абонент А, получив С, вычисляет Н = (W-1 *C ) mod (m) , а затем, решая проблему рюкзака для супервозрастающей последовательности, находит числа zi , i = (0,1) такие, что
Биты последовательности Мi вычисляются по формуле: Mi=z (i) , i=1,…,n
Корректность проведенной процедуры расшифрования вытекает из следующих рассуждений. Поскольку и 0<H<m, то , (i=1,…,n) , и, следовательно, алгоритм решения проблемы рюкзака действительно находит биты открытого текста, переставленные в соответствии с перестановкой .
В качестве примера, приведём программу которая шифрует/дешифрует текстовые файлы заменяя один символ другим, вычисляя его по алгоритму на основе "проблемы рюкзака". В данном случае, алгоритм применяется к байтам, т.е. символам текста.
Приложение - rukzak.cpp
Программа включает в себя универсальный кодер-декодер способный работать с любыми текстовыми файлами, и имеющий гибкую возможность манипулирования входными параметрами, что делает практически невозможным его использование посторонними лицами с целью дешифрования информации.
В процессе создания программы была использован простой и удобный интерфейс, позволяющий выполнить следующие действия:
Заметим, что предложенная реализация алгоритма шифрует текстовые файлы заменяя один символ другим. Очевидно что в данной ситуации возможно успешное примение атаки на основе частотного анализа. Например по следующему простейшему алгоритму:
Следует уточнить, что реализация алгоритма шифрования поддаётся совершенствованию,
и только для наглядности она представлена в данном виде.
Приведём несколько советов, как можно это сделать:
Заметим, что вне зависимости от реализации рюкзачный алгоритм шифрования не идеален. Доказано, что существует алгоритм полиномиальной сложности, который может быть использован противником для получения открытого текста М по шифротексту С. Пусть противнику известна последовательность {аi}, этот алгоритм находит пару таких целых чисел u1, m1, что отношение u1/ m1 близко к отношению u/m (где u= W-1 mod (m), a W, m являются частью секретного ключа). Кроме того, числа Bi = ( ui * аi) mod (m), 1<i<n, образуют супервозрастающую последовательность. Эта последовательность затем используется противником вместо (b1, b2,...,bn) для дешифрования сообщения.
Понятие идеальности алгоритма в криптографии вообще очень сложное. В определённых случаях нам нужен DES, RSA или Blow-fish, а где-то подойдёт рюкзачная система шифрования. Не будем забывать о том, что, во-первых, злоумышленник не должен вообще знать о том какая криптосистема применяется для защиты данных, и, во-вторых, он не должен иметь возможности получать в каком либо виде криптотекст и уж тем более доступ к самой программе-кодеру. Но даже в этом случае нельзя быть на 100% уверенным в защите ваших данных. Однако, это лучше чем не предпринимать вообще ничего :).
При грамотном администрировании, таком, как ограничение доступа к данным (принцип наименьших привилегий), возможность выполнения программы на сервере только тому, кому это разрешено, можно существенно снизить все основные угрозы безопасности ваших данных.
В данной работе было представлено приложение, с помощью которого пользователь имеет возможность легко и быстро кодировать и декодировать текстовые документы, а также задавать параметры системы шифрования. На практике эта идея была реализована при помощи рюкзачной системы шифрования, и применена для реальной защиты базы данных от несанкционированного доступа.
Приложение может быть использовано как администраторами баз данных, так и системными администраторами, в качестве дополнения к стандартным средствам безопасности.
Для создания программы был использован пакет Borland C++, Version 5.01 фирмы Borland. После этапа отладки и компиляции программа была перенесена в среду Unix, что позволило применить её на Sun-сервере, для реально существующей базы данных.
Версия этой статьи в PDF формате
[c] Михаил Чегодарь (chegodar@aaanet.ru)
Статья написана специально для uinC (http://www.uinc.ru).