Автор: Пользователь скрыл имя, 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