Автор работы: Пользователь скрыл имя, 28 Ноября 2013 в 15:39, доклад
Шифрование по методу Вернама с гаммированием.
ФЕДЕРАЛЬНОЕ АГЕНТСТВО ЖЕЛЕЗНОДОРОЖНОГО ТРАНСПОРТА
Федеральное государственное бюджетное образовательное учреждение высшего профессионального образования
«ИРКУТСКИЙ ГОСУДАРСТВЕННЫЙ
(ФГБОУ ВПО ИрГУПС)
Факультет «Управление на транспорте и информационные технологии»
Кафедра «Информационные системы и защита информации»
ОТЧЁТ
По выполнению лабораторной работы №2
по дисциплине «Технологии и методы программирования»
Лабораторная работа №2
Тема: Шифрование по методу Вернама с гаммированием.
Код программы:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics,
Controls, Forms, Dialogs, StdCtrls, Math;
type
TForm1 = class(TForm)
Label1: TLabel;
Button1: TButton;
OpenDialog1: TOpenDialog;
SaveDialog1: TSaveDialog;
Label2: TLabel;
Button2: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
var
kk: byte=0;
procedure NewKeys(var k0l, k0h: Int64; var keys_v: array of byte);
var
q, r, A, B, m: Int64;
p: ^Int64;
i: integer;
begin
A:= 124775813;
B:= 1;
m:= 4294967296;
r:= 4294967296;
q:=k0l*A;
k0l:= q mod r;
q:= q div r;
k0h:= k0h*A + q;
q:= k0l + b;
k0l:= q mod r;
k0h:= k0h + q div r;
k0h:= k0h div m;
k0l:= ((k0h mod m)*r + k0l) mod m;
p:= @k0l; // Указатель на младшую часть ключа
for i:= 0 to 3 do
keys_v[i]:= Ord((PChar(p)+i)^); // Символы по указателю в k0l
p:= @k0h; // Указатель на старшую часть ключа
for i:= 0 to 3 do
keys_v[i+4]:= Ord((PChar(p)+i)^); // Символы по указателю в k0h
// q:=keys_v[0]+keys_v[1]*256 + keys_v[2]*256*256+keys_v[3]*
// ShowMessage(IntToStr(q) +' '+IntToStr(k0l));
// q:=keys_v[4]+keys_v[5]*256 + keys_v[6]*256*256+keys_v[7]*
// ShowMessage(IntToStr(q) +' '+IntToStr(k0h));
end;
procedure TForm1.Button1Click(Sender: TObject);
var
k0l, k0h, k1l, k1h, q: Int64;
keys_v, buffer: array[0..7] of byte;
i, j, k: integer;
p: ^Int64;//pointer;
f_open, f_save: File;
f_key: TextFile;
fo_name, fs_name: string;
s: string;
label decod;
begin
if kk = 1 then goto decod;
// Генерация первого ключа
randomize;
q:= 2147483648;
k0l:= RandomRange(-q, q-1);
k0h:= RandomRange(-q, q-1);
// Сделать ключ в пределах от 0 до 4294967295=2^32-1
k0l:= k0l + 2147483648;
k0h:= k0h + 2147483648;
//4294967296;
// ShowMessage(IntToStr(q) + ' ' + IntToStr(k0l)+ ' ' + IntToStr(k0h));
//k0l:= 65+66*256+ 67*256*256 + 68*256*256*256;
// ShowMessage(IntToStr(k0l));
p:= @k0l; // Указатель на младшую часть ключа
for i:= 0 to 3 do
keys_v[i]:= Ord((PChar(p)+i)^); // Символы по указателю в k0l
p:= @k0h; // Указатель на старшую часть ключа
for i:= 0 to 3 do
keys_v[i+4]:= Ord((PChar(p)+i)^); // Символы по указателю в k0h
// q:=keys_v[0]+keys_v[1]*256 + keys_v[2]*256*256+keys_v[3]*
// ShowMessage(IntToStr(q) +' '+IntToStr(k0l));
// q:=keys_v[4]+keys_v[5]*256 + keys_v[6]*256*256+keys_v[7]*
// ShowMessage(IntToStr(q) +' '+IntToStr(k0h));
// ShowMessage('Сравнение проведено');
s:= 'Байты ключа записаны в файлe "keys.txt"';// + chr(13) + chr(10);
for i:= 0 to 7 do
s:= s + chr(13) + chr(10) + IntToStr(keys_v[i]);
ShowMessage(s);
AssignFile(f_key, 'keys.txt');
Rewrite(f_key);
writeln(f_key, s);
CloseFile(f_key);
// NewKeys(k0l, k0h, keys_v);
// exit;
decod:
ForceCurrentDirectory:= True; //Для открытия диалогов в каталоге проекта
if kk = 1 then //Когда будем расшифровывать
begin
OpenDialog1.Title:= 'Открыть ключевой файл';
if OpenDialog1.Execute then
AssignFile(f_key, OpenDialog1.FileName)
else
begin
ShowMessage('Не задан файл с ключами');
Exit;
end;
Reset(f_key);
Readln(f_key);
for i:=0 to 7 do
readln(f_key, keys_v[i]);
CloseFile(f_key);
k0l:=keys_v[0]+keys_v[1]*256
+ keys_v[2]*256*256+keys_v[3]*
k0h:=keys_v[4]+keys_v[5]*256
+ keys_v[6]*256*256+keys_v[7]*
end;
OpenDialog1.Title:= 'Открыть исходный файл';
if OpenDialog1.Execute then
begin
fo_name:= OpenDialog1.FileName;
SaveDialog1.Title:= 'Задать результирующий файл';
if SaveDialog1.Execute then
fs_name:= SaveDialog1.FileName
else
begin
ShowMessage('Не задан исходный файл');
Exit;
end;
end
else
begin
ShowMessage('Не
задан файл с выходной
Exit;
end;
Button1.Enabled:= False;
Button2.Enabled:= False;
Label2.Visible:= True;
Form1.Refresh;
AssignFile(f_open, fo_name);
Reset(f_open,1); //Открытие файла-источника
AssignFile(f_save, fs_name);
ReWrite(f_save,1); //Открытие файла-результата
// ShowMessage(fs_name);
j:= 8; //Число считываемых байтов
i:= 8;
BlockRead(f_open, buffer, j, i );
while i > 0 do
begin
for k:=1 to i do
buffer[k-1]:= buffer[k-1] xor keys_v[k-1];
BlockWrite(f_save, buffer, i);
BlockRead(f_open, buffer, j, i );
NewKeys(k0l, k0h, keys_v);
end;
Button1.Enabled:= True;
Button2.Enabled:= True;
Label2.Visible:= False;
CloseFile(f_open);
CloseFile(f_save);
kk:= 0;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
kk:= 1;
Button1Click(Self);
end;
end.