Гибридная система шифрования ГСШ-11

Курский Государственный Университет





Кафедра программного обеспечения и администрирования информационных систем













КУРСОВАЯ РАБОТА



по дисциплине «Программно-аппаратная защита информации»









Тема: Гибридная система шифрования (ГСШ-11)





















Выполнила:

студент гр. 52                                                                                 Ковалёв К.Н.







Принял:

д.т.н., профессор                                                                             Лопин В.Н.

 















Курск 2009


СОДЕРЖАНИЕ



	1. ЗАДАНИЕ НА ПРОЕКТИРОВАНИЕ	3



	2. ЛИСТИНГ ПРОГРАММЫ	4



	3. РЕЗУЛЬТАТЫ ТЕСТИРОВАНИЯ ГСШ-11	15


1. ЗАДАНИЕ НА ПРОЕКТИРОВАНИЕ



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

При выполнении курсовой работы использовать представленную ниже структуру гибридной системы шифрования (ГСШ):





           S

           V

T

F1

F2













В приведенных структурах используются следующие обозначния:



V – шифрование методом полиалфавитной замены;

S – шифрование методом скремблирования;

T – исходный текст;

F1 -  промежуточный шифртекст;

F -  результирующий шифртекст.



Формализация исходных данных методов шифрования:



		Исходные данные метода V определяются длиной ключа K. 

		Исходные данные метода S определяются тройкой (conf, C0, n), где:

		conf – конфигурация генератора псевдослучайных чисел, определяющая расположение сумматоров по модулю два в обратной связи генератора:

		C0 – начальное состояние генератора;

		n – количество двоичных разрядов генератора.



k

conf

C0

n

8

1362

834

14




2. ЛИСТИНГ ПРОГРАММЫ



unit Unit1;



interface



uses

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

  Dialogs, StdCtrls, ExtCtrls, Grids, Math, Buttons;



type

  TForm1 = class(TForm)

    GroupBox2: TGroupBox;

    Memo1: TMemo;

    GroupBox1: TGroupBox;

    Button1: TButton;

    Button4: TButton;

    Button3: TButton;

    Memo2: TMemo;

    Button2: TButton;

    Button7: TButton;

    Button8: TButton;

    Button9: TButton;

    GroupBox4: TGroupBox;

    Memo3: TMemo;

    Label1: TLabel;

    Label3: TLabel;

    Label4: TLabel;

    Button5: TButton;

    OpenDialog1: TOpenDialog;

    SaveDialog1: TSaveDialog;

    Button10: TButton;

    Button11: TButton;

    Button6: TButton;

    BitBtn1: TBitBtn;

    BitBtn2: TBitBtn;

    BitBtn3: TBitBtn;

    LabeledEdit1: TLabeledEdit;

    BitBtn4: TBitBtn;

    Button12: TButton;

    Label2: TLabel;

    procedure Button1Click(Sender: TObject);

    procedure Matrix;

    procedure FormCreate(Sender: TObject);

    procedure Zashifr;

    procedure Button2Click(Sender: TObject);

    procedure Button3Click(Sender: TObject);

    Procedure Rashifr;

    procedure Button4Click(Sender: TObject);

    procedure Button7Click(Sender: TObject);

    procedure Button5Click(Sender: TObject);

    procedure Button6Click(Sender: TObject);

    procedure Button9Click(Sender: TObject);

    procedure SymvToBit(cq:char);

    function  CodeToSymv: integer;

    procedure Posl;

    procedure NachC(var j,k:longint;n:Byte);

    procedure Button8Click(Sender: TObject);

    procedure Button10Click(Sender: TObject);

    procedure Button11Click(Sender: TObject);

    procedure BitBtn1Click(Sender: TObject);

    procedure BitBtn2Click(Sender: TObject);

    procedure BitBtn3Click(Sender: TObject);

    procedure BitBtn4Click(Sender: TObject);

    procedure Button12Click(Sender: TObject);





  private

    { Private declarations }

  public

    { Public declarations }

  end;



var

  Form1: TForm1;

  alf,s: String;

  M:array of String;

  Z,key,C,T: array of byte;

  p:longint;

  FName:String;

  F:TextFile;

  NText:TMemo;





implementation



{$R *.dfm}



procedure TForm1.Button3Click(Sender: TObject);      //1z

Var    Ch:Char;

begin

memo1.Text:='';

memo2.Text:='';

memo3.Text:='';

  If OpenDialog1.Execute then

  Begin

  AssignFile(F,OpenDialog1.FileName);

  FName:=OpenDialog1.FileName;

  Reset(F);

  If IOResult=0 then Begin

    While not Eof(f) do

      Begin

        Read(F,Ch);

        Memo1.Text:=Memo1.Text+Ch;

      End;

    CloseFile(F);

                     End;

                     End;



end;



procedure TForm1.Button5Click(Sender: TObject);  //1s

begin

  FName:='Скремблер';

  SaveDialog1.FileName:=Fname;

  If SaveDialog1.Execute then Fname:=SaveDialog1.FileName;

  Memo1.Lines.SaveToFile(FName);

end;



procedure TForm1.Matrix; //Матрица V

