Криптопреобразования на языке Turbo Pascal
⇐ ПредыдущаяСтр 4 из 4
Криптографические преобразования строк сводятся к перестановкам (перемещениям), заменам (подстановкам) символов в строке или комбинациям обоих методов. Поскольку при перестановках коды символов не меняются, то для шифрования текстовых файлов в большинстве случаев их можно использовать без всяких ограничений. Пример криптозащиты с помощью перестановок показан в листинге 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 Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...
|