Лабораторная работа № 2

Тема:Шифрование методом подстановки

Цель работы:Изучить алгоритмы шифров подстановки

Теоретические сведения:Рассмотрим, как зашифровать сообщение методом замены (другими словами - методом подстановки). Вначале используем шифр Цезаря. Предположим, что требуется зашифровать сообщение:

«ГДЕ АББА»

Как известно, циклический шифр Цезаря получается заменой каждой буквы открытого текста буквами этого же алфавита, расположенными впереди через определенное число позиций, например через три позиции. Циклическим он называется потому, что при выполнении замены вслед за последней буквой алфавита вновь следует первая буква алфавита. Запишем фрагменты русского алфавита и покажем, как выполняется шифрование:

 

Рисунок 5– Шифр Цезаря

 

В результате проведенного преобразования получится шифрограмма:

«ЁЖЗ ГДДГ».

В данном случае ключом является величина сдвига (число позиций между буквами). Число ключей этого шифра невелико (оно равно числу букв алфавита). Не представляет труда вскрыть такую шифрограмму перебором всех возможных ключей.

Замена может осуществляться на символы другого алфавита и с более сложным ключом (алгоритмом замены). Для простоты опять приведем лишь начальные части алфавитов. Линии показывают порядок замены букв русского алфавита на буквы латинского алфавита.

В результате такого шифрования получится криптограмма:

«CDB EFFE».

Рациональнее использованный в последнем случае ключ записать в виде таблицы 6:

 

Таблица 6 - Ключ

A Б В Г Д Е
E F A C D B

 

При шифровании буквы могут быть заменены числами (в простейшем случае порядковыми номерами букв в алфавите). Тогда наша шифровка будет выглядеть так:

4-5-6-1-2-2-1.

Замена символов открытого текста может происходить на специальные символы, например на «пляшущих человечков», как в рассказе К.Дойля.

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

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

Ниже в таблице 7 приведен фрагмент многоалфавитного ключа замены.

 

Таблица 7 - Многоалфавитный ключ замены

А Б В Г Д Е

 

С помощью многоалфавитного шифра сообщение «ГДЕ АББА» можно зашифровать несколькими способами:

19-83-32-48-4-7-12,

10-99-15-12-4-14-12 и т.д.

Для каждой буквы исходного алфавита создается некоторое множество символов шифрограммы так, что множества каждой буквы не содержат одинаковых элементов. Многоалфавитные шифры изменяют картину статистических частот появления букв и этим затрудняют вскрытие шифра без знания ключа.

Один из вариантов выполнения лабораторной работы см. в примере 1.

Пример 1:

Unit Unit1;

 

interface

 

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

Dialogs, StdCtrls;

 

type

TForm1 = class(TForm)

Button1: TButton;

Memo1: TMemo;

Button2: TButton;

Memo2: TMemo;

OpenDialog1: TOpenDialog;

procedure Button1Click(Sender: TObject);

procedure Button2Click(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;

 

var

Form1: TForm1;

 

implementation

 

{$R *.dfm}

 

procedure TForm1.Button1Click(Sender: TObject);

var key,key1,gamma: array of integer;

f, f1 : File of Char;

ff : TFileStream;

i,l,j:integer;

s:array of char;

c,c2:Char;

begin

OpenDialog1.Execute;

Memo1.Lines.LoadFromFile(OpenDialog1.FileName);

ff := TFileStream.Create(OpenDialog1.FileName, 0);

l:=ff.Size;

ff.Free;

AssignFile(f,OpenDialog1.FileName);

AssignFile (f1, 'crypt.txt');

Reset (f);

i := 0;

SetLength(s, l);

while not EOF(f) do

begin

read(f ,c) ;

s[i]:=c;

inc(i);

end;

Rewrite (f1);

SetLength(key,3);

key[0]:=4;

key[1]:=31;

key[2]:=15;

l:=Length(s);

SetLength(key1,l);

for i:=0 to 2 do

key1[i]:=key[i];

for i:=3 to (l-1) do

key1[i]:=(key1[i-1]+key1[i-3]) mod 32;

SetLength(gamma,l);

for i:=0 to (l-1) do

gamma[i]:=(key1[i]+key1[i+1]) mod 1111;

 

for i:=0 to (l-1) do

begin

s[i]:=chr((ord(s[i])+gamma[i]) mod 1024);

end;

for i:=0 to (l-1) do

Write (f1, s[i]);

CloseFile (f);

CloseFile (f1);

Memo2.Lines.LoadFromFile('crypt.txt');

end;

 

procedure TForm1.Button2Click(Sender: TObject);

var key,key1,gamma: array of integer;

i,l:integer;

c,c2:Char;

s:array of char;

ff : TFileStream;

f,f1 : file of char;

begin

AssignFile (f1, 'decrypt.txt');

Rewrite (f1);

ff := TFileStream.Create('crypt.txt', 0);

l := ff.Size;

ff.Free;

AssignFile(f, 'crypt.txt');

Reset (f);

i := 0;

SetLength(s, l);

while not EOF(f) do

begin

read(f ,c) ;

s[i]:=c;

inc(i);

end;

SetLength(key,3);

key[0]:=4;

key[1]:=31;

key[2]:=15;

l:=Length(s);

SetLength(key1,l);

for i:=0 to 2 do

key1[i]:=key[i];

for i:=3 to (l-1) do

key1[i]:=(key1[i-1]+key1[i-3]) mod 32;

SetLength(gamma,l);

for i:=0 to (l-1) do

gamma[i]:=(key1[i]+key1[i+1]) mod 1111;

for i:=0 to (l-1) do

begin

s[i]:=chr((ord(s[i])+(1024-gamma[i])) mod 1024);

Write (f1, s[i]);

end;

CloseFile (f);

CloseFile (f1);

Memo2.Lines.LoadFromFile('decrypt.txt');

end;

 

end.

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