Смекни!
smekni.com

Разработка программы, реализующей алгоритм шифрования ГОСТ 28147-89 (стр. 4 из 4)

Заключение

Криптография сегодня - это важнейшая часть всех информационных систем: от электронной почты до сотовой связи, от доступа к сети Internet до электронной наличности. Криптография обеспечивает подотчетность, прозрачность, точность и конфиденциальность передаваемой информации. Она предотвращает попытки мошенничества в электронной коммерции и обеспечивает юридическую силу финансовых транзакций.

В данной работе изучен алгоритм шифрования ГОСТ 28147-89. Так же на основании этого алгоритма была создана программа. В тексте работы приведено руководство к данной программе.

Список литературы

Герасименко В.А., Малюк А.А. Основы защиты информации. М.: МГИФИ, 1997. – 348 с.

Зима В.М.. Молдовян А.А., Молдовян Н.А. Компьютерные сети и защита передаваемой информации. СПб.: СПбГУ, 1998. – 312 с.

Мельников В.В. Защита информации в компьютерных системах. М.: Финансы и статистика, 1997. – 248 с.

Романец Ю.В.. Тимофеев П.А., Шаньгин В.Ф. Защита информации в компьютерных системах и сетях. М.: Радио и связь, 1999. – 349 с.

Харин Ю.С., Берник В.И., Матвеев Г.В. Математические основы криптологии. Мн.: БГУ, 1999. – 294 с.

Приложение

type

TGOST_Block = array [0..1] of LongWord;

TGOST_Key = array [0..7] of LongWord;

TGOST_TZam256 = array [0..3, 0..255] of Byte;

var

GOST_Key: TGOST_Key =

{Ссылкана key.inc }

GOST_TZam256: TGOST_TZam256 =

{ Ссылкана table.inc }

var

GSeed: TGOST_Block = (0, 0);

ABlock: array [0..127] of TGOST_Block;

b1, b2: TGOST_Block;

procedure GOST_SetSeed(const GS: TGOST_Block);

begin

GSeed := GS

end;

procedure GOST_EncryptBlock(var GBlock: TGOST_Block); assembler;

var

blk: Pointer;

i: LongInt;

label

L, L1, L2;

asm

push ebx

push esi

push edi

mov ebx, GBlock

mov blk, ebx

mov eax, [ebx]

mov edx, [ebx+4]

mov i, 3

L:

mov ecx, 8

lea esi, GOST_Key

L1:

mov edi, eax

add eax, [esi]

lea ebx, GOST_TZam256

xlat

ror eax, 8

add ebx, 256

xlat

ror eax, 8

add ebx, 256

xlat

ror eax, 8

add ebx, 256

xlat

rol eax, 3

xor eax, edx

mov edx, edi

add esi, 4

loop L1

sub i, 1

jnz L

mov ecx, 8

lea esi, GOST_Key

add esi, 28

L2:

mov edi, eax

add eax, [esi]

lea ebx, GOST_TZam256

xlat

ror eax, 8

add ebx, 256

xlat

ror eax, 8

add ebx, 256

xlat

ror eax, 8

add ebx, 256

xlat

rol eax, 3

xor eax, edx

mov edx, edi

sub esi, 4

loop L2

mov ebx, blk

mov [ebx], edx

mov [ebx+4], eax

pop edi

pop esi

pop ebx

end;

procedure GOST_GammaBEn

(FileIn, FileOut: String);

var

i, nb: SmallInt;

lb: Integer;

fin, fout: File;

begin

AssignFile(fin, FileIn);

AssignFile(fout, FileOut);

Rewrite(fout, 1);

FileMode := 0;

Reset(fin, 1);

BlockWrite(fout, GSeed, 8);

b1 := GSeed;

repeat

BlockRead(fin, ABlock, 1024, lb);

nb := (lb - 1) div 8;

for i := 0 to nb do begin

GOST_EncryptBlock(b1);

ABlock[i][0] := ABlock[i][0] XOR b1[0];

ABlock[i][1] := ABlock[i][1] XOR b1[1];

b1 := ABlock[i]

end;

BlockWrite(fout, ABlock, lb)

until lb<>1024;

CloseFile(fout);

CloseFile(fin)

end;

procedure GOST_GammaBDe

(FileIn, FileOut: String);

var

i, nb: SmallInt;

lb: Integer;

fin, fout: File;

begin

AssignFile(fin, FileIn);

AssignFile(fout, FileOut);

Rewrite(fout, 1);

FileMode := 0;

Reset(fin, 1);

BlockRead(fin, GSeed, 8);

b1 := GSeed;

repeat

BlockRead(fin, ABlock, 1024, lb);

nb := (lb - 1) div 8;

for i := 0 to nb do begin

GOST_EncryptBlock(b1);

b2 := ABlock[i];

ABlock[i][0] := ABlock[i][0] XOR b1[0];

ABlock[i][1] := ABlock[i][1] XOR b1[1];

b1 := b2

end;

BlockWrite(fout, ABlock, lb)

until lb<>1024;

CloseFile(fout);

CloseFile(fin)

end;

procedure Burn;

var

i, j: SmallInt;

begin

GSeed[0] := 0;

GSeed[1] := 0;

b1 := GSeed;

b2 := GSeed;

for i := 0 to 127 do ABlock[i] := GSeed;

for i := 0 to 7 do GOST_Key[i] := 0;

for i := 0 to 3 do for j := 0 to 255 do GOST_TZam256[i][j] := 0;

end;

label err;

var

s1, s2: String[255];

s0: String[1];

ext: String[4];

n: Integer;

GS: TGOST_Block;

encr: Boolean;

i: Integer;

begin

n := ParamCount;

if n = 3 then begin

s0 := ParamStr(1);

s1 := ParamStr(2);

s2 := ParamStr(3);

if UpCase(s0[1]) = 'E' then begin

encr := True

end else if UpCase(s0[1]) = 'D' then begin

encr := False

end else begin

goto err

end

end else if n = 2 then begin

s0 := ParamStr(1);

s1 := ParamStr(2);

if UpCase(s0[1]) = 'E' then begin

encr := True;

s2 := s1 + '.gst';

end else if UpCase(s0[1]) = 'D' then begin

ext:=copy(s1, Length(s1) - 3, 4);

for i := 1 to Length(ext) do ext[i]:=UpCase(ext[i]);

if ext = '.GST' then begin

encr := False;

s2 := copy(s1, 1, length(s1) - 4)

end else begin

goto err

end

end else begin

goto err

end

end else if n = 1 then begin

s1 := ParamStr(1);

ext := copy(s1, Length(s1) - 3, 4);

for i := 1 to Length(ext) do ext[i] := UpCase(ext[i]);

if ext = '.GST' then begin

encr := False;

s2 := copy(s1, 1, length(s1) - 4)

end else begin

encr := True;

s2 := s1 + '.gst'

end

end else begin

goto err

end;

if encr then begin

Randomize;

GS[0] := (Random($10000) SHL 16) + Random($10000);

GS[1] := (Random($10000) SHL 16) + Random($10000);

GOST_EncryptBlock(GS);

GOST_SetSeed(GS);

GOST_GammaBEn(s1, s2)

end else begin

GOST_GammaBDe(s1, s2)

end;

Burn;

exit;

err:

Burn;

WriteLn('gost_pa e|d <infile> <outfile>');

end.