Скачиваний:
22
Добавлен:
01.05.2014
Размер:
106.5 Кб
Скачать

Негосударственное образовательное учреждение

высшего профессионального образования

Региональный открытый социальный институт

Кафедра программного обеспечения

ОТЧЕТ ПО ЛАБОРАТОРНОЙ РАБОТЕ №2

«Методы и средства защиты компьютерной информации»

Вариант №1

Выполнил

студент

факультета информатики

и вычислительной

техники

5 курса заочного

отделения

Научный руководитель

г. Курск

2009

Алгоритм Плейфера (Playfair).

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

Задание:

Матрица (4 строки на 8 столбцов), Ключевое слово КОМАНДИР,

Исходный текст: ВОТ И СНОВА ОСЕНЬ, Пустышка "Ф"

Подготовка: Основные требования к открытому (исходному) тексту:

  1. при разбиении исходного текста на биграммы не должна возникнуть ситуация, когда в одной биграмме 2 символа одинаковы.

  2. длинна исходного текста должна быть чётной.

Дано слово: ВОТ И СНОВА ОСЕНЬ разбиваем на биграммы: ВО|ТИ|СН|ОВ|АО|СЕ|НЬ Если видим в биграмме у нас находятся 2 одинаковых символа, необходимо изменить текст так, чтобы устранить эту ситуацию. Для этого вводится некий разделяющий символ. (Пустышка "Ф")

Пример: РО|СФ|СИ|Я Длина текста нечётная. Опять используя наш символ получаем: РО|СФ|СИ|ЯФ Теперь можно приступить к шифрованию.

Шифрование:

На рисунке 1 построена матрица по ключевому слову "КОМАНДИР". Шифрование каждой биграммы происходит по следующим правилам:

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

2.Если буквы биграммы попадают в один и тот же столбец матрицы, то каждую из них заменяем буквой следующую за ней (вниз) в том же столбце (столбец считаем цикличным).

3.Если не выполняется ни 1, ни 2 правила, то каждая буква из биграммы заменяется буквой, находящейся на пересечении строки, содержащей эту букву, и столбца, где содержится вторая буква.

Кодируем наше слово ВОТ И СНОВА ОСЕНЬ. Ключ: КОМАНДИР.

Конечный результат, при шифровании текста ВОТ И СНОВА ОСЕНЬ мы получили СВЦМФОВСНМУВЖН

Рис1.- шифрование каждой биграммы

Рис2.- Внешний вид программы

Рис3.- Конечный результат, при шифровании текста

ИСХОДНЫЙ ТЕКСТ ПРОГРАММЫ:

unit Unit1;

interface

uses

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

Dialogs, Grids, StdCtrls, XPMan;

type

TForm1 = class(TForm)

StringGrid1: TStringGrid;

Edit1: TEdit;

Edit2: TEdit;

Button1: TButton;

XPManifest1: TXPManifest;

Button2: TButton;

Label1: TLabel;

Label2: TLabel;

Memo: TMemo;

procedure Button1Click(Sender: TObject);

