Защита данных от несанкционированного доступа
Рефераты >> Программирование и компьютеры >> Защита данных от несанкционированного доступа

NowPos : real;

TPassword : array [1 255] of word;

MasByte, Mas, MasEnd, PS: array [1 64] of word; {массивы перестановок}

T : array [0 64] of word;

DirInfo, DirInfo1 : SearchRec; {данные о файле}

begin

if length(FName) > 3 then {Файл выбран?}

begin

{Получить пароль}

Password := '';

Password1 := '';

InputBox('П А Р О Л Ь', ' Введите пароль:', Password, 255);

InputBox('П А Р О Л Ь', 'Введите пароль еще раз:', Password1, 255);

if (Password = Password1) and (length(Password)<>0) then

begin

{Преобразовать файл}

FindFirst(InputFileName, AnyFile, DirInfo);

if DOSError = 0 then

begin

if DirInfo.Size mod 2 = 1 then

begin

assign(TempFile, InputFileName);

reset(TempFile);

while not EOF(TempFile) do read(TempFile, tmp);

tmp := 255;

write(TempFile, tmp);

close(TempFile);

end;

{Преобразовать имя файла}

Position := 0;

assign(InpF, InputFileName);

reset(InpF);

for i := length(InputFileName) downto 1 do

if InputFileName[i] = '.' then

begin

OutputFileName := copy(InputFileName, 1, i) + 'M&A';

break;

end;

assign(OutF, OutputFileName);

rewrite(OutF);

for i:= 0 to length(InputFileName) do

if InputFileName[length(InputFileName) - i] = '.' then

case i of

0: Exten := chr(0) + chr(0) + chr(0);

1: Exten := copy(FName, length(FName)-2, i) + chr(0) + chr(0);

2: Exten := copy(FName, length(FName)-2, i) + chr(0)

else Exten := copy(FName, length(FName)-2, 3)

end;

for i := 1 to 3 do

begin

Temp := ord(Exten[i]);

Write(OutF, Temp);

end;

{Начать шифрование}

k := 1;

repeat

begin

{Считать из исходного файла блок размером 64*word}

for i:=1 to 64 do

If EOF(InpF) then MasByte[i] := 0 else Read(InpF, MasByte[i]);

Mas := MasByte;

T[0] := ord(Password[k]);

if k < length(Password) then inc(k) else k := 1;

for i:= 1 to 64 do

begin

{Получить текущую позицию процесса}

NowPos := 100*Position/DirInfo.Size;

inc(Position, 2);

if NowPos > 100 then NowPos := 100;

Str(Round(NowPos):3, Pos);

if OptInd = 0 then

begin

GoToXY(77, 1);

Write(Pos + '%');

end;

{Шифровать с помощью ПСЧ}

Code:=Mas[i];

T[i] := (A * T[i-1] + C) mod M;

Code:=T[i] xor Code;

Mas[i] := Code;

end;

for i:=1 to 8 do { Конечная перестановка }

for j:=1 to 8 do

case i of

1: MasEnd[8*(j-1)+i] := Mas[41-j];

2: MasEnd[8*(j-1)+i] := Mas[09-j];

3: MasEnd[8*(j-1)+i] := Mas[49-j];

4: MasEnd[8*(j-1)+i] := Mas[17-j];

5: MasEnd[8*(j-1)+i] := Mas[57-j];

6: MasEnd[8*(j-1)+i] := Mas[25-j];

7: MasEnd[8*(j-1)+i] := Mas[65-j];

8: MasEnd[8*(j-1)+i] := Mas[33-j]

end;

for i:= 1 to 64 do Write(OutF, MasEnd[i]);

end;

until eof(InpF);

MyMessageBox('Файл '+ InputFileName + ' зашифрован с именем ' +

OutputFileName, nil, mfInformation+mfOkButton);

Close(InpF);

if OptFile = 1 then Erase(InpF);

Close(OutF);

end

else MyMessageBox('Файл '+ InputFileName + ' не существует!',

nil, mfInformation+mfOkButton);

end

else MyMessageBox(' Ошибка ввода пароля!!!', nil,

mfError+mfOkButton);

end

else MyMessageBox(' Файл не выбран!!!', nil, mfError+mfOkButton);

end;

procedure DeShifr(InputFileName: String);

const

A = 5;

C = 27;

M = 65536;

var

InpF, OutF : file of word;

Password, OutputFileName : string;

Password1 : string;

Exten : string[3];

SCode, Temp, Ext, TByte, Code: word;

I, J, K : byte;

Position : LongInt;

NowPos : real;

TPassword : array [1 255] of word;

MasByte, Mas, MasEnd, PS : array [1 64] of word;

T : array [0 64] of word;

DirInfo : SearchRec;

begin

if (length(InputFileName) > 3) and

(copy(InputFileName, length(InputFileName)-2, 3) = 'M&A') then

begin

Password := '';

Password1 := '';

InputBox('П А Р О Л Ь', ' Введите пароль:', Password, 255);

InputBox('П А Р О Л Ь', 'Введите пароль еще раз:', Password1, 255);

if (Password = Password1) and (length(Password)<>0) then

begin

FindFirst(InputFileName, AnyFile, DirInfo);

if DOSError = 0 then

begin

Assign(InpF, InputFileName);

Reset(InpF);

Position := 0;

Exten := '';

for i:= 1 to 3 do

begin

Read(InpF, Temp);

Exten := Exten + chr(Temp);

end;

for i := length(InputFileName) downto 1 do

if InputFileName[i] = '.' then

begin

OutputFileName := copy(InputFileName, 1, i) + Exten;

break;

end;

Assign(OutF, OutputFileName);

Rewrite(OutF);

for i := 1 to length(Password) do TPassword[i]:=ord(Password[i]);

k := 1;

repeat

begin

for i:=1 to 64 do Read(InpF, MasByte[i]);

for i:=1 to 8 do { начальная перестановка }

for j:=1 to 8 do

case i of

1: Mas[8*(i-1)+j]:=MasByte[66-8*j];

2: Mas[8*(i-1)+j]:=MasByte[68-8*j];

3: Mas[8*(i-1)+j]:=MasByte[70-8*j];

4: Mas[8*(i-1)+j]:=MasByte[72-8*j];

5: Mas[8*(i-1)+j]:=MasByte[65-8*j];

6: Mas[8*(i-1)+j]:=MasByte[67-8*j];

7: Mas[8*(i-1)+j]:=MasByte[69-8*j];

8: Mas[8*(i-1)+j]:=MasByte[71-8*j]

end;

T[0] := ord(Password[k]);

if k < length(Password) then inc(k) else k := 1;

for i:= 1 to 64 do

begin

NowPos := 100*Position/DirInfo.Size;

inc(Position, 2);

If NowPos > 100 then NowPos := 100;

Str(Round(NowPos):3, Pos);

if OptInd = 0 then

begin

GoToXY(77, 1);

Write(Pos + '%');

end;

T[i] := (A * T[i-1] + C) mod M;

Code:=Mas[i];

Code:=T[i] xor Code;


Страница: