Читаем Delphi. Трюки и эффекты полностью

Листинг 12.23.

Объявление типов и класса нашей формы

type

//множество всех русских букв

TRusLetters = set of Char;

//исходный алфавит русского языка

TRusSrcAlphabet = array [0..65] of Char;

//относительные частоты русских букв

TRusFrequency = array [0..32] of Real;

TFrequency = array [Char] of Real;

TRusDstAlphabet = array [Char] of Char;

TfmHackEncrypting = class(TForm)

mmDecryptMessage: TMemo;

mmEncryptMessage: TMemo;

lbDecryptMessage: TLabel;

lbEncryptMessage: TLabel;

btnHackEncrypting: TButton;

edKey: TEdit;

lbKey: TLabel;

procedure FormCreate(Sender: TObject);

procedure btnHackEncryptingClick(Sender: TObject);

private

{ Private declarations }

//значение ключа, вычисляемого на основании частотного

//анализа

nHackKey: Integer;

//количество букв русского алфавита в закодированном

//сообщении

nCount: LongInt;

//абсолютная частота букв русского алфавита

//(то есть количество каждой буквы по отдельности)

//в зашифрованном сообщении

AbsFrequency: TFrequency;

//относительная частота букв русского алфавита в шифровке

RelFreqInMsg: TFrequency;

//относительная частота букв русского алфавита

//в русском языке

RelFreqInLang: TFrequency;

RusDstAlphabet: TRusDstAlphabet;

function UpCaseRus(Ch: Char): Char;

procedure RecalcAlphabet(nKey: Integer);

function DecryptString(strDecryptMsg: String;

nKey: Integer): String;

public

{ Public declarations }

end;

const

RusLetters: TRusLetters = [\'Ё\', \'ё\', \'А\'..’я’];

RusSrcAlphabet: TRusSrcAlphabet =

\'АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ\' +

\'абвгдеёжзийклмнопрстуфхцчшщъыьэюя\

//частоты в соответствии с порядком букв в русском алфавите

RusFrequency: TRusFrequency =(

0.063, 0.014, 0.038, 0.013, 0.025, 0.072, 0.072, 0.007,

0.016, 0.062, 0.010, 0.028, 0.035, 0.026, 0.052, 0.090,

0.023, 0.040, 0.045, 0.053, 0.021, 0.001, 0.009, 0.004,

0.012, 0.005, 0.003, 0.015, 0.017, 0.015, 0.002, 0.006,

0.018);

var

fmHackEncrypting: TfmHackEncrypting;

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

...

Листинг 12.24.

Обработчик события формы OnCreate

procedure TfmHackEncrypting.FormCreate(Sender: TObject);

var

i, h: Integer;

begin

h := High(RusSrcAlphabet) div 2;

for i := Low(RusSrcAlphabet) to High(RusSrcAlphabet) do

RelFreqInLang[RusSrcAlphabet[i]] := RusFrequency[i mod h];

end;

Вспомогательные методы UpCaseRus, RecalcAlphabet и DecryptString нам уже знакомы. Они выполняют стандартные действия из предыдущих примеров. Поэтому мы только приведем их реализацию для данного случая (листинг 12.25).

...

Перейти на страницу:

Похожие книги

Забытое
Забытое

Захватывающая история Сиенны Престон продолжается во второй части головокружительной серии «Игра обмана».Семнадцатилетняя Сиенна не понаслышке знает о душевной боли и потерях. Но на этот раз всё по-другому: кто-то вмешался в воспоминания её возлюбленного, и теперь ей предстоит найти ответы.След ведёт её к сверкающим небоскрёбам и роскоши Рубекса, столицы Пасифики, где она проникает в правительственное Ведомство интеллекта и генетики. Но ответы получить не так-то просто, особенно когда её собственные воспоминания могут быть искажены. К счастью, рядом есть Зейн Райдер, готовый помочь ей сложить вместе кусочки головоломки. Его преданность и забота размывают границу между дружбой и чем-то большим.Когда Сиенна подбирается слишком близко к тёмным секретам Ведомства, её обвиняют в убийстве видного государственного деятеля, и ей приходится пуститься в бега. Как бы ни разрывалось сердце Сиенны в попытке понять, кого она любит, это всё вскоре перестаёт иметь значение — потому что единственное, что её сейчас ждёт, это смертный приговор.

Марина Козикова , Александр Степанович Грин , Марина Суржевская , Кристин Смит

Любовное фэнтези, любовно-фантастические романы / Проза / Классическая проза / Самиздат, сетевая литература / Технические науки / Любовно-фантастические романы