Криптографические алгоритмы защиты информации Blowfish

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

Файлы: 1 файл

курсовая blowfish.docx

— 446.14 Кб (Скачать)

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