Защита от несанкционированного доступа на базе федерального стандарта DES

Функция работает с входными массивами данных с размером 64 бита. Алгоритмы зашифровывания и расшифровывания являются обратными по отношению друг к другу. Структурная схема процесса, выбор и перестановка элементов. Метод гаммирования с обратной связью.

Рубрика Программирование, компьютеры и кибернетика
Вид курсовая работа
Язык русский
Дата добавления 09.03.2009
Размер файла 44,0 K

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.

Министерство образования и науки Украины

ПОЯСНИТЕЛЬНАЯ ЗАПИСКА

к курсовой работе

На тему: «Защита от несанкционированного доступа на базе федерального стандарта DES»

по дисциплине «Кодирование и защита информации»

2004

Содержание

Введение

1. Описания метода зашифровывания по DES

1.1 структурная схема процесса зашифровывания

1.2 Ключ

1.3 Выбор и перестановка

2. Краткий обзор метода зашифровывания информации по ГОСТ

2.1 Метод простой замены по ГОСТ

2.2 Метод гаммирования по ГОСТ

2.3 Гаммирование с обратной связью по ГОСТ

Заключение

Библиографический список

Приложение

Введение

Целью курсового проекта на тему «Защита от несанкционированного доступа на базе федерального стандарта DES» по дисциплине «Кодирование и защита информации» является закрепление знаний, приобретение необходимых практических навыков. В пояснительной записке описан метод ГОСТ, который так же как и метод DES кодируется и декодируется по заданному ключу. Данные методы имеют высокую криптостойкость. Достоинство таких методов заключается в том, что за время существования не было серьезных взломов.

1. Описание метода зашифровывания ПО DES

Предполагается, что функция зашифровывания работает с входными массивами данных с размером 64 бита. Ключ также имеет 64 бита.

Алгоритмы зашифровывания и расшифровывания являются обратными по отношению друг к другу. И строятся они отдельно для 32-х бит старших и 32-х бит младших разрядов.

Старшие 32 бита - L(i)

Младшие 32 бита - R(i).

Алгоритм зашифровывания:

f - функция шифрования

K - ключ.

Алгоритм расшифровывания:

1.1 структурная схема процесса зашифровывания

Начальная перестановка осуществляется по алгоритму:

Пришла последовательность битов (1…64)

Конечная перестановка:

Саму функцию шифрования можно представить следующей структурной схемой:

Заранее строится таблица по каждому из 8-ми блоков S(i), который имеет 4 строчки и 16 столбцов.

Строки нумеруются от 0 до 3

Столбцы от 0 до 15.

Из пришедших 6-ти дв. Разрядов первый и последний определяют номер строки, все остальные определяют номер столбца. В матрице таблицы, также произвольным образом, располагаются числа от 0 до 15 и вых. Является элемент матрицы, определенный строкой и столбцом.

Функция расширения Е:

Функция перестановки Р:

1.2 Ключ

Исходный ключ имеет 64 бита.

56 битов делят на старшие и младшие по 28 разрядов, а затем с каждой из этих половинок осуществляется 16 сдвигов, а на каждом сдвиге вырабатывается свой ключ.

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

1.3 Выбор и перестановка

Из 64 выбрасываются следующие биты:

8, 16, 24, 32, 40, 48, 56, 64 (все кратные 8).

Эти биты из ключа используются для синхро и служебных сигналов.

Перестановка:

Ключевая функция:

Расшифровывание производится совершенно аналогичным образом только от конца к началу, в соответствии с функцией расшифровывания.

Криптостойкость этого метода такова, что по стоимости и времени взлом получается не выгодным.

2. Краткий обзор метода зашифровывания информации по ГОСТ

Такой метод защиты предполагает зашифровывание и расшифровывание, как и в методе DES, одним и тем же ключом.

В DES размер ключа мал (количество переборов мало). А в ГОСТе размер ключа не 64, а 256 бит, и представляет он собой 8 сегментов по 32 бита каждый.

W=X(7)X(6)X(5)X(4)X(3)X(4)X(3)X(2)X(1)X(0)

И предусматривает 3 способа зашифровывания:

метод простой замены

метод гаммирования

метод гаммирования с обратной связью.

