AbsFrequency[UpCaseRus(Ch)] :=
AbsFrequency[UpCaseRus(Ch)] + 1;
Inc(nCount);
end;
end;
if nCount = 0 then
begin
MessageDlg(\'Дешифровать сообщение нельзя, так как\' +
\' отсутствует русский текст\', mtError, [mbOk], 0);
Exit;
end;
//вычисляем относительные частоты букв в закодированном
//сообщении
FillChar(RelFreqInMsg, SizeOf(RelFreqInMsg), 0);
for i := Low(RusSrcAlphabet) to High(RusSrcAlphabet) div 2 do
RelFreqInMsg[RusSrcAlphabet[i]] :=
AbsFrequency[RusSrcAlphabet[i]] / nCount;
//перебираем все возможные ключи и выбираем тот, при
//использовании которого частоты появления русских букв
//в закодированном сообщении наиболее близки к частотам
//появления русских букв в русском языке, то есть сумма
//абсолютных разностей частот букв должна быть наименьшей
h := High(RusSrcAlphabet) div 2 + 1;
MinDelta := h;
for i := 1 to h – 1 do
begin
Delta := 0;
for j := 0 to h – 1 do
Delta := Delta + Abs(RelFreqInLang[RusSrcAlphabet[j]] –
RelFreqInMsg[RusSrcAlphabet[(i + j + h) mod h]]);
//очередная сумма разностей меньше всех предыдущих?
if MinDelta > Delta then
begin
//запоминаем ее…
MinDelta := Delta;
//… и запоминаем ключ, при котором получено
//данное значение
nHackKey := i;
end;
end;
edKey.Text := IntToStr(nHackKey);
h := High(RusSrcAlphabet) + 1;
RecalcAlphabet(h – nHackKey mod h);
mmDecryptMessage.Lines.BeginUpdate;
mmDecryptMessage.Clear;
for i := 0 to mmEncryptMessage.Lines.Count – 1 do
mmDecryptMessage.Lines.Add(DecryptString(
mmEncryptMessage.Lines[i], nHackKey));
mmDecryptMessage.Lines.EndUpdate;
end;
Итог работы написанного приложения показан на рис. 12.9. Как видите, у нас все получилось!
Рис. 12.9. Результат работы приложения «Шифр Цезаря – взлом»
Хочется отметить, что частотный анализ производится не только по частоте использования букв, но и по частоте употребления определенных слов и даже фраз. Например, если ведется переписка между Димой и Николаем, то вероятность, что Дима начнет свое обращение со слов «ДорогойНиколай» больше, чем то, что он начнет его произвольным набором символов «ЫКр2!». Поэтому, когда вы сами попытаетесь вскрыть чей-то шифр, помните о такой возможности, но не забывайте, что существуют и значительно более сложные шифры, чем рассмотренные здесь. Часто для улучшения стойкости этих шифров могут применяться различные методики сжатия информации, чтобы было сложнее воспользоваться частотным анализом, так как в этом случае частоты будут почти одинаковы.
Вот и закончилась эта книга. К сожалению, рассмотреть абсолютно все нюансы и интересные подробности программирования в Windows практически невозможно (особенно в книге такого объема). Но мы надеемся, что описанные приемы, алгоритмы и примеры использования возможностей как библиотеки Deplhi, так и Windows API хотя бы пролили свет и на некоторые механизмы работы этой ОС, и на другие области, в которых программирование применяется весьма успешно (речь о криптографии).
При написании книги мы старались минимизировать количество примеров, которым невозможно найти применение на практике. Насколько это нам удалось, судить только вам. Нам лишь остается пожелать вам успехов, уважаемый читатель, в программистской практике (неважно, с использованием Delphi или других языков и сред программирования).
Приложение 1 Коды и обозначения основных клавиш
В табл. П1.1 приведены коды, обозначения целочисленных констант и описания основных клавиш.
Таблица П1
. 1. Коды, обозначения и описания клавиш
Приложение 2 Оконные стили
В приложении представлены таблицы, описывающие следующие оконные стили: общие (табл. П2.1), дополнительные (табл. П2.2), стили кнопок (табл. П2.3), статических надписей (табл. П2.4), текстовых полей (табл. П2.5), списков (табл. П2.6) и стили раскрывающихся списков (табл. П2.7).
Таблица П2.1
. Общие оконные стили
Таблица П2.2.Дополнительные оконные стили
Таблица П2.3.Стили кнопок
Таблица П2.4.Стили статических надписей
Таблица П2.5.Стили текстовых полей
Таблица П2.6.Стили списков (ListBox)
Таблица П2.7.Стили раскрывающихся списков (ComboBox)
В таблицах данного приложения приводятся обозначения констант, описания сообщений, а также назначение параметров wParam и lParam сообщений. Часто параметры wParam или 1 Par am являются указателями на структуры. Для экономии места объявления этих структур не приводятся: их можно найти в модуле Windows.
Читать дальше
Конец ознакомительного отрывка
Купить книгу