Главная | Обратная связь | Поможем написать вашу работу!
МегаЛекции

Криптопреобразования на языке Turbo Pascal




 

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

 

Листинг 1CryptDemo_1;

(*********************************)

(*Шифрование строки текста случайной перестановкой символов.*)

(* Turbo Pascal 3.xx *)

(*********************************)= 'Мама мыла Машу мылом. Маша мыло не любила. '#10;

TestTxt2 = 'Шифрование перестановкой символов.';

FileName = 'DEMO.TXT';

var

I: byte;

C: char;

Line: string [$FF];

CryptTab: array [1..255] of byte;

F: text;

begin

TextBackGround (Black);

(* шифруемый текст *)

Line:= TestTxt1 + TestTxt2;

TextColor (Yellow);

WriteLn (Line);

(* ввод-вывод строки через файл *)

TextColor (LightGreen);

Assign (F, FileName);

Rewrite (F);

WriteLn (F, Line);

Close (F);

Reset (F);

ReadLn (F, Line);

Close (F);

Erase (F);

WriteLn (Line);

(* восстановление строки *)

Line:= TestTxt1 + TestTxt2;

(* рандомизация ключа шифрования *)

Randomize;

(* подготовка таблицы перестановок *)

for I:= 1 to Length (Line) do

CryptTab [I]:= Succ (Random (Length (Line)));

(* шифрование перестановкой символов *)

for I:= 1 to Length (Line) do begin

C:= Line [I];

Line [CryptTab [I]]:= C

end;

TextColor (LightCyan);

WriteLn (Line);

(* дешифрирование перестановки символов *)

for I:= Length (Line) downto 1 do begin

C:= Line [I];

Line [I]:= Line [CryptTab [I]];

Line [CryptTab [I]]:= C

end;

TextColor (White);

Write (Line);

TextColor (LightGray);

Writeln;

Halt

end. (* CryptDemo_1 *)

 

Здесь таблица перестановок CryptTab (играющая роль гаммы шифра) создается случайным образом при каждом вызове программы. Номер элемента I и соответствующее значение CryptTab указывают положение в строке переставляемых элементов. Шифрование и дешифрирование отличаются направлением перебора символов строки. Программа выводит четыре текстовые строки (каждую своим цветом): исходную (желтый), из текстового файла (зеленый), шифровку исходной (циан) и результат ее расшифровки (белый). Обратите внимание на действие преднамеренно введенного управляющего символа перевода строки.

Криптозащиту с помощью замен рассмотрим на примере шифра Гая Юлия Цезаря, описываемого преобразованиями, соответственно прямым:

 

X = Y + (N - Shift) (mod N)                                                      (1)

 

и обратным:

 

Y = X + Shift, (mod N)                                                              (2)

 

где X и Y - позиция исходного и кодированного символа в N-символьном алфавите; - сдвиг 1,2…N-1, не зависящий от номера позиции символа в строке. И взятие по (mod N) напоминает, что соответствующее значение берется по модулю N числа символов в алфавите. Заметим, что всегда

= Y + N. (mod N) (3)

 

К сожалению, напрямую подобное преобразование неприменимо из-за несовпадения способа нумерации строчных символов в алфавите с их кодами в таблице ASCII. Однако преобразованием можно пользоваться, если положение в алфавите символа C с кодом Ord (C) из диапазона 20 h..FFh считать равным:

= Ord (C) - 32                                                                            (4)

 

Число символов в таком алфавите (N) равно 224. Для фиксированного значения сдвига программа шифрования / дешифрирования может быть построена, как показано в листинге 2.

 

Листинг 2 CryptDemo_2;

(****************************)

(*Шифрование строки текста заменой символов 32..255.*)

(* Turbo Pascal 3.xx *)

(****************************)

const

TestTxt1 = 'Мама мыла Машу мылом. Маша мыло не любила. '#10;

TestTxt2 = 'Шифрование заменой символов.';

var

I: byte;

C: char;

Line: string [$FF];

Shift: byte;

begin

TextBackGround (Black);

(* шифруемый текст *)

Line:= TestTxt1 + TestTxt2;

TextColor (Yellow);

WriteLn (Line);

(* рандомизация ключа шифрования *)

Randomize;

Shift:= 1 + Random (223);

(* шифрование заменой символов *)

for I:= 1 to Length (Line) do

if Line [I] >= #32 then

Line [I]:= Chr ((Ord (Line [I]) + 192 - Shift) mod 224 + 32);

TextColor (LightCyan);

WriteLn (Line);

(* дешифрирование замены символов *)

for I:= 1 to Length (Line) do

if Line [I] >= #32 then

Line [I]:= Chr ((Ord (Line [I]) - 32 + Shift) mod 224 + 32);

TextColor (White);

Write (Line);

TextColor (LightGray);

WriteLn;

Halt

end. (* CryptDemo_2 *)

 

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

Усиление криптостойкости шифра Цезаря достигается в том случае, если считать сдвиги зависящими от положения шифруемого символа в строке. Тогда каждому положению символа соответствует своя шифровальная таблица. Число различных таблиц по-прежнему равно N, однако для расшифровки уже необходимо знать порядок следования таблиц. Последнее и обусловливает повышение надежности шифра. При этом достаточно хранить только таблицу сдвигов, выполняющую функцию гаммы шифра, а сами таблицы преобразований символов реконструировать по мере надобности, используя приведенные выше формулы. Способ реализации такого подхода показан в приложении.

Мы рассмотрели применение лишь простейшего способа шифрования текстов Гая Юлия Цезаря на основе перестановок и циклических замен. Надежность каждого из подобных шифров невысока. В то же время их последовательное и многократное применение может повысить криптостойкость шифра. Однако использование одних лишь перестановок или только замен не повышает устойчивости шифра ко взлому и даже способно привести к его вырождению. Комбинация перестановок и подстановок гораздо устойчивее, и применяется в профессиональных системах шифрования.

 


Заключение

 

Стиль программирования - это способ построения программ, основанный на определенных принципах программирования, и выбор подходящего языка, который делает понятными программы, написанные в этом стиле. Концептуальной базой объектно-ориентированного стиля программирования является объектная модель, основывающаяся на четырех главных принципах: абстрагирование; инкапсуляция; модульность; иерархия. Имеются еще три дополнительных принципа, которые не являются обязательными, но полезны: типизация; парллелизм; сохраняемость.

Инкапсуляция - означает, что объекты скрывают детали своей работы. Инкапсуляция позволяет разработчику объекта изменять принципы его функционирования, не оказывая никакого влияния на пользователя объекта.

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

Полиморфизм - многие объекты могут иметь одноименные методы, которые могут выполнять разные действия для разных объектов.

Типизация имеет очень большое значение как в языке Java (сильная типизация), так и в C++, (типизация также является сильной, но существуют правила неявного преобразования типов, определяемых пользователем). В отличие от С++, в Java присутствует непосредственная языковая поддержка принципов параллелизма и сохраняемости.

Без соблюдения данных принципов выразительные способности объектно-ориентированных языков будут при этом потеряны или искажены, и их использование не по назначению приведет к усложнению, а не облегчению решения поставленной задачи.


Поделиться:





Воспользуйтесь поиском по сайту:



©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...