Защита от несанкционированного доступа на базе федерального стандарта 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