Чтение онлайн

на главную

Жанры

Шрифт:

Далее мы реализуем две вспомогательные функции, которые позволят преобразовать буквы верхнего регистра к нижнему и наоборот. Их реализация немного специфична и основывается на используемой кодировке. Отдельная проверка буквы «Ё» производится на основании иного расположения в таблице кодировки, чем у остальных букв. Буквы русского алфавита верхнего регистра расположены начиная с «А» по порядку следования в алфавите, а сразу после них аналогично расположены буквы нижнего регистра. Этим объясняется увеличение кода буквы на фиксированное число. Реализация данных вспомогательных функций приведена в листинге 12.4.

...

Листинг 12.4.

Вспомогательные

функции преобразования регистра букв

function TfmSubstitution.UpCaseRus(Ch: Char): Char;

begin

if Ch = \'ё\' then Ch := \'Е\

if Ch in [\'а\'..’я’] then Dec(Ch, 32);

Result := Ch;

end;

function TfmSubstitution.LowCaseRus(Ch: Char): Char;

begin

if Ch = \'Ё\' then Ch := \'е\

if Ch in [\'А\'..’Я’] then Inc(Ch, 32);

Result := Ch;

end;

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

...

Листинг 12.5.

Использование генерации случайной перестановки

procedure TfmSubstitution.FormCreate(Sender: TObject);

var

Ch: char;

begin

Randomize;

//инициализация редактора значений

for Ch := \'А\' to \'Я\' do

vleSubst.InsertRow(Ch, \'\', True);

//генерация случайной перестановки

GenRearrangment;

end;

procedure TfmSubstitution.btnGenRearrangementClick(Sender:

TObject);

begin

GenRearrangment;

end;

Следующим объектом нашего рассмотрения является функция предварительной подготовки алфавита преобразования для шифрования либо дешифрования сообщения. У метода RecalcAlphabet есть параметр пКеу, который в зависимости от своего значения показывает, что является ключом. Возможными значениями пКеу являются 0 и 1. Значение 0 указывает на то, что будет производиться шифрование сообщения и требуется поставить в соответствие буквам открытого текста буквы перестановки. Значение 1, напротив, указывает на то, что будет производиться дешифрование сообщения и требуется поставить в соответствие буквам перестановки буквы открытого текста. Для этого массив сопоставления символов изначально заполняется таким образом, чтобы каждый символ соответствовал самому себе. Это происходит в следующих строках метода:

...

for Ch := Low(RusDstAlphabet) to High(RusDstAlphabet) do RusDstAlphabet[Ch] := Ch;

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

...

for i := 1 to vleSubst.RowCount – 1 do

RusDstAlphabet[vleSubst.Cells[nKey, i][1]] :=

vleSubst.Cells[1 – nKey, i][1];

Редактор

значений vleSubst предназначен для сопоставления букв верхнего регистра. Нам же требуется избавиться от различия между буквами верхнего и нижнего регистров. Для этого мы дополнительно производим следующие действия:

...

for i := 1 to vleSubst.RowCount – 1 do

RusDstAlphabet[LowCaseRus(vleSubst.Cells[nKey, i][1])] :=

LowCaseRus(vleSubst.Cells[1 – nKey, i][1]);

Мы рассмотрели работу данного метода по частям. Его полный код приведен в листинге 12.6. Как видите, все относительно просто. Здесь мы используем вспомогательную функцию LowCaseRus.

...

Листинг 12.6.

Функция предварительной подготовки алфавита преобразования

procedure TfmSubstitution.RecalcAlphabet(nKey: Integer);

var

Ch: Char;

i: Integer;

begin

//предварительно все символы в алфавите шифрования

//соответствуют символам из незашифрованного алфавита

for Ch := Low(RusDstAlphabet) to High(RusDstAlphabet) do

RusDstAlphabet[Ch] := Ch;

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

//здесь для верхнего

for i := 1 to vleSubst.RowCount – 1 do

RusDstAlphabet[vleSubst.Cells[nKey, i][1]] :=

vleSubst.Cells[1 – nKey, i][1];

//здесь для нижнего

for i := 1 to vleSubst.RowCount – 1 do

RusDstAlphabet[LowCaseRus(vleSubst.Cells[nKey, i][1])] :=

LowCaseRus(vleSubst.Cells[1 – nKey, i][1]);

end;

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

...

Листинг 12.7.

Преобразование строки при помощи массива сопоставления

function TfmSubstitution.EncryptDecryptString(strMsg: String):

String;

var

i: Integer;

begin

//преобразуем строку посимвольно

for i := 1 to Length(strMsg) do

strMsg[i] := RusDstAlphabet[strMsg[i]];

Result := strMsg;

end;

Теперь, используя все описанные функции, мы без труда можем зашифровать либо дешифровать сообщение. Например, чтобы зашифровать его, мы подготавливаем массив соответствия букв вызовом функции RecalcAlphabet с параметром 0. После чего для каждой строки открытого текста вызываем функцию EncryptDecryptString и в качестве результата получаем зашифрованную строку. Обработчики событий OnClick соответствующих кнопок шифруют либо дешифруют весь текст. Основная идея каждого из методов заключается в том, чтобы проверить корректность заданной перестановки, после чего производится предварительная подготовка алфавита сопоставления, и далее сообщение преобразуется (листинг 12.8).

Поделиться:
Популярные книги

Замуж второй раз, или Ещё посмотрим, кто из нас попал!

Вудворт Франциска
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Замуж второй раз, или Ещё посмотрим, кто из нас попал!

Протокол "Наследник"

Лисина Александра
1. Гибрид
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Протокол Наследник

Сердце Дракона. Том 11

Клеванский Кирилл Сергеевич
11. Сердце дракона
Фантастика:
фэнтези
героическая фантастика
боевая фантастика
6.50
рейтинг книги
Сердце Дракона. Том 11

Вперед в прошлое!

Ратманов Денис
1. Вперед в прошлое
Фантастика:
попаданцы
5.00
рейтинг книги
Вперед в прошлое!

Шесть принцев для мисс Недотроги

Суббота Светлана
3. Мисс Недотрога
Фантастика:
фэнтези
7.92
рейтинг книги
Шесть принцев для мисс Недотроги

Хочу тебя любить

Тодорова Елена
Любовные романы:
современные любовные романы
5.67
рейтинг книги
Хочу тебя любить

Огни Аль-Тура. Желанная

Макушева Магда
3. Эйнар
Любовные романы:
любовно-фантастические романы
эро литература
5.25
рейтинг книги
Огни Аль-Тура. Желанная

Начальник милиции 2

Дамиров Рафаэль
2. Начальник милиции
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Начальник милиции 2

Мастер...

Чащин Валерий
1. Мастер
Фантастика:
героическая фантастика
попаданцы
аниме
6.50
рейтинг книги
Мастер...

Сумеречный стрелок 8

Карелин Сергей Витальевич
8. Сумеречный стрелок
Фантастика:
городское фэнтези
попаданцы
альтернативная история
аниме
5.00
рейтинг книги
Сумеречный стрелок 8

Я до сих пор не князь. Книга XVI

Дрейк Сириус
16. Дорогой барон!
Фантастика:
юмористическое фэнтези
попаданцы
аниме
5.00
рейтинг книги
Я до сих пор не князь. Книга XVI

Обыкновенные ведьмы средней полосы

Шах Ольга
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Обыкновенные ведьмы средней полосы

Метаморфозы Катрин

Ром Полина
Фантастика:
фэнтези
8.26
рейтинг книги
Метаморфозы Катрин

Идеальный мир для Социопата

Сапфир Олег
1. Социопат
Фантастика:
боевая фантастика
рпг
постапокалипсис
6.17
рейтинг книги
Идеальный мир для Социопата