Курский Государственный Университет
Кафедра программного обеспечения и администрирования информационных систем
по дисциплине «Программно-аппаратная защита информации»
Тема: Гибридная система шифрования (ГСШ-11)
Выполнила:
студент гр. 52 Ковалёв К.Н.
Принял:
д.т.н., профессор Лопин В.Н.
СОДЕРЖАНИЕ
1. ЗАДАНИЕ НА ПРОЕКТИРОВАНИЕ.. 3
3. РЕЗУЛЬТАТЫ ТЕСТИРОВАНИЯ ГСШ-11. 15
Разработать прикладное программное обеспечение, реализующее гибридную систему шифрования символьной информации в соответствии с заданным вариантом курсовой работы.
При выполнении курсовой работы использовать представленную ниже структуру гибридной системы шифрования (ГСШ):
В приведенных структурах используются следующие обозначния:
V – шифрование методом полиалфавитной замены;
S – шифрование методом скремблирования;
T – исходный текст;
F1 - промежуточный шифртекст;
F - результирующий шифртекст.
Формализация исходных данных методов шифрования:
· Исходные данные метода V определяются длиной ключа K.
· Исходные данные метода S определяются тройкой (conf, C0, n), где:
1. conf – конфигурация генератора псевдослучайных чисел, определяющая расположение сумматоров по модулю два в обратной связи генератора:
2. C0 – начальное состояние генератора;
3. n – количество двоичных разрядов генератора.
k | conf | C0 | n |
8 | 1362 | 834 | 14 |
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):