И в любом случае предусмотрена также выработка имитовставки.

И для любого метода функции шифрования используют 3 основных действия сложения:

- сложение по модулю 2; [+] - сложение по модулю 232;{+} - сложение по модулю 232-1.

А[+]В=А+В; если А+В?232

А[+]В=А+В-232 ; если А+В=232

А{+}В=А+В, если А+В?232-1

А{+}В=А+В-(232-1), если А+В=232-1

А и В - произвольные 32-х разрядные числа.

Зашифровывание информации производится блоками по 64 бита. Каждый такой блок делится на старшие 32 В(i) и младшие 32 А(i) разряда.

Т(i) 64 бита на В(i)А(i).

2.1 Метод простой замены по ГОСТ

Функция шифрования:

Здесь f - функция шифрования, которая осуществляется над суммой по модулю 2 в 32 степени и происходит в 2 этапа.

На 1 этапе полученная сумма претерпевает изменения. Для этой цели она разбивается на 8 фрагментов по 4 бита в каждом. И замена происходит по соответствующей таблице, входом в которую и являются эти 4 бита. (таблица имеет 16 строк). Все эти 4 бита определяют номер строки. Для каждой итерации своя таблица замены (в общем 32 таблицы).

Второй этап, это циклический сдвиг, замененной 32-х битной комбинации, справа налево на определенное число рядов сдвига.

2.2 Метод гаммирования по ГОСТ

Гамма шифра, каждый i-ый фрагмент которой имеет 64 разряда, а фрагментов столько, сколько фрагментов шифруемого текста.

Г(i)=64

Г(Ш)=Г(1) Г(2)… Г(i)… Г(m) .

Зашифрованная информация представляет собой сумму по модулю два из двух 64-разрядных комбинаций:

А фрагмент гамм шифра Г(i) по ГОСТ получается следующим образом:

Г(i)=(Y(i-1){+}C1,Z(i-1)){+}C2 (5)

Y и Z - это соответственно старшие и младшие 32 разряда.

С1, С2 - константы, заданные ГОСТом.

- функция от 2-х регистров Y и Z, которая абсолютно идентична 1-м 16 шагам функции шифрования алгоритма (3) 1-я часть.

Начальная (нулевая) стадия образования Г.

Это некоторые заданные ГОСТом 32-х разрядные комбинации, которые дают нам синхропосылку (синхрокомбинацию). Это служебная комбинация, без приема которой на приемной стороне расшифровывание не производится:

(Y(0),Z(0))=А(s) (6)

2.3 Гаммирование с обратной связью по ГОСТ

Предполагает, как и в предыдущем методе, наложение на открытые данные гаммы шифра по следующему алгоритму:

1-й фрагмент сложен с синхропосылкой, а посл. С функцией аналогичной функции в методе простой замены на 1-х 16 шагах.

Какой бы ни был выбран метод, необходимо выработать также некоторую эмитовставку, которая имеет р разрядов 32<р?64.

Эмитовставка строится следующим образом:

сумма претерпевает 16 итераций по методу простой замены, получаем

и эта сумма тоже претерпевает 16 итераций , получаем ?2и.

И так далее аналогично, до тех пор, пока мы не используем последний открытый блок данных.

Последняя сумма ?п еще раз итерируется 16 раз и из её 64 разрядов, из любого места подряд, выбирается р разрядов, которые и будут эмитовставкой. И она передается на приемную сторону.

На приемной стороне, после расшифровывания и получения открытых данных:

Т(1)…Т(m) по ним снова, по такому же алгоритму, вырабатывается эмитовставка, которая сравнивается с той, что передана по каналу связи от передающей стороны.

Если обе эмитовставки не совпадают, то сообщение считается ложным.

Заключение

Данная программа разработана в соответствии с поставленной задачей на курсовое проектирование по теме «Защита от несанкционированного доступа на базе федерального стандарта DES» по дисциплине «Кодирование и защита информации». При написании программы использованы методические указания по курсовому проектированию по дисциплине «Кодирование и защита информации». Интерфейс программы удобен для использования. Выходные данные представлены в виде текстовых файлов. По своей структуре программа хорошо организована, что позволяет в случае необходимости легко ее модифицировать. Тестирование программы подтвердило, что программа правильно выполняет кодирование и декодирование различных текстов по данному методу.

