- Любовные романы
- Фантастика и фэнтези
- Ненаучная фантастика
- Ироническое фэнтези
- Научная Фантастика
- Фэнтези
- Ужасы и Мистика
- Боевая фантастика
- Альтернативная история
- Космическая фантастика
- Попаданцы
- Юмористическая фантастика
- Героическая фантастика
- Детективная фантастика
- Социально-психологическая
- Боевое фэнтези
- Русское фэнтези
- Киберпанк
- Романтическая фантастика
- Городская фантастика
- Технофэнтези
- Мистика
- Разная фантастика
- Иностранное фэнтези
- Историческое фэнтези
- LitRPG
- Эпическая фантастика
- Зарубежная фантастика
- Городское фентези
- Космоопера
- Разное фэнтези
- Книги магов
- Любовное фэнтези
- Постапокалипсис
- Бизнес
- Историческая фантастика
- Социально-философская фантастика
- Сказочная фантастика
- Стимпанк
- Романтическое фэнтези
- Ироническая фантастика
- Детективы и Триллеры
- Проза
- Юмор
- Феерия
- Новелла
- Русская классическая проза
- Современная проза
- Повести
- Контркультура
- Русская современная проза
- Историческая проза
- Проза
- Классическая проза
- Советская классическая проза
- О войне
- Зарубежная современная проза
- Рассказы
- Зарубежная классика
- Очерки
- Антисоветская литература
- Магический реализм
- Разное
- Сентиментальная проза
- Афоризмы
- Эссе
- Эпистолярная проза
- Семейный роман/Семейная сага
- Поэзия, Драматургия
- Приключения
- Детская литература
- Загадки
- Книга-игра
- Детская проза
- Детские приключения
- Сказка
- Прочая детская литература
- Детская фантастика
- Детские стихи
- Детская образовательная литература
- Детские остросюжетные
- Учебная литература
- Зарубежные детские книги
- Детский фольклор
- Буквари
- Книги для подростков
- Школьные учебники
- Внеклассное чтение
- Книги для дошкольников
- Детская познавательная и развивающая литература
- Детские детективы
- Домоводство, Дом и семья
- Юмор
- Документальные книги
- Бизнес
- Работа с клиентами
- Тайм-менеджмент
- Кадровый менеджмент
- Экономика
- Менеджмент и кадры
- Управление, подбор персонала
- О бизнесе популярно
- Интернет-бизнес
- Личные финансы
- Делопроизводство, офис
- Маркетинг, PR, реклама
- Поиск работы
- Бизнес
- Банковское дело
- Малый бизнес
- Ценные бумаги и инвестиции
- Краткое содержание
- Бухучет и аудит
- Ораторское искусство / риторика
- Корпоративная культура, бизнес
- Финансы
- Государственное и муниципальное управление
- Менеджмент
- Зарубежная деловая литература
- Продажи
- Переговоры
- Личная эффективность
- Торговля
- Научные и научно-популярные книги
- Биофизика
- География
- Экология
- Биохимия
- Рефераты
- Культурология
- Техническая литература
- История
- Психология
- Медицина
- Прочая научная литература
- Юриспруденция
- Биология
- Политика
- Литературоведение
- Религиоведение
- Научпоп
- Психология, личное
- Математика
- Психотерапия
- Социология
- Воспитание детей, педагогика
- Языкознание
- Беременность, ожидание детей
- Транспорт, военная техника
- Детская психология
- Науки: разное
- Педагогика
- Зарубежная психология
- Иностранные языки
- Филология
- Радиотехника
- Деловая литература
- Физика
- Альтернативная медицина
- Химия
- Государство и право
- Обществознание
- Образовательная литература
- Учебники
- Зоология
- Архитектура
- Науки о космосе
- Ботаника
- Астрология
- Ветеринария
- История Европы
- География
- Зарубежная публицистика
- О животных
- Шпаргалки
- Разная литература
- Зарубежная литература о культуре и искусстве
- Пословицы, поговорки
- Боевые искусства
- Прочее
- Периодические издания
- Фанфик
- Военное
- Цитаты из афоризмов
- Гиды, путеводители
- Литература 19 века
- Зарубежная образовательная литература
- Военная история
- Кино
- Современная литература
- Военная техника, оружие
- Культура и искусство
- Музыка, музыканты
- Газеты и журналы
- Современная зарубежная литература
- Визуальные искусства
- Отраслевые издания
- Шахматы
- Недвижимость
- Великолепные истории
- Музыка, танцы
- Авто и ПДД
- Изобразительное искусство, фотография
- Истории из жизни
- Готические новеллы
- Начинающие авторы
- Спецслужбы
- Подростковая литература
- Зарубежная прикладная литература
- Религия и духовность
- Старинная литература
- Справочная литература
- Компьютеры и Интернет
- Блог
Delphi. Трюки и эффекты - Валерий Борисок
Шрифт:
Интервал:
Закладка:
Этот вывод был доказан К. Шенноном с помощью разработанного им теоретико-информационного метода исследования шифров. Мы не будем здесь останавливаться на этом подробно, заинтересованному читателю рекомендуем изучить работу К. Шеннона.
Проясним для читателя один очень важный момент по поводу единственного абсолютно стойкого шифра. Чтобы шифр являлся таковым, должны выполняться три условия:
• полная случайность (равновероятность) ключа (это, в частности, означает, что ключ нельзя выработать с помощью какого-либо детерминированного устройства);
• равенство длины ключа и длины открытого текста;
• однократность использования ключа.
В случае нарушения хотя бы одного из этих условий шифр перестает быть абсолютно стойким и появляются принципиальные возможности для его вскрытия (хотя реализовать их может быть чрезвычайно сложно).
Но, оказывается, именно эти условия и делают абсолютно стойкий шифр очень дорогим и непрактичным. Прежде чем пользоваться таким шифром, мы должны обеспечить всех законных пользователей достаточным запасом случайных ключей и исключить возможность их повторного применения. А это сделать очень трудно и дорого.
В силу указанных причин абсолютно стойкие шифры применяются только в сетях связи с небольшим объемом передаваемой информации, обычно это сети для передачи особо важной государственной информации.
Теперь уже понятно, что чаще всего для защиты своей информации законные пользователи вынуждены применять не абсолютно стойкие шифры. Такие шифры могут быть вскрыты (по крайней мере, теоретически). Вопрос только в том, хватит ли у противника сил, средств и времени для разработки и реализации соответствующих алгоритмов. Обычно эту мысль выражают так: противник с неограниченными ресурсами может вскрыть любой не абсолютно стойкий шифр.
Как же должен действовать в этой ситуации законный пользователь, выбирая для себя шифр? Лучше всего, конечно, было бы доказать, что никакой противник не может вскрыть выбранный шифр, скажем, за десять лет и тем самым получить теоретическую оценку стойкости. К сожалению, математическая теория еще не дает нужных теорем – они относятся к нерешенной проблеме нижних оценок вычислительной сложности задач.
У пользователя остается единственный путь – получение практических оценок стойкости. Этот путь состоит из следующих этапов.
1. Понять и четко сформулировать, от какого противника мы собираемся защищать информацию. Необходимо уяснить, что именно противник знает или сможет узнать о системе шифра, а также какие силы и средства он сможет применить для его вскрытия.
2. Мысленно стать в положение противника и пытаться с его позиций атаковать шифр, то есть разрабатывать различные алгоритмы вскрытия шифра. При этом необходимо в максимальной мере обеспечить моделирование сил, средств и возможностей противника.
3. Наилучший из разработанных алгоритмов использовать для практической оценки стойкости шифра.
Полезно будет упомянуть о двух простейших методах вскрытия шифра: случайное угадывание ключа (он срабатывает с малой вероятностью, зато имеет небольшую сложность) и перебор всех подряд ключей вплоть до нахождения истинного (он срабатывает всегда, зато имеет очень большую сложность). Отметим также, что не всегда нужна атака на ключ: для некоторых шифров можно сразу, даже не зная ключа, восстанавливать открытый текст по шифрованному.
Теперь мы перейдем не только к столь необходимой теоретической части, но и к практической реализации различных криптосистем. Существует много их классификаций. Принципы классификации относятся не к качеству рассматриваемых криптосистем, а к присущим им свойствам.
12.2. Шифр простой подстановки
В шифре простой подстановки производится замена каждой буквы сообщения некоторым заранее определенным символом (обычно это также буква). В результате сообщение, имеющее видМ = т1т2 тЗт4…, где т1, тп2…. – последовательность букв, переходит в сообщение вида Е = е1е2еЗе4… = f(m1)f(m2)f(m3)f(m4)…, причем функция f(m) имеет обратную функцию g, для которой верно g(f(m)) = m, при всех возможных значениях т. В данном шифре ключом является просто перестановка алфавита (это верно в том случае, если буквы заменяются буквами). Например, подобная перестановка: ЛРЭИБПВЪДЁЗЩЙГХМЦАУОСЖТЯФКЕШНЫЬЧЮ. Она используется следующим образом:
• буква А открытого текста заменяется буквой Л;
• Б заменяется Р;
• В заменяется Э и т. д.
Как можно понять из определения, данный шифр является довольно простым. Перейдем к примеру, показывающему одну из возможных его реализаций. Для этого нам понадобится создать новое приложение, а на форму поместить следующие компоненты: по два компонента классов ТМето и TLabel с соответствующими именами mmDecryptMessage, mmEncryptMessage, IbDecryptMessage, IbEncryptMessage, три компонента класса TButton – btnEncryptMessage, btnDecpyptMessage, btnGenRearrangement, а также один компонент класса TValueListEditor – vleSubst. По умолчанию все перечисленные компоненты находятся на вкладке Standard, кроме компонента класса TValueListEditor, который расположен на вкладке Additional Когда вы закончите создание интерфейса программы, то у вас получится нечто подобное тому, что изображено на рис. 12.1.
Рис. 12.1. Интерфейс программы «Шифр простой подстановки»
Текстовый редактор mmDecryptMessage будет служить для ввода и отображения открытого текста нашего сообщения, mmEncryptMessage – для текста, преобразованного при помощи шифра. Редактор значений vleSubst мы будем использовать для задания перестановки алфавита, при помощи которой будет шифроваться и дешифроваться текст сообщения. Кнопка btnEncryptMessage будет отвечать за шифрование сообщения из текстового peflaKTopammDecryptMessage и помещение результата в mmEncryptMessage. Кнопка btnDecpyptMessage предназначена для противоположных действий. Последняя кнопка btnGenRearrangement будет служить для генерации случайной перестановки алфавита, чтобы не утруждать себя ее вводом вручную. Необходимо добавить обработчики событий Onclick для каждой из кнопок и обработчик события OnCreate для формы (он нужен для инициализации редактора значений vleSubst).
Теперь стоит оговориться, что программа будет шифровать и дешифровать только русский текст, отставляя неизменным все остальное. Далее рассмотрим исходный код нашей программы.
Первым делом нужно ввести необходимые типы для лучшего понимания написанного кода, а также следует соответствующим образом объявить класс формы. Как это сделать, показано в листинге 12.1....Листинг 12.1. Объявление типов и класса нашей формы
type
TRusDstAlphabet = array [Char] of Char;
TfmSubstitution = class(TForm)
mmDecryptMessage: TMemo;
mmEncryptMessage: TMemo;
lbDecryptMessage: TLabel;
lbEncryptMessage: TLabel;
btnEncryptMessage: TButton;
btnDecpyptMessage: TButton;
btnGenRearrangement: TButton;
vleSubst: TValueListEditor;
procedure FormCreate(Sender: TObject);
procedure btnGenRearrangementClick(Sender: TObject);
procedure btnEncryptMessageClick(Sender: TObject);
procedure btnDecpyptMessageClick(Sender: TObject);
private
{ Private declarations }
RusDstAlphabet: TRusDstAlphabet;
procedure GenRearrangment;
function ValidateRearrangement: Boolean;
function UpCaseRus(Ch: Char): Char;
function LowCaseRus(Ch: Char): Char;
procedure RecalcAlphabet(nKey: Integer);
function EncryptDecryptString(strMsg: String): String;
public
{ Public declarations }
end;
Каждую задачу следует рассматривать детально и выделять необходимые подзадачи, решение которых позволит облегчить и упростить общее решение. Помимо ряда стандартных обработчиков событий, мы добавили несколько собственных методов для лучшей структуризации кода и повышения его читабельности, что является немаловажным фактором при разработке приложений. Рассмотрим каждый метод и поясним их работу.
В нашем приложении для удобства и простоты работы будет реализована возможность задания случайной автоматической перестановки. Первым рассматриваемым методом является функция, реализующая алгоритм генерации случайной перестановки заданной длины из букв русского алфавита. Принцип ее работы заключается в следующем. Сначала считается, что в перестановке нет ни единого символа, о чем свидетельствует установка всех элементов массива WasGen в значение False. Далее в цикле случайным образом генерируются буквы русского алфавита. На очередном шаге цикла буква генерируется до тех пор, пока она будет присутствовать среди уже сгенерированных. Как только такая буква получена, то соответствующий элемент массива WasGen устанавливается в значение True, которое свидетельствует о том, что буква больше не может быть сгенерирована. Мы также не забываем добавить ее в перестановку. Код, соответствующий данному описанию, приведен в листинге 12.2.
...Листинг 12.2.
Реализация метода генерации случайной перестановки
procedure TfmSubstitution.GenRearrangment;
var
Ch, c: char;
//нужен для определения, встречался ли символ ранее
WasGen: array [Char] of Boolean;
begin
//заполняем массив значением False
FillChar(WasGen, SizeOf(WasGen), False);
for Ch := 'А' to 'Я' do
begin
//генерируем случайный символ до тех пор, пока

