Заключение
Криптография сегодня - это важнейшая часть всех информационных систем: от электронной почты до сотовой связи, от доступа к сети 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.