Библиографический список

1. в.п. Цымбал «Теория информации и кодирование».

2. А.А. Денисов, Д. Н. Колесников «Теория больших систем управления».

3. Курс лекций по дисциплине «Кодирование и защита информации»

Приложение

unit Unit1;

interface

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

Dialogs, StdCtrls, Menus, Buttons, ComCtrls, Gauges;

type

TMainForm = class(TForm)

Edit1: TEdit;

SpeedButton1: TSpeedButton;

SpeedButton3: TSpeedButton;

OpenDialog1: TOpenDialog;

StatusBar: TStatusBar;

Gauge: TGauge;

Edit2: TEdit;

Label1: TLabel;

Label2: TLabel;

SpeedButton2: TSpeedButton;

procedure SpeedButton3Click(Sender: TObject);

procedure SpeedButton1Click(Sender: TObject);

procedure SpeedButton2Click(Sender: TObject);

private

Crypt: boolean;

procedure SetControls(Enabled: boolean);

end;

var

MainForm: TMainForm;

implementation

uses DesCrypt;

const

DES_ID = $40FAA0C8;

DES_FILE_EXT = '.dcf';

type

TDESFileHeader = record

OrigExt: string[10];

ID: cardinal;

LastBytes: word;

end;

{$R *.dfm}

procedure TMainForm.SpeedButton3Click(Sender: TObject);

var

newFileName, srcFileName: string;

hFindFile, hNewFile, hSrcFile: THANDLE;

tick, BytesRead, BytesWritten: Cardinal;

DES: TDESCryptoStream;

i, len: integer;

FindInfo: WIN32_FIND_DATA;

Buffer64, Writed, FileSize: int64;

FileHeader: TDESFileHeader;

charKey: array [0..7] of char;

Key: int64 absolute charKey;

begin

if Edit1.Text = '' then begin

StatusBar.Panels[0].Text := 'Укажите файл';

Edit1.SetFocus;

Exit;

end

else if not FileExists(Edit1.Text) then begin

StatusBar.Panels[0].Text := 'Файл не найден';

Edit1.SetFocus;

Exit;

end

else if Edit2.Text = '' then begin

StatusBar.Panels[0].Text := 'Введите ключ';

Edit2.SetFocus;

Exit;

end;

// установка ключа

len := Length(Edit2.Text);

if len > 8 then len := 8;

for i := 1 to len do charKey[i-1] := Edit2.Text[i];

srcFileName := Edit1.Text;

newFileName := srcFileName;

// try

// открытие исходного файла

hSrcFile := CreateFile(PChar(srcFileName), GENERIC_READ, FILE_SHARE_READ,

nil, OPEN_EXISTING, 0, 0);

if hSrcFile = INVALID_HANDLE_VALUE then begin

ShowMessage('Source file open error #' + IntToStr(GetLastError));

Exit;

end;

// установка расширения конечного файла

if Crypt then begin

if ExtractFileExt(newFileName) = '' then

newFileName := newFileName + DES_FILE_EXT else

newFileName := ChangeFileExt(newFileName, DES_FILE_EXT);

end

else begin

// чтение заголовка

ReadFile(hSrcFile, FileHeader, SizeOf(FileHeader), BytesRead, nil);

if FileHeader.ID <> DES_ID then begin

ShowMessage('Исходный файл не является закриптованым файлом');

CloseHandle(hSrcFile);

Exit;

end;

newFileName := ChangeFileExt(newFileName, FileHeader.OrigExt);

end;

if FileExists(newFileName) then

if MessageDlg('Файл ' + newFileName + ' уже создан!' + #13 +

'Переписаь файл?', mtWarning, [mbYes, mbNo], -1) = mrNo then begin

CloseHandle(hSrcFile);

Exit;

end

else

DeleteFile(newFileName);

// определение размера файла

hFindFile := FindFirstFile(PChar(srcFileName), FindInfo);

if hFindFile = INVALID_HANDLE_VALUE then begin

ShowMessage('Source file open error #' + IntToStr(GetLastError));

CloseHandle(hSrcFile);

Exit;

end;