procedure Button2Click(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;

var

Form1: TForm1;

rot:string ;

implementation

{$R *.dfm}

//-------------------------Шифрование Плэйфера----------------------------------

function Playfair_Crypt(s,key:string):string;

const

//-----------------Размер ключевой матрицы:-------------------------------------

MaxX = 8;//строки

MaxY = 4;//столбцы

//Наш алфавит. Размер должен быть MaxY*MaxX.

//Поэтому в нашем случае убраны буква "ё"

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

var i,j,t,x1,x2,y1,y2 :integer;

M : array[1..MaxY,1..MaxX]of Char; //ключевая матрица

temp :string;

//---Функция поиска символа "с" в ключевой матрице.-----------------------------

//Возвращает строку "y" и столбец "x".

Procedure SimbolPos(c:char;var x,y:integer);

var i,j:integer;

begin

x:=0;

y:=0;

for i := 1 to MaxY do

for j := 1 to MaxX do

if c=M[i,j] then

begin

x:=j;

y:=i;

exit;

end;

end;

label M1;

begin

//---------переводим ключ и исходный текст в нижний регистр.--------------------

key:=AnsiUpperCase(key);

s:=AnsiUpperCase(s);

//----удаляем из строки все символы, не входящие в наш алфавит.-----------------

temp:='';

for i := 1 to length(s) do if pos(s[i],URusA)<>0 then temp:=temp+s[i];

s:=temp;

//----Создание ключевой матрицы, с использованием ключевого слова "key".--------

temp:='';

for i:=1 to length(key) do

if pos(key[i],temp)=0 then temp:=temp+key[i];

for i:=1 to length(URusA) do

if pos(URusA[i],temp)=0 then temp:=temp+URusA[i];

t:=0;

for i:=1 to 4 do

for j:=1 to 8 do

begin

inc(t);

M[i,j]:=temp[t];

form1.StringGrid1.Cells[j,i]:=temp[t];

end;

//----просмотр строки по парам символов и вставка разделяющего символа----------

//"Ь" в случае когда в паре попались одинаковые символы.

M1:

for i:=1 to length(s)div 2 do

begin

if s[2*i-1]=s[2*i] then

begin

insert('Ф',s,2*i);

goto M1;

end;

end;

//-------Добавляем символ в конец строки, если её длина нечётная.---------------

if length(s) MOD 2 = 1 then if s[length(s)]<>'Ф' then s:=s+'Ф'

else s:=s+'Я';

temp:='';

for i:=1 to length(s)div 2 do

begin

SimbolPos(s[2*i-1],x1,y1);

SimbolPos(s[2*i],x2,y2);

//-------------------------------Правило 1--------------------------------------

if y1 = y2 then

begin

inc(x1); inc(x2);

if x1 > MaxX then x1:=x1-MaxX;

if x2 > MaxX then x2:=x2-MaxX;

temp:=temp+M[y1,x1]+M[y2,x2];

end;

//-------------------------------Правило 2--------------------------------------

if x1 = x2 then

begin

inc(y1); inc(y2);

if y1 > MaxY then y1:=y1-MaxY;

if y2 > MaxY then y2:=y2-MaxY;

temp:=temp+M[y1,x1]+M[y2,x2];

end;

//-------------------------------Правило 3--------------------------------------

if (x1<>x2) and (y1<>y2) then temp:=temp+M[y1,x2]+M[y2,x1];

end;

Playfair_Crypt:=temp;

rot:=temp;

end;

procedure TForm1.Button1Click(Sender: TObject);

begin

Memo.Text := Playfair_Crypt(Edit1.Text,Edit2.Text);

end;

//---------------------Дешифрование Плэйфера------------------------------------

function Playfair_DeCrypt(s,key:string):string;

const

//Размер ключевой матрицы:

MaxX = 8;//строки

MaxY = 4;//столбцы

//Наш алфавит. Размер должен быть MaxY*MaxX.

//Поэтому в нашем случае убраны букву "ё".

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

var i,j,t,x1,x2,y1,y2 :integer;

M : array[1..MaxY,1..MaxX]of char; //ключевая матрица

temp :string;

//---------Функция поиска символа "с" в ключевой матрице.-----------------------

//Возвращает строку "y" и столбец "x".

Procedure SimbolPos(c:char;var x,y:integer);

var i,j:integer;

begin

x:=0;

y:=0;

for i := 1 to MaxY do

for j := 1 to MaxX do

if c=M[i,j] then

begin

x:=j;

y:=i;

exit;

end;

end;

label M1;

begin

//---------переводим ключ и исходный текст в нижний регистр.--------------------

key:=AnsiUpperCase(key);

s:=AnsiUpperCase(s);

//-------удаляем из строки все символы, не входящие в наш алфавит.--------------

temp:='';

for i := 1 to length(s) do

begin

if pos(s[i],URusA)<>0 then temp:=temp+s[i];

end;

s:=temp;

//---Создание ключевой матрицы, с использованием ключевого слова "key".---------

temp:='';

for i:=1 to length(key) do

if pos(key[i],temp)=0 then temp:=temp+key[i];

for i:=1 to length(URusA) do

if pos(URusA[i],temp)=0 then temp:=temp+URusA[i];

t:=0;

for i:=1 to 4 do

for j:=1 to 8 do

begin

inc(t);

M[i,j]:=temp[t];

end;

temp:='';

for i:=1 to length(s)div 2 do

begin

SimbolPos(s[2*i-1],x1,y1);

SimbolPos(s[2*i],x2,y2);

//--------------Правило 1-------------------------------------------------------

if y1 = y2 then

begin

dec(x1); dec(x2);

if x1 <= 0 then x1:=x1+MaxX;

if x2 <= 0 then x2:=x2+MaxX;

temp:=temp+M[y1,x1]+M[y2,x2];

end;

//-------------Правило 2--------------------------------------------------------

if x1 = x2 then

begin

dec(y1); dec(y2);

if y1 <= 0 then y1:=y1+MaxY;

if y2 <= 0 then y2:=y2+MaxY;

temp:=temp+M[y1,x1]+M[y2,x2];

end;

//-------------Правило 3--------------------------------------------------------

if (x1<>x2) and (y1<>y2) then temp:=temp+M[y1,x2]+M[y2,x1];

end;

Playfair_DeCrypt:=temp;

end;

procedure TForm1.Button2Click(Sender: TObject);

var

z:string;

begin

z:=Playfair_DeCrypt(Edit1.Text,Edit2.Text);

Memo.Text := z;

end;

end.

9

Соседние файлы в папке Лабораторная работа №22