Var i,k:word;

Begin

 Setlength(M,length(s)+1);

 M[0]:=alf;

 For i:=1 to Length(s) do

   Begin

     k:=pos(s[i],alf);

     M[i]:=Copy(alf,k,length(alf)-k+1)+copy(alf,1,k-1);

   End;

End;



Procedure TForm1.Zashifr;//Процедура шифрования

Var k,j,l:wORD;

    i:longword;

Begin

Matrix;

Memo3.Text:='';

i:=1;

k:=1;

While i<Length(Memo1.Text)+1 do

Begin

 If k=Length(s)+1 then Begin

                              k:=1;

                              End;

 j:=1;

 While M[j][1]<>s[k] do

   j:=j+1;

   l:=pos(Memo1.Text[i],M[0]);

 Memo3.Text:=Memo3.Text+M[j][l];

 k:=k+1;

 i:=i+1;

End;

End;



Procedure TForm1.Rashifr;//Процедура дешифрования

Var k,j,l:wORD;

    i:longword;

Begin

Matrix;

Memo2.Text:='';

i:=1;

k:=1;

While i<Length(Memo1.Text)+1 do

Begin

 If k=Length(s)+1 then Begin

                              k:=1;

                              End;

 j:=1;

 While M[j][1]<>s[k] do

   j:=j+1;

   l:=pos(Memo1.Text[i],M[j]);

 Memo2.Text:=Memo2.Text+M[0][l];

 k:=k+1;

 i:=i+1;

End;

End;



//Дешифрование V

procedure TForm1.Button4Click(Sender: TObject);

begin

Button12.Visible:=True;

LabeledEdit1.Visible:=True;

end;



//Шифрование V

procedure TForm1.Button1Click(Sender: TObject);

Var u:Integer;

begin

LabeledEdit1.Visible:=True;

BitBtn4.Visible:=True;

end;



procedure TForm1.FormCreate(Sender: TObject);

var i:byte;

begin

Memo1.Text:='';

Button12.Visible:=False;

LabeledEdit1.Visible:=False;

BitBtn4.Visible:=False;

For i:=0 to 255 Do

alf:=alf+char(i);

end;



Procedure TForm1.NachC(var j,k:longint;n:Byte);//Формир-ние битовых послед-ностей:

Var  i:Byte;                                      // конфигурация и начальное состояние

Begin

SetLength(Z,n);

SetLength(key,n);

  For i:=n-1 downto 0 do

    Begin

      If j>1 then Begin

                      Z[i]:=j mod 2;

                      j:=j div 2;

                      End

         Else if j=1 then

                      Begin

                      Z[i]:=1;

                      j:=0;

                      End

           Else Z[i]:=0;

      If k>1 then Begin

                      key[i]:=k mod 2;

                      k:=k div 2;

                      End

         Else if k=1 then

                      Begin

                      key[i]:=1;

                      k:=0;

                      End

           Else key[i]:=0;

    End;

End;



Procedure TForm1.Posl;//Формирование псевдослуч. посл-ти

 Var Q: array of byte;

    k:Byte;

    j,i:Integer;

Begin

  Setlength(Q,Length(Z));

  Setlength(C,Trunc(IntPower(2,Length(Z))));

  For j:=0 to Length(Z)-1 do

     Q[j]:=key[j];

  j:=0;

  While j<Trunc(IntPower(2,Length(Z))) do

  Begin

    i:=High(Z);

    p:=Q[i];

  While i>0 do

    Begin

      If Z[i-1]=1 then p:=p xor q[i-1];

      i:=i-1;

    End;

    C[j]:=Q[High(Q)];

  For k:=High(Q) downto 1 do

        Q[k]:=Q[k-1];

    Q[0]:=p;

    p:=0;

  For k:=0 to High(Q) do

        If Q[k]=key[k] then p:=p+1;

     If p=Length(Q) then Begin

                         p:=j;

                         j:=Trunc(IntPower(2,Length(Z)));

                         End

                    else j:=j+1;

  End;

  Label2.Caption:='Длина последовательности='+IntToStr(p);

End;



Procedure TForm1.SymvToBit(cq:char);//Преобразования символа в бит.посл-ть

Var k,j:Byte;

Begin

  j:=ord(cq);//символ переводится в его порядковый № в таблице символов

  For k:=7 downto 0 do

    Begin

      If j>1 then Begin

                      T[k]:=j mod 2;

                      j:=j div 2;

                      End

         Else if j=1 then

                      Begin

                      T[k]:=1;

                      j:=0;

                      End

           Else T[k]:=0;

    End;

End;



Function TForm1.CodeToSymv: integer; //Преобразование кода в символ

Var k:Byte;

    Z,i:Integer;

Begin

Z:=0;

  For k:=0 to 7 do

      Z:=Z+T[k]*Trunc(IntPower(2,7-k));

CodeToSymv:=Z;

End;



procedure TForm1.Button7Click(Sender: TObject);    //2z

 Var    Ch:Char;