FileSize := FindInfo.nFileSizeHigh shl 32 + FindInfo.nFileSizeLow;

// открытие конечного файла

hNewFile := CreateFile(PChar(newFileName), GENERIC_WRITE, FILE_SHARE_READ,

nil, CREATE_NEW, 0, 0);

if hNewFile = INVALID_HANDLE_VALUE then begin

ShowMessage('New file open error #' + IntToStr(GetLastError));

Exit;

end;

SetControls(FALSE);

tick := GetTickCount;

DES := TDESCryptoStream.Create(Key);

if Crypt then begin

StatusBar.Panels[0].Text := 'Кодирование...';

// сохранение заголовка

FileHeader.OrigExt := ExtractFileExt(srcFileName);

FileHeader.ID := DES_ID;

FileHeader.LastBytes := FileSize mod 8;

WriteFile(hNewFile, FileHeader, SizeOf(FileHeader), BytesWritten, nil);

Dec(FileSize, FileHeader.LastBytes);

end

else begin

StatusBar.Panels[0].Text := 'Декодирование...';

Dec(FileSize, SizeOf(FileHeader));

if FileHeader.LastBytes <> 0 then

Dec(FileSize, 8);

end;

// поблочное копирование

Gauge.Progress := 0;

Writed := 0;

for i := 1 to FileSize shr 3 do

if ReadFile(hSrcFile, Buffer64, 8, BytesRead, nil) then

if BytesRead = 8 then begin

// криптование

Application.ProcessMessages;

if Crypt then

Buffer64 := DES.DecryptBlock(Buffer64) else

Buffer64 := DES.EncryptBlock(Buffer64);

// запись блока в файл

WriteFile(hNewFile, Buffer64, (BytesRead shr 3) shl 3, BytesWritten, nil);

Inc(Writed, BytesWritten);

Gauge.Progress := (Writed*100) div FileSize;

end

else

Assert(TRUE);

// запись заключительных 1-8 бит, если они есть

if FileHeader.LastBytes <> 0 then begin

if ReadFile(hSrcFile, Buffer64, 8, BytesRead, nil) then begin

if BytesRead <> FileHeader.LastBytes then

Assert(TRUE);

if Crypt then begin

Buffer64 := Buffer64 shr (8 * (8-FileHeader.LastBytes));

Buffer64 := DES.DecryptBlock(Buffer64);

WriteFile(hNewFile, Buffer64, 8, BytesWritten, nil);

end

else begin

Buffer64 := DES.EncryptBlock(Buffer64);

Buffer64 := Buffer64 shl (8 * (8-FileHeader.LastBytes));

WriteFile(hNewFile, Buffer64, FileHeader.LastBytes, BytesWritten, nil);

end;

end

else

Assert(TRUE);

end;

StatusBar.Panels[0].Text := 'T = ' +

FloatToStrF((GetTickCount-Tick)/1000, ffFixed, 7, 3) + ' сек.';

SetControls(TRUE);

// finally

Windows.FindClose(hFindFile);

DES.Free;

CloseHandle(hNewFile);

CloseHandle(hSrcFile);

// end;

end;

procedure TMainForm.SpeedButton1Click(Sender: TObject);

begin

if OpenDialog1.Execute then begin

Edit1.Text := OpenDialog1.FileName;

if ExtractFileExt(OpenDialog1.FileName) = DES_FILE_EXT then begin

SpeedButton3.Caption := 'Декриптовать';

Crypt := FALSE;

end

else begin

SpeedButton3.Caption := 'Криптовать';

Crypt := TRUE;

end;

end;

end;

procedure TMainForm.SetControls(Enabled: boolean);

begin

SpeedButton1.Enabled := Enabled;

SpeedButton2.Enabled := Enabled;

SpeedButton3.Enabled := Enabled;

Edit1.Enabled := Enabled;

Edit2.Enabled := Enabled;

end;

procedure TMainForm.SpeedButton2Click(Sender: TObject);

begin

Close;

end;

end.

unit DesCrypt;

interface

uses Classes;

type

TDESCryptoStream = class(TMemoryStream)

private

FKey: int64;

FKeys: array [1..16] of int64;

function CreateKey56: int64;

procedure InitKeys;

