Автор: Пользователь скрыл имя, 08 Декабря 2011 в 19:45, курсовая работа
Стремительное развитие средств вычислительной техники и открытых сетей передачи данных обусловило их широкое распространение в повседневной жизни и предпринимательской деятельности. Мощные вычислительные возможности и оперативность передачи информации не только оказали большое влияние на принципы ведения бизнеса, сложившиеся в большинстве традиционных отраслей, но и открыли новые направления развития предпринимательской деятельности. В современных условиях автоматизация банковской деятельности и управления предприятиями является «modus vivendi», а такие слова, как «Internet-banking», «e-commerce» и «smart-cards», уже не вызывают всеобщего удивления и жарких дебатов.
Однако последние достижения человеческой мысли в области компьютерных технологий связаны с появлением не только персональных компьютеров, сетей передачи данных и электронных денег, но и таких понятий, как хакер, информационное оружие, компьютерные вирусы и т.п. Оказывается, что под информационной безопасностью подразумевается одно из ведущих направлений развития информационных технологий - круг задач, решаемых в этой области, постоянно расширяется как в количественном, так и в качественном отношении.
Введение 4
1 Алгоритм Blowfish 29
1.1 Сеть Фейстеля 30
1.2 Описание алгоритма 33
1.3 Стойкость алгоритма 36
2 Криптографические системы 6
2.1 Основные понятия 6
2.2 Требования к криптографическим системам 7
2.3 Симметричные криптосистемы 9
2.4 Ассиметричные криптосистемы 11
2.5 Математические основы 15
3 Выбор оптимального блочного алгоритма шифрования 19
3.1 Сравнительная характеристика алгоритмов 19
3.2 Криптостойкость рассмотренных алгоритмов 25
4 Описание работы программы 38
Заключение 41
Список используемых источников 42
Приложение А Исходный код алгоритма Blowfish 43
var
i, j: integer;
data, datal, datar: UWORD_32bits;
temp: aword;
Key:
PChar;
begin
If Length(FKey)
= 0 then exit;{divide by zero, ohh}
Key := StrAlloc(Length(FKey) + 1);
try {protect dyanmic memory allocation}
StrPCopy(Key, FKey);
j :=
0;
For i:= 0 to (bf_N + 1) do begin
temp.Lword := 0;
temp.w.byte0 := BYTE(Key[j]);
temp.w.byte1 := BYTE(Key[(j+1) MOD Length(FKey)]);
temp.w.byte2 := BYTE(Key[(j+2) MOD Length(FKey)]);
temp.w.byte3 := BYTE(Key[(j+3) MOD Length(FKey)]);
data := temp.Lword;
Fpbf_P^[i] := Fpbf_P^[i] Xor data;
j := (j + 4) MOD Length(FKey);
end;{For}
{zeroize copy of Key for security}
FillChar(Key^,
Length(FKey), #0);
datal := 0; FpXl := @datal;
datar
:= 0; FpXr := @datar;
i:= 0;
while (i < (bf_N + 2)) do begin
BF_Encipher;
Fpbf_P^[i] := datal;
Fpbf_P^[i + 1] := datar;
Inc(i, 2);
end;
j:=0;
For i:= 0 to 3 do begin
while (j < 256) do begin
BF_Encipher;
Fpbf_S^[i, j] := datal;
Fpbf_S^[i, j + 1] := datar;
Inc(j, 2);
end;{j while}
j:= 0;
end;{i for}
finally
StrDispose(Key);
end;
end;
Procedure TBlowFish.BF_Encipher
var
Xr: aword;
begin
FpXl^.Lword := FpXl^.Lword Xor Fpbf_P^[0];
ROUND (FpXr, FpXl, 1); ROUND (FpXl, FpXr, 2);
ROUND (FpXr, FpXl, 3); ROUND (FpXl, FpXr, 4);
ROUND (FpXr, FpXl, 5); ROUND (FpXl, FpXr, 6);
ROUND (FpXr, FpXl, 7); ROUND (FpXl, FpXr, 8);
ROUND (FpXr, FpXl, 9); ROUND (FpXl, FpXr, 10);
ROUND (FpXr, FpXl, 11); ROUND (FpXl, FpXr, 12);
ROUND (FpXr, FpXl, 13); ROUND (FpXl, FpXr, 14);
ROUND (FpXr, FpXl, 15); ROUND (FpXl, FpXr, 16);
FpXr^.Lword
:= FpXr^.Lword Xor Fpbf_P^[17];
Xr := FpXr^;
FpXr^ := FpXl^;
FpXl^ := Xr;
end;
Procedure TBlowFish.BF_Decipher;
var
Xr: aword;
begin
{$IFDEF ORDER_DCBA}
Xr := FpXl^;
FpXl^.w.byte3 := Xr.w.byte0;
FpXl^.w.byte2 := Xr.w.byte1;
FpXl^.w.byte1 := Xr.w.byte2;
FpXl^.w.byte0 := Xr.w.byte3;
Xr := FpXr^;
FpXr^.w.byte3 := Xr.w.byte0;
FpXr^.w.byte2 := Xr.w.byte1;
FpXr^.w.byte1 := Xr.w.byte2;
FpXr^.w.byte0 := Xr.w.byte3;
{$ENDIF}
FpXl^.Lword := FpXl^.Lword Xor Fpbf_P^[17];
ROUND (FpXr, FpXl, 16); ROUND (FpXl, FpXr, 15);
ROUND (FpXr, FpXl, 14); ROUND (FpXl, FpXr, 13);
ROUND (FpXr, FpXl, 12); ROUND (FpXl, FpXr, 11);
ROUND (FpXr, FpXl, 10); ROUND (FpXl, FpXr, 9);
ROUND (FpXr, FpXl, 8); ROUND (FpXl, FpXr, 7);
ROUND (FpXr, FpXl, 6); ROUND (FpXl, FpXr, 5);
ROUND (FpXr, FpXl, 4); ROUND (FpXl, FpXr, 3);
ROUND (FpXr, FpXl, 2); ROUND (FpXl, FpXr, 1);
FpXr^.Lword
:= FpXr^.Lword Xor Fpbf_P^[0];
Xr := FpXr^;
FpXr^ := FpXl^;
FpXl^ := Xr;
{Intelx86}
{$IFDEF ORDER_DCBA}
Xr := FpXl^;
FpXl^.w.byte3 := Xr.w.byte0;
FpXl^.w.byte2 := Xr.w.byte1;
FpXl^.w.byte1 := Xr.w.byte2;
FpXl^.w.byte0 := Xr.w.byte3;
Xr := FpXr^;
FpXr^.w.byte3 := Xr.w.byte0;
FpXr^.w.byte2 := Xr.w.byte1;
FpXr^.w.byte1 := Xr.w.byte2;
FpXr^.w.byte0 := Xr.w.byte3;
{$ENDIF}
end;
Procedure TBlowFish.EncipherBLOCK;
var
pLong64: PtwoAword;
leLong64: twoAword;
begin
pLong64 := @FSmallBuffer;
FpXl := @pLong64^.Xl;
FpXr
:= @pLong64^.Xr;
{Intelx86}
{$IFDEF ORDER_DCBA}
leLong64 := pLong64^;
pLong64^.Xl.w.byte3 := leLong64.Xl.w.byte0;
pLong64^.Xl.w.byte2 := leLong64.Xl.w.byte1;
pLong64^.Xl.w.byte1 := leLong64.Xl.w.byte2;
pLong64^.Xl.w.byte0 := leLong64.Xl.w.byte3;
pLong64^.Xr.w.byte3 := leLong64.Xr.w.byte0;
pLong64^.Xr.w.byte2 := leLong64.Xr.w.byte1;
pLong64^.Xr.w.byte1 := leLong64.Xr.w.byte2;
pLong64^.Xr.w.byte0 := leLong64.Xr.w.byte3;
{$ENDIF}
BF_Encipher;
{$IFDEF ORDER_DCBA}
leLong64 := pLong64^;
pLong64^.Xl.w.byte3 := leLong64.Xl.w.byte0;
pLong64^.Xl.w.byte2 := leLong64.Xl.w.byte1;
pLong64^.Xl.w.byte1 := leLong64.Xl.w.byte2;
pLong64^.Xl.w.byte0 := leLong64.Xl.w.byte3;
pLong64^.Xr.w.byte3 := leLong64.Xr.w.byte0;
pLong64^.Xr.w.byte2 := leLong64.Xr.w.byte1;
pLong64^.Xr.w.byte1 := leLong64.Xr.w.byte2;
pLong64^.Xr.w.byte0 := leLong64.Xr.w.byte3;
{$ENDIF}
end;
Procedure TBlowFish.DecipherBLOCK;
var
pLong64: PtwoAword;
begin
pLong64 := @FSmallBuffer;
FpXl := @pLong64^.Xl;
FpXr := @pLong64^.Xr;
BF_Decipher;
end;
end.
Информация о работе Криптографические алгоритмы защиты информации Blowfish