begin

  memo2.Text:='';

  memo3.Text:='';

  If OpenDialog1.Execute then

  Begin

  AssignFile(F,OpenDialog1.FileName);

  FName:=OpenDialog1.FileName;

  Reset(F);

  If IOResult=0 then Begin

    While not Eof(f) do

      Begin

        Read(F,Ch);

        Memo2.Text:=Memo2.Text+Ch;

      End;

    CloseFile(F);

                     End;

  End;

end;



procedure TForm1.Button8Click(Sender: TObject); //Шифрование S

Var conf,c0:LongInt;

    n:Byte;

    k:Longword;

    j,l:Word;

    i:byte;

begin

   conf:=1362;

   c0:=834;

   n:=14;

 NachC(conf,c0,n);

 Posl;

  Setlength(T,8);

  j:=0;

  Memo1.Text:='';

  For k:=1 to Length(Memo2.Text) do

    Begin

      SymvToBit(Memo2.Text[k]);

      If j<p-1 then For l:=0 to 7 do

                      Begin

                       T[l]:=C[j] xor T[l];

                       j:=j+1;

                      End

         Else

               Begin

               T[l]:=C[j] xor T[l];

               j:=0;

               End;

      Memo1.Text:=Memo1.Text+char(CodeToSymv);

    End;

end;



procedure TForm1.Button2Click(Sender: TObject); //2s

begin

  FName:='Полиалфиват';

  SaveDialog1.FileName:=Fname;

  If SaveDialog1.Execute then Fname:=SaveDialog1.FileName;

  Memo2.Lines.SaveToFile(FName);

End;



procedure TForm1.Button6Click(Sender: TObject);  //3s

begin

  FName:='шифр-текст';

  SaveDialog1.FileName:=Fname;

  If SaveDialog1.Execute then Fname:=SaveDialog1.FileName;

  Memo3.Lines.SaveToFile(FName);

end;



procedure TForm1.Button9Click(Sender: TObject); //Дешифрование S

Var conf,c0:LongInt;

    n:Byte;

    k:Longword;

    j,l:Word;

    i:byte;

begin

   conf:=1362;

   c0:=834;

   n:=14;

 NachC(conf,c0,n);

     Posl;

  Setlength(T,8);

  j:=0;

  Memo3.Text:='';

  For k:=1 to Length(Memo2.Text) do

    Begin

      SymvToBit(Memo2.Text[k]);

      If j<p-1 then For l:=0 to 7 do

                      Begin

                       T[l]:=C[j] xor T[l];

                       j:=j+1;

                      End

         Else

               Begin

               T[l]:=C[j] xor T[l];

               j:=0;

               End;

      Memo3.Text:=Memo3.Text+char(CodeToSymv);

    End;

end;



procedure TForm1.Button10Click(Sender: TObject);

begin

Memo1.Text:=Memo3.Text;

Memo2.Text:='';

Memo3.Text:='';

end;



procedure TForm1.Button11Click(Sender: TObject);//Новые параметры

begin

   s:='';

   Memo1.Text:='';

   Memo2.Text:='';

   Memo3.Text:='';

   Label3.Visible:=False;

   Label1.Visible:=False;

   Button4.Visible:=False;

   Button1.Visible:=False;

   Button9.Visible:=False;

   Button8.Visible:=False;



end;



procedure TForm1.BitBtn1Click(Sender: TObject);

begin

  Label3.Visible:=False;

  Label1.Visible:=True;

  Button4.Visible:=False;

  Button1.Visible:=True ;

  Button9.Visible:=False;

  Button8.Visible:=True ;

end;



procedure TForm1.BitBtn2Click(Sender: TObject);

begin

  Label1.Visible:=False;

  Label3.Visible:=True;

  Button1.Visible:=False;

  Button4.Visible:=True;

  Button8.Visible:=False;

  Button9.Visible:=True ;

end;



procedure TForm1.BitBtn3Click(Sender: TObject);

begin

  close

end;



procedure TForm1.BitBtn4Click(Sender: TObject);

Var u:Integer;

begin

LabeledEdit1.Visible:=True;

u:=0;

s :=LabeledEdit1.Text;

while u=0 do

begin

if Length(s)<>8 then

begin

MessageDlg('Длина ключа должна равняться 8! ', mtWarning, [mbOK], 0);

s := InputBox('Метод полиалфавитной замены','Попробуйте еще раз','');

end

else u:=u+1;

end;

BitBtn4.Visible:=False;

LabeledEdit1.Visible:=False;

Zashifr;

end;



procedure TForm1.Button12Click(Sender: TObject);

Var u:Integer;

begin

u:=0;

s :=LabeledEdit1.Text;

while u=0 do

begin

if Length(s)<>8 then

begin

MessageDlg('Длина ключа должна равняться 8!', mtWarning, [mbOK], 0);

s := InputBox('Метод полиалфавитной замены','Попробуйте еще раз','');

end

else u:=u+1;

end;

LabeledEdit1.Visible:=False;

button12.Visible:=False;

Rashifr;



end;



end.




	3. РЕЗУЛЬТАТЫ ТЕСТИРОВАНИЯ ГСШ-11

	

Результат шифрования с использованием гибридной системы шифрования (ГСШ-11):



Результат расшифрования с использованием гибридной системы шифрования (ГСШ-11):



4