function Int28ROL(int28: int64; n: integer = 1): int64;

function GetKeyL(key56: int64): int64;

function GetKeyR(key56: int64): int64;

function Permutation48to32(i48: int64): int64;

function Permutation(i64: int64; PMTable: array of integer): int64;

public

constructor Create(const Key: int64);

function DecryptBlock(Block: int64): int64;

function EncryptBlock(Block: int64): int64;

function Write(var Buffer; Count: Integer): Integer; reintroduce; virtual;

function Read(var Buffer; Count: Integer): Integer; override;

end;

implementation

type

TBigInts = array [0..MaxInt div 8 - 1] of Int64;

const

// таблица начальных перестановок

IPR_POS: array [1..64] of integer = (

58, 50, 42, 34, 26, 18, 10, 2,

60, 52, 44, 36, 28, 20, 12, 4,

62, 54, 46, 38, 30, 22, 14, 6,

64, 56, 48, 40, 32, 24, 16, 8,

57, 49, 41, 33, 25, 17, 9, 1,

59, 51, 43, 35, 27, 19, 11, 3,

61, 53, 45, 37, 29, 21, 13, 5,

63, 55, 47, 39, 31, 23, 15, 7

);

// таблица конечных перестановок

IP_POS: array [1..64] of integer = (

40, 8, 48, 16, 56, 24, 64, 32,

39, 7, 47, 15, 55, 23, 63, 31,

38, 6, 46, 14, 54, 22, 62, 30,

37, 5, 45, 13, 53, 21, 61, 29,

36, 4, 44, 12, 52, 20, 60, 28,

35, 3, 43, 11, 51, 19, 59, 27,

34, 2, 42, 10, 50, 18, 58, 26,

33, 1, 41, 9, 49, 17, 57, 25

);

// таблица расширения 32-битного слова в 48-битное

EXPAND32TO48: array [1..48] of integer = (

32, 1, 2, 3, 4, 5,

4, 5, 6, 7, 8, 9,

8, 9, 10, 11, 12, 13,

12, 13, 14, 15, 16, 17,

16, 17, 18, 19, 20, 21,

20, 21, 22, 23, 24, 25,

24, 25, 26, 27, 28, 29,

28, 29, 30, 31, 32, 1

);

// таблица начальных перестановок ключа

KEY_IP_POS: array [1..56] of integer = (

57, 49, 41, 33, 25, 17, 9,

1, 58, 50, 42, 34, 26, 18,

10, 2, 59, 51, 43, 35, 27,

19, 11, 3, 60, 52, 44, 36,

63, 55, 47, 39, 31, 23, 15,

7, 62, 54, 46, 38, 30, 22,

14, 6, 61, 53, 45, 37, 29,

21, 13, 5, 28, 20, 12, 4

);

// таблица конечных перестановок ключа

KEY_IPR_POS: array [1..48] of integer = (

14, 17, 11, 24, 1, 5,

3, 28, 15, 6, 21, 10,

23, 19, 12, 4, 26, 8,

16, 7, 27, 20, 13, 2,

41, 52, 31, 37, 47, 55,

30, 40, 51, 45, 33, 48,

44, 49, 39, 56, 34, 53,

46, 42, 50, 36, 29, 32

);

BLOCK32: array [1..32] of integer = (

16, 7, 20, 21,

29, 12, 28, 17,

1, 15, 23, 26,

5, 18, 31, 10,

2, 8, 24, 14,

32, 27, 3, 9,

19, 13, 30, 6,

22, 11, 4, 25

);

// таблица смещений ключа

KEY_ROL: array [1..16] of integer = (

1, 1, 2, 2, 2, 2, 2, 2,

1, 2, 2, 2, 2, 2, 2, 1

);

// таблицы преобразования 8 в 6

SS: array [0..7, 0..3, 0..15] of integer = (

((14, 4, 13, 1, 2, 15, 11, 8, 3, 10, 6, 12, 5, 9, 0, 7),

( 0, 15, 7, 4, 14, 2, 13, 1, 10, 6, 12, 11, 9, 5, 3, 8),

( 4, 1, 14, 8, 13, 6, 2, 11, 15, 12, 9, 7, 3, 10, 5, 0),

(15, 12, 8, 2, 4, 9, 1, 7, 5, 11, 3, 14, 10, 0, 6, 13)),

((15, 1, 8, 14, 6, 11, 3, 4, 9, 7, 2, 13, 12, 0, 5, 10),

( 3, 13, 4, 7, 15, 2, 8, 14, 12, 0, 1, 10, 6, 9, 11, 5),

( 0, 14, 7, 11, 10, 4, 13, 1, 5, 8, 12, 6, 9, 3, 2, 15),

(13, 8, 10, 1, 3, 15, 4, 2, 11, 6, 7, 12, 0, 5, 14, 9)),

((10, 0, 9, 14, 6, 3, 15, 5, 1, 13, 12, 7, 11, 4, 2, 8),

(13, 7, 0, 9, 3, 4, 6, 10, 2, 8, 5, 14, 12, 11, 15, 1),

(13, 6, 4, 9, 8, 15, 3, 0, 11, 1, 2, 12, 5, 10, 14, 7),

( 1, 10, 13, 0, 6, 9, 8, 7, 4, 15, 14, 3, 11, 5, 2, 12)),

(( 7, 13, 14, 3, 0, 6, 9, 10, 1, 2, 8, 5, 11, 12, 4, 15),

(13, 8, 11, 5, 6, 15, 0, 3, 4, 7, 2, 12, 1, 10, 14, 9),

(10, 6, 9, 0, 12, 11, 7, 13, 15, 1, 3, 14, 5, 2, 8, 4),

( 3, 15, 0, 6, 10, 1, 13, 8, 9, 4, 5, 11, 12, 7, 2, 14)),

(( 2, 12, 4, 1, 7, 10, 11, 6, 8, 5, 3, 15, 13, 0, 14, 9),

(14, 11, 2, 12, 4, 7, 13, 1, 5, 0, 15, 10, 3, 9, 8, 6),

( 4, 2, 1, 11, 10, 13, 7, 8, 15, 9, 12, 5, 6, 3, 0, 14),

(11, 8, 12, 7, 1, 14, 2, 13, 6, 15, 0, 9, 10, 4, 5, 3)),

((12, 1, 10, 15, 9, 2, 6, 8, 0, 13, 3, 4, 14, 7, 5, 11),

(10, 15, 4, 2, 7, 12, 9, 5, 6, 1, 13, 14, 0, 11, 3, 8),

( 9, 14, 15, 5, 2, 8, 12, 3, 7, 0, 4, 10, 1, 13, 11, 6),

( 4, 3, 2, 12, 9, 5, 15, 10, 11, 14, 1, 7, 6, 0, 8, 13)),

(( 4, 11, 2, 14, 15, 0, 8, 13, 3, 12, 9, 7, 5, 10, 6, 1),

(13, 0, 11, 7, 4, 9, 1, 10, 14, 3, 5, 12, 2, 15, 8, 6),

( 1, 4, 11, 13, 12, 3, 7, 14, 10, 15, 6, 8, 0, 5, 9, 2),

( 6, 11, 13, 8, 1, 4, 10, 7, 9, 5, 0, 15, 14, 2, 3, 12)),

((13, 2, 8, 4, 6, 15, 11, 1, 10, 9, 3, 14, 5, 0, 12, 7),

( 1, 15, 13, 8, 10, 3, 7, 4, 12, 5, 6, 11, 0, 14, 9, 2),

( 7, 11, 4, 1, 9, 12, 14, 2, 0, 6, 10, 13, 15, 3, 5, 8),

( 2, 1, 14, 7, 4, 10, 8, 13, 15, 12, 9, 0, 3, 5, 6, 11))

);

// функция, выполняющая перестановку битов по схеме

function TDESCryptoStream.Permutation(i64: int64; PMTable: array of integer): int64;

var

i: integer;

tmp, res: int64;

begin

res := 0;

for i := Low(PMTable) to High(PMTable) do begin

if (i64 and 1) <> 0 then begin

tmp := (int64(1) shl (PMTable[i]-1));

res := res or tmp;

end;

i64 := i64 shr 1;

end;

Result := res;

end;

// функция преобразования 48-битового числа до 32-битового

function TDESCryptoStream.Permutation48to32(i48: int64): int64;

var

i, pos1, pos2: integer;

int4, int6, res: int64;

begin

if (i48 and $FFFF000000000000) <> 0 then Assert(TRUE, 'Error 131');

res := 0;

for i := 0 to 7 do begin

int6 := i48 and $3F;

pos1 := (int6 and 1) or ((int6 and $20) shr 4);

pos2 := (int6 shr 1) and $F;

int4 := SS[i, pos1, pos2];

int4 := int4 shl (i*4);

res := res or int4;

i48 := i48 shr 6;

end;

Result := res;

if (Result and $FFFFFFFF00000000) <> 0 then Assert(TRUE, 'Error 132');

end;

// взятие старшей части ключа

function TDESCryptoStream.GetKeyL(key56: int64): int64;

begin

if (key56 and $FF00000000000000) <> 0 then Assert(TRUE, 'Error 123');

Result := key56 shr 28;

end;

// взятие младшей части ключа

function TDESCryptoStream.GetKeyR(key56: int64): int64;

begin

if (key56 and $FF00000000000000) <> 0 then Assert(TRUE, 'Error 124');

Result := key56 and $FFFFFFF;

end;

// циклическое смещение 28 битного слова влево на n бит

function TDESCryptoStream.Int28ROL(int28: int64; n: integer = 1): int64;

var

bit28on: boolean;

res: int64;

i: integer;

begin

if (int28 and $FFFFFFFFF0000000) <> 0 then Assert(TRUE, 'Error 125');

res := 0;

for i := 1 to n do begin

bit28on := int28 and $4000000 <> 0;

res := (int28 and $7000000) shl 1;

if bit28on then

res := res or 1;

end;

Result := res;

end;

// функция создания ключа, исключая 8, 16, 24, 32, ..., 64 биты

function TDESCryptoStream.CreateKey56: int64;

var

i: integer;

mask, res, tmp: int64;

begin

res := 0;

mask := $7F00000000000000;

for i := 1 to 8 do begin

res := res shr 1;

tmp := (FKey and mask);

res := res or tmp;

mask := mask shr 8;

end;

Result := res;

end;

// функция зашифровывания блока текущим ключем

function TDESCryptoStream.EncryptBlock(Block: int64): int64;

var

blockL, blockR, blockROld: int64;

i: integer;

begin

// инициализация

Block := Permutation(Block, IPR_POS);

blockL := (Block shr 32); // взятие старшей части int64

blockR := Block and $FFFFFFFF; // взятие старшей части int64

// 16 итераций криптования

for i := 1 to 16 do begin

blockROld := blockR;

// шифрование правой части

blockR := Permutation(blockR, EXPAND32TO48);

blockR := blockR xor FKeys[i];

blockR := Permutation48to32(blockR); // преобразование восьми 6-битных слов в 4-битные

blockR := Permutation(blockR, BLOCK32);

blockR := blockR xor blockL;

blockL := blockROld;

end;

Block := (blockL shl 32) or blockR;

Result := Permutation(Block, IP_POS);

end;

// функция расшифровывания блока текущим ключем

function TDESCryptoStream.DecryptBlock(Block: int64): int64;

var

blockL, blockR, blockLOld: int64;

i: integer;

begin

// инициализация

Block := Permutation(Block, IPR_POS);

blockL := (Block shr 32); // взятие старшей части int64

blockR := Block and $FFFFFFFF; // взятие старшей части int64

// 16 итераций декриптования

for i := 16 downto 1 do begin

blockLOld := blockL;

// шифрование правой части

blockL := Permutation(blockL, EXPAND32TO48);

blockL := blockL xor FKeys[i];

blockL := Permutation48to32(blockL);

blockL := Permutation(blockL, BLOCK32);

blockL := blockL xor blockR;

blockR := blockLOld;

end;

Block := (blockL shl 32) or blockR; // объединение частей

Result := Permutation(Block, IP_POS); // конечная перестановка

end;

constructor TDESCryptoStream.Create(const Key: int64);

begin

FKey := Key;

InitKeys;

end;

function TDESCryptoStream.Write(var Buffer; Count: Integer): Integer;

var

i, i64Count: integer;

begin

i64Count := Count shr 4; // определение количества слов по 64 бита

for i := 0 to i64Count-1 do

TBigInts(Buffer)[i] := EncryptBlock(TBigInts(Buffer)[i]);

Result := inherited Write(Buffer, i64Count shl 4);

end;

function TDESCryptoStream.Read(var Buffer; Count: Integer): Integer;

var

i, i64Count: integer;

begin

i64Count := Count shr 3; // определение количества слов по 64 бита

Result := inherited Read(Buffer, i64Count shl 3);

for i := 0 to i64Count-1 do

TBigInts(Buffer)[i] := DecryptBlock(TBigInts(Buffer)[i]);

end;

// функция производящая инициализацио массива клочей для 16 итераций

procedure TDESCryptoStream.InitKeys;

var

key, key48, keyL, keyR: int64;

i: integer;

begin

// инициализация

key := CreateKey56;

key := Permutation(key, KEY_IP_POS);

keyL := GetKeyL(key);

keyR := GetKeyR(key);

// 16 итераций криптования

for i := 1 to 16 do begin

// циклическое смещение половинок ключей влево

keyL := Int28ROL(keyL, KEY_ROL[i]);

keyR := Int28ROL(keyR, KEY_ROL[i]);

key48 := (keyL shl 28) or keyR;

if key48 and $FF00000000000000 <> 0 then Assert(TRUE);

key48 := Permutation(key48, KEY_IPR_POS); // преобразование 56 битного ключа в 48

FKeys[i] := key48;

end;

end;

end.


Подобные документы

  • Программный модуль, обеспечивающий шифрование и расшифровывание информационных блоков. Защита информации, хранящейся в электронном виде, от несанкционированного доступа. Выбор методов шифрования. Программная реализация. Руководство пользователя.

    курсовая работа [184,0 K], добавлен 09.03.2009

  • Защита от несанкционированного доступа к информации: биометрическая и с использованием паролей. Физическая защита данных на дисках. Понятие вредоносных и антивирусных программ. Компьютерные вирусы, сетевые черви, троянские программы и защита от них.

    презентация [2,4 M], добавлен 07.12.2014

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

    реферат [115,1 K], добавлен 16.03.2014

  • Исторические аспекты возникновения и развития информационной безопасности. Средства обеспечения защиты информации и их классификация. Виды и принцип действия компьютерных вирусов. Правовые основы защиты информации от несанкционированного доступа.

    презентация [525,3 K], добавлен 09.12.2015

  • Описания режимов шифрования с использованием электронной книги кодов, с посимвольной и внутренней обратной связью. Генератор реальных случайных последовательностей. Линейный сдвиговый регистр с обратной связью. Генерация ключей в министерстве обороны США.

    реферат [206,1 K], добавлен 18.01.2015

  • Защита от несанкционированного доступа. Классификация автоматизированных систем и требования по защите информации. Средство защиты информации от несанкционированного доступа Secret Net 6.0. Разработка интерфейсной части программы, целевых функций.

    дипломная работа [1,2 M], добавлен 20.12.2013

  • Понятие процесса архивации файлов. Программы, осуществляющие упаковку и распаковку файлов. Защита информации от несанкционированного доступа. Самораспаковывающиеся архивы. Основные характеристики программ-архиваторов. Распространенные алгоритмы сжатия.

    презентация [801,6 K], добавлен 23.10.2013

  • Построение целостной системы защиты автоматизированной информационной системы. Особенности систем защиты от несанкционированного доступа на автономных компьютерах и рабочих станциях в локальных вычислительных сетях, защита от несанкционированного доступа.

    курсовая работа [1,5 M], добавлен 28.01.2010

  • Защита информации и ее виды. Роль информационной безопасности. Защита от несанкционированного доступа к информации. Физическая защита данных на дисках. Виды компьютерных вирусов. Защита от вредоносных программ и спамов (антивирусы, хакерские утилиты).

    презентация [160,9 K], добавлен 04.10.2014

  • Симметричные криптосистемы как способ шифрования, в котором для шифрования и расшифровывания применяется один и тот же криптографический ключ. Разбор и реализация шифрования алгоритма: простая и двойная перестановка, перестановка "магический квадрат".

    курсовая работа [3,3 M], добавлен 11.03.2013

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.