Министерство образования и науки РоссийскойФедерации
Федеральное агентство по образованию
Технологический институт Федеральногогосударственного образовательного учреждения высшего профессионального образования
Южный федеральный университет
Факультет информационной безопасности
Кафедра БИТ
Пояснительная записка
к курсовому проекту
на тему:
Программная реализация алгоритма шифрованияDES. Режим ЕСВ
по дисциплине
Программно-аппаратные средства защитыинформации
Проверил
Г.А. Евстафьев
Таганрог 2010
СОДЕРЖАНИЕ
Введение
1. Описание алгоритма
2. Основные режимы работы алгоритма DES
3. Разработка программной реализации алгоритма
Заключение
Список использованных источников
Приложение А
Введение
Симметричные криптосистемы (также симметричное шифрование, симметричныешифры) — способ шифрования, в котором для (за)шифрования и расшифровывания применяетсяодин и тот же криптографический ключ. До изобретения схемы асимметричного шифрованияединственным существовавшим способом являлось симметричное шифрование. Ключ алгоритмадолжен сохраняться в секрете обеими сторонами. Ключ алгоритма выбирается сторонамидо начала обмена сообщениями.
Алгоритмы шифрования и дешифрованияданных широко применяются в компьютерной технике в системах сокрытия конфиденциальнойи коммерческой информации от злонамеренного использования сторонними лицами. Главнымпринципом в них является условие, что передатчик и приемник заранее знают алгоритмшифрования, а также ключ к сообщению, без которых информация представляет собойвсего лишь набор символов, не имеющих смысла.
Классическим примером такихалгоритмов являются симметричные криптографические алгоритмы, перечисленные ниже:
— простая подстановка;
— одиночная перестановка поключу;
— двойная перестановка;
— перестановка «Магическийквадрат»;
— простая перестановка.
Полная утрата всех статистическихзакономерностей исходного сообщения является важным требованием к симметричномушифру. Для этого шифр должен иметь «эффект лавины» — должно происходить сильноеизменение шифроблока при 1битном изменении входных данных (в идеале должны менятьсязначения 1/2 бит шифроблока).
Также важным требованиемявляется отсутствие линейности (то есть условия
а(ф) чщк а(и) = а(ф чщки))б
в противном случае облегчаетсяприменение дифференциального криптоанализа к шифру.
В настоящеевремя симметричные шифры — это:
— блочные шифры. Обрабатываютинформацию блоками определённой длины (обычно 64, 128 бит), применяя к блоку ключв установленном порядке, как правило, несколькими циклами перемешивания и подстановки,называемыми раундами. Результатом повторения раундов является лавинный эффект —нарастающая потеря соответствия битов между блоками открытых и зашифрованных данных.
— поточные шифры, в которыхшифрование проводится над каждым битом либо байтом исходного (открытого) текстас использованием гаммирования. Поточный шифр может быть легко создан на основе блочного(например, ГОСТ 28147-89 в режиме гаммирования), запущенного в специальном режиме.
Существует множество (не менеедвух десятков) алгоритмов симметричных шифров, существенными параметрами которыхявляются:
— стойкость;
— длина ключа;
— число раундов;
— длина обрабатываемого блока;
— сложность аппаратной/программнойреализации;
— сложность преобразования.
В данном курсовом проектепредлагается программная реализация алгоритма шифровании DES (режим ЕСВ).
1. Описание алгоритма
Стандарт шифрования данныхDES опубликован в 1977 г. Национальным бюростандартом США.
Стандарт DES предназначен для защиты от несанкционированногодоступа к важной, но несекретной информации в государственных и коммерческих организацияхСША. Алгоритм, положенный в основу стандарта, распространялся достаточно быстро,и уже в 1980 г. Был одобрен Национальным институтом стандартов и технологий США.С этого момента DES превращается в стандарт не только по названию,но и фактически. Появляются программное обеспечение и специализированные микроЭВМ,предназначенные для шифрования и расшифрования информации в сетях передачи данных.
К настоящему времени DES является наиболее распространенным алгоритмом,используемым в системах защиты коммерческой информации. Более того, реализация алгоритмаDES в таких системах становится признакомхорошего тона.
Основные достоинства алгоритмаDES:
— используется только одинключ длиной 56 бит;
— зашифровав сообщение с помощьюодного пакета программ, для расшифровки можно использовать любой другой пакет программ,соответствующий стандарту DES;
— относительная простота алгоритмаобеспечивает высокую скорость обработки;
— достаточно высокая стойкостьалгоритма.
Первоначально метод, лежащийв основе стандарта DES, был разработалфирмой IBM для своих целей и реализован в виде системы«Люцифер». Система «Люцифер» основана на комбинировании методов подстановки и перестановкии состоит из чередующейся последовательности блоков перестановки и подстановки.В ней использовался ключ длиной 128 бит, управлявший состояниями блоков перестановкии подстановки. Система «Люцифер» оказалась весьма сложной для практической реализациииз-за относительно малой скорости шифрований.
Алгоритм DES также использует комбинацию подстановоки перестановок. DES осуществляет шифрование 64-битных блоковданных с помощью 64-битового ключа, в котором значащими являются 56 бит (остальные8 бит-проверочные биты для контроля на четность). Дешифрование в DES является операцией, обратной шифрованию,и выполняется путем повторения операций шифрования в обратной последовательности.Обобщенная схема процесса шифрования в алгоритме DES показана на рисунке 1.
/>
Рисунок 1 — Обобщенная схемашифрования в алгоритме DES
Следует отметить, что всеприводимые таблицы, являются стандартными, и должны включаться в реализацию алгоритмав неизменном виде.
Все перестановки и коды втаблицах подобраны разработчиками таким образом, чтобы максимально затруднить процессрасшифровки путем подбора ключа. Описание алгоритма приведено на рисунке 2.
/>
Рисунок 2 — Структура алгоритмашифрования DES
Пусть из файла исходного текстасчитан очередной 64-битовый блок Т. Этот блок Т преобразуется с помощью матрицыначальной перестановки IP (таблица 1).
Таблица 1
Матрица начальной перестановкиIP
58 50 42 34 26 18 10 02
60 52 44 36 28 20 12 04
62 54 46 38 30 22 14 06
64 56 48 40 32 24 16 08
57 49 41 33 25 17 09 01
59 51 43 35 27 19 11 03
61 53 45 37 29 21 13 05
63 55 47 39 31 23 15 07
Биты входного блока Т переставляютсяв соответствии с матрицей IP: бит58 входного блока Т становится битом 1, бит 50-битом 2 и т.д. Эту перестановку можноописать выражением Т0=IP(T). Полученная последовательность битовТ0разделяется на две последовательности: L0 — левые и старшие биты, R0-правые и младшие биты, каждая из которых содержит 32 бита.
Затем выполняется итеративныйпроцесс шифрования, состоящий из 16 циклов. Пусть Ti-результат I-й итерации:
Ti=LiRi,
где Li=t1 t2…t32; Ri=t33t34…t64. Тогда результат I-й итерации описывается следующими формулами:
Li=Ri-1,i=1,2,…,16;
Ri=Li-1xor f(Ri-1,Ki), i=1,2,…,16.
Функции f называется функцией шифрования. Ее аргументами являются последовательностьRi-1, получаемая на предыдущем шаге итерации,и 48-битовый ключ Ki,который является результатомпреобразования 64-битового ключа шифра К.
На последнем шаге итерацииполучают последовательность R16 и L16, который конкатенируются в 64-битовую последовательность R16L16.
По окончании шифрования осуществляетсявосстановление позиций битов с помощью матрицы обратной перестановки IP-1 (таблица 2).
Таблица 2
Матрица обратной перестановкиIP-1
40 08 48 16 56 24 64 32
39 07 47 15 55 23 63 31
38 06 46 14 54 22 62 30
37 05 45 13 53 21 61 29
36 04 44 12 52 20 60 28
35 03 43 11 51 19 59 27
34 02 42 10 50 18 58 26
33 01 41 09 49 17 57 25
Процесс расшифрования данныхявляется инверсным по отношению к процессу шифрования. Все действия должны бытьвыполнены в обратном порядке. Это означает, что расшифровываемые данные сначалапереставляются в соответствии с матрицей IP-1, а затем над последовательностью битов R16L16 выполняются те же действия, что и в процессе шифрования, но вобратном порядке.
Итеративный процесс расшифрованияможет быть описан следующими формулами:
Ri-1=Li, i = 1, 2, ..., 16;Li-1 = Ri xor f(Li,Ki), i = 1, 2, ..., 16 .
На 16-й итерации получаютпоследовательности L0и R0, которые конкатенируют в 64-битовуюпоследовательность L0R0.
Затем позиции битов этой последовательностипереставляют в соответствии с матрицей IP. Результат такой перестановки — исходная64-битовая последовательность.
Теперь рассмотрим функциюшифрования f(Ri-1,Ki). Она показана на рисунке 3.
Для вычисления значения функцииf используются:
— функция Е (расширение 32бит до 48);
— функция S1,S2,…,S8 (преобразование6-битового числа в 4-битовое);
— функция Р (перестановкабитов в 32-битовой последовательности).
/>
Рисунок 3 — Вычисление функцииf(R(i-1), K(i))
Функция расширения Е определяетсятабл.3. В соответствии с этой таблицей первые 3 бита Е(Ri-1) — это биты32, 1 и 2, а последние — 31, 32 и 1.
Таблица 3
Функция расширения E32 01 02 03 04 05 04 05 06 07 08 09 08 09 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 01
Результат функции Е(Ri-1)есть 48-битовая последовательность, которая складывается по модулю 2 (операция xor)с 48-битовым ключом Кi. Получается 48-битовая последовательность, котораяразбивается на восемь 6-битовых блоков B1B2B3B4B5B6B7B8.То есть:
E(Ri-1) xor Ki = B1B2...B8 .
Функции S1, S2,…, S8 определяютсятаблицей 4.
криптосистемаалгоритм защита информация
Таблица 4
Функции преобразования S1,S2, ..., S8
Номер столбца
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
Номер
строк/>и
1
2
3
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 S1
1
2
3
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 S2
1
2
3
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 S3
1
2
3
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 S4
1
2
3
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 S5
1
2
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 S6
1
2
3
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 S7
1
2
3
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 S8
К таблице 4 требуются дополнительныепояснения. Пусть на вход функции-матрицы Sj поступает 6-битовый блок B = b1b2b3b4b5b6,тогда двухбитовое число b1b6 указывает номер строки матрицы,а b2b3b4b5 — номер столбца. РезультатомSj(Bj) будет 4-битовый элемент, расположенный на пересеченииуказанных строки и столбца [1].
Например, В1=011011.Тогда S1(В1) расположен на пересечении строки 1 и столбца 13. В столбце13 строки 1 задано значение 5. Значит, S1(011011)=0101.
Применив операцию выбора ккаждому из 6-битовых блоков B1, B2, ..., B8, получаем32-битовую последовательность S1(B1)S2(B2)S3(B3)...S8(B8).
Наконец, для получения результатафункции шифрования надо переставить биты этой последовательности. Для этого применяетсяфункция перестановки P (табл.5). Во входной последовательности биты перестанавливаютсятак, чтобы бит 16 стал битом 1, а бит 7 — битом 2 и т.д.
Таблица 5
Функция перестановки P16 07 20 21 29 12 28 17 01 15 23 26 05 18 31 10 02 08 24 14 32 27 03 09 19 13 30 06 22 11 04 25
Таким образом,
f(Ri-1,Ki) = P(S1(B1),...S8(B8))
Как нетрудно заметить, накаждой итерации используется новое значение ключа Ki. Новое значение ключа Кi вычисляется из начального ключа К(рис.4).Ключ К представляет собой 64-битовый блок с 8 битами контроля по четности, расположеннымив позициях 8,16,24,32,40,48,56,64. Для удаления контрольных битов и подготовки ключак работе используется функция G первоначальной подготовкиключа (таблица 6)
/>
Рисунок 4 — Блок-схема алгоритмавычисления ключа Ki
Таблица 6
Матрица G первоначальной подготовкиключа57 49 41 33 25 17 09 01 58 50 42 34 26 18 10 02 59 51 43 35 27 19 11 03 60 52 44 36 63 55 47 39 31 23 15 07 62 54 46 38 30 22 14 06 61 53 45 37 29 21 13 05 28 20 12 04
Результат преобразования G(K)разбивается на два 28-битовых блока C0и D0, причем C0будет состоять из битов 57, 49, ..., 44, 36 ключа K, а D0будетсостоять из битов 63, 55, ..., 12, 4 ключа K. После определения C0иD0рекурсивно определяются Ci и Di, i=1...16. Дляэтого применяют циклический сдвиг влево на один или два бита в зависимости от номераитерации, как показано в таблице 7.
Операции сдвига выполняютсядля последовательностей Ci и Di независимо. Например, последовательностьC3 получается посредством циклического сдвига влево на две позиции последовательностиС2, а последовательность D3 – посредствомсдвига влево на две позиции последовательности D2,C16 и D16 получаются из С15 и D15 посредством сдвига влево на одну позицию [2].
Таблица 7
Таблица сдвигов для вычисленияключаНомер итерации Сдвиг (бит)
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
1
1
2
2
2
2
2
2
1
2
2
2
2
2
2
1
Ключ Кiопределяемый на каждом шаге итерации,есть результат выбора конкретных битов из 56-битовой последовательности Сi,Di и их перестановки. То есть ключ Ki=H(Ci,Di), где функция Н определяется матрицей,завершающей обработку ключа (таблица 8)
Таблица 8
Матрица H завершающей обработкиключа
14 17 11 24 01 05
03 28 15 06 21 10
23 19 12 04 26 08
16 07 27 20 13 02
41 52 31 37 47 55
30 40 51 45 33 48
44 49 39 56 34 53
46 42 50 36 29 32
Как следует из табл.8, первымбитом ключа Ki будет 14-й бит последовательности Сi,Di, а вторым- 17-й бит, 47-м битом ключаKiбудет 29-й битСi,Di, а 48-м битом -32-ой бит Сi,Di.
2. Основные режимы работыалгоритма DES
Алгоритм DES вполне подходит как для шифрований, таки для аутентификации данных. Он позволяет непосредственно преобразовывать 64-битовыйвходной открытый текст в 64-битовый выходной шифрованный текст, однако данные редкоограничиваются 64 разрядами.
Чтобы воспользоваться алгоритмомDES для решения разнообразных криптографическихзадач, разработаны четыре рабочих режима:
-электронная кодовая книгаЕСВ (electronic code book);
-сцепление блоков шифра СВС(cipher block chaining);
-обратная связь по шифртекстуCFB (cipher feed back);
-обратная связь по выходуOFB (output feed back).
В курсовой работе мы реализовывалирежим «электронная кодовая книга». Изучив теорию, можем приступить к практическомурассмотрению алгоритма. Была разработана программа, наглядно показывающая работуалгоритма DES.
3. Разработка программнойреализации алгоритма
В данном разделе курсовогопроекта приводится описание программного продукта, реализующего алгоритм шифрованияDES: показывается логика работы программы,описываются процедуры и функции.
Программа “Research DES” написана на языке программирования высокого уровня C++; при разработке использовалась средаBorland C++ Builder.Исходный текст программы приведен в приложении 1.
Программа представляет собойприложение для операционной системы Windows, которое выполняется следующим образом: пользователь выбираетфайл, который содержит необходимое для шифрования сообщение. Получив имя файла,программа открывает его, производит необходимые действия над данными, и записываетполученный результат в нужный пользователю файл.
Предлагаемый программный продуктсодержит следующие компоненты:
а) Основной файл mainform.cpp.
б) Алгоритм преобразованияисходного сообщения.
в) Алгоритм преобразованиявходных данных.
Пользователю предлагаетсяввести ключ, который может быть представлен в двоичном, шестнадцатеричном или текстовомвиде. Затем необходимо выбрать источник данных: файл или строка. При шифрованиистроки, пользователь вводит необходимую информацию, и нажимает кнопку «старт». Выводзашифрованной информации осуществляется в свободное поле. При шифровании файла,пользователь указывает необходимый файл, выбирает конечный файл и нажимает кнопку«старт». Зашифрованная информация записывается в указанный пользователем конечныйфайл.
Заключение
В процессе разработки курсовогопроекта были получены навыки работы и программирования приложений на языке C++ в среде Borland C++ Builder.В результате работы над проектом получена работоспособная программа, реализующаяшифрование по алгоритму DES в режиме«электронная кодовая книга». Данный продукт может использоваться как учебное пособие,или для домашнего пользования. Симметричные алгоритмы шифрования еще долго будутактуальны.
Список использованных источников
1. Ю.В.Романец, П.А. Тимофеев, В.Ф. ШаньгинЗащита информации в компьютерных системах и сетях: Радио и связь: Москва, 1999.- 328 с.
2 Брюс Шнайер, Прикладная криптография:БХВ-Питер: Санкт-Петербург,2004.-718 с.
Приложение А
Листинг программы А.1 –mainform.cpp
#include
#pragma hdrstop
#include «DESAlgorithms.h»
#include «MainForm.h»
#pragma package(smart_init)
#pragma link «SHDocVw_OCX»
#pragma link «DataFrame»
#pragma resource"*.dfm"
TMainDialogForm*MainDialogForm;
__fastcall TMainDialogForm::TMainDialogForm(TComponent*Owner)
: TForm(Owner)
{
KeysDataFrame->EditLeft= 80;
KeysDataFrame->AddField(«Ключ», false);
SrcDataFrame->EditLeft= 100;
SrcDataFrame->AddField(«Входная строка»,false);
SrcDataFrame->AddField(«Результат», true);
}
void __fastcallTMainDialogForm::BrowseInpFilePathButtonClick(TObject *Sender)
{
if (OpenDialog->Execute())InpFilePathEdit->Text = OpenDialog->FileName;
}
void __fastcallTMainDialogForm::BrowsOutFilePathButtonClick(
TObject *Sender)
{
if (SaveDialog->Execute())OutFilePathEdit->Text = SaveDialog->FileName;
}
void __fastcallTMainDialogForm::AutoStartButtonClick(TObject *Sender)
{
DESAlg.Key = KeysDataFrame->Field[«Ключ»];
if ( IsCryptRadioButton->Checked) DESAlg.Crypt = true;
else DESAlg.Crypt= false;
if (SourcePageControl->ActivePage== StringSrcSheet) {
//Входные данные берем изстроки «Входная строка»
DESAlg.Data = SrcDataFrame->Field[«Входная строка»];
}
else if (SourcePageControl->ActivePage== FileSrcSheet) {
//Входные данные берем изфайла, путь к которому находится в
//InpFilePathEdit
DESAlg.Data = ReadAnsiStringFromFile(InpFilePathEdit->Text );
}
DESAlg.Exectute();
if (SourcePageControl->ActivePage== StringSrcSheet) {
SrcDataFrame->Field[«Результат»] = DESAlg.Data;
}
else if (SourcePageControl->ActivePage== FileSrcSheet) {
//Выходные данные записываемв файл, путь к которому находится в
//OutFilePathEdit
if (WriteAnsiStringToFile(DESAlg.Data, OutFilePathEdit->Text )) {
MessageBox(this->Handle,
((AnsiString)«Данные успешно записаны в файл\n» +
OutFilePathEdit->Text).c_str(),this->Caption.c_str(),
MB_ICONINFORMATION| MB_OK );
}
}
}
//Чтение файла в AnsiString
AnsiString __fastcallTMainDialogForm::ReadAnsiStringFromFile(
AnsiString FileName)
{
AnsiString Result;
try {
TFileStream *in= new TFileStream(FileName, fmOpenRead); //открываем файл
if( in != NULL) {
int size = in->Size;
if( size != 0 ){
try {
Result.SetLength(size);
in->Read((void*)(Result.data()), size);
}
catch( EOutOfMemory&) {}
delete in;
}
}
}
catch ( EStreamError&) {
MessageBox(this->Handle,( (AnsiString)
«Не удается прочитатьданные из файла:\n» + FileName).c_str(),
«Ошибка чтения файла»,MB_ICONERROR | MB_OK );
return "";
}
return Result;
}
//Запись в файл из AnsiString
bool __fastcallTMainDialogForm::WriteAnsiStringToFile(AnsiString String,
AnsiString FileName)
{
try {
TFileStream *out= new TFileStream(FileName, fmCreate); // открываем файл
if( out != NULL) {
if( String.Length()!= 0 ) {
try {
out->Write((void*)(String.data()), String.Length());
}
catch( EOutOfMemory&) {}
delete out;
}
}
}
catch (EStreamError&){
MessageBox(this->Handle,((AnsiString)
«Не удается записать данные в файл:\n» + FileName).c_str(),
«Ошибка записи файла»,
MB_ICONERROR |MB_OK );
return false;
}
return true;
}
Листинг программы А.2 –des.cpp
#include
#pragma hdrstop
#include «DES.h»
#pragma package(smart_init)
//Извлечение бита из массивасимволов
int get_bit (unsignedchar *data, int num)
{
return (int)((data[num/8]& (1
}
//Установка бита в массиве символов
void set_bit (unsignedchar *data, int num, int bit)
{
if (bit == 1)//Нужно бит установить в 1
data[num/8] |= 1
else//Нужно бит сбросить в 0
data[num/8] &= ~(1
}
//Циклический сдвиг влевомассива data из num_elem элементовна num_shift
//позиций
void shift_left(unsigned char *data, int num_elem, int num_shift)
{
int save_bit;
for (int k=0; k
{
save_bit = get_bit(data,0);
for (int i=0; i
{
data[i]
set_bit(&data[i],7, get_bit(&data[i+1], 0));
}
data[num_elem-1]
set_bit (&data[num_elem-1],7, save_bit);
}
}
//Циклический сдвиг вправомассива data из num_elem элементовна num_shift
//позиций
void shift_right(unsigned char *data, int num_elem, int num_shift)
{
int save_bit;
for (int k=0; k
{
save_bit = get_bit(&data[num_elem-1],7);
for (int i=num_elem- 1; i >= 1; --i)
{
data[i] >>=1;
set_bit(&data[i],0, get_bit(&data[i-1], 7));
}
data[0] >>=1;
set_bit (&data[0],0, save_bit);
}
}
//Циклический сдвиг влевомассива data из 28 элементов (сдвиг ключа) на \
//num_shift позиций
void shift_left_key(unsigned char *key, int num_shift)
{
int save_bit;
for (int i=0; i
{
shift_left(key,7, 1);
save_bit=get_bit(key,27);
set_bit(key, 27,get_bit(key, 55));
set_bit(key, 55,save_bit);
}
}
//Циклический сдвиг влевомассива data из 28 элементов (сдвиг ключа) на
//num_shift позиций
void shift_right_key(unsigned char *key, int num_shift)
{
int save_bit;
for (int i=0; i
{
shift_right(key,7, 1);
save_bit=get_bit(key,0);
set_bit(key, 0,get_bit(key, 28));
set_bit(key, 28,save_bit);
}
}
//Обменивает биты в соответсвиис таблицами перестановки
//data_src — входной массив данных. Если NULL тогда данные берутся из data_des
//data_des — входной/выходной массив данных.
//transposition_table- таблица перестановки
//num — кол-во элементов / 8 в data_des и элементов в transposition_table
void transposition(unsigned char *data_des, unsigned char *data_src,
int *transposition_table,int num)
{
bool delete_mem=false;
if (data_src==NULL)
{
data_src = newunsigned char[num / 8];
memcpy(data_src,data_des, num / 8);
delete_mem=true;
}
for (int i=0; i
set_bit(data_des,i, get_bit(data_src, transposition_table[i] — 1));
if (delete_mem)delete [] data_src;
}
//Возвращает значениеS-подстановки
int get_S_substitution(int inp, int *S_table)
{
int string=0;//Строка в таблице
int column=0;//Столбец в таблице
string = get_bit((unsignedchar*)(&inp), 2) |
get_bit((unsignedchar *)(&inp), 5)
column = get_bit((unsignedchar*)(&inp), 3) |
get_bit((unsignedchar *)(&inp), 4)
get_bit((unsignedchar *)(&inp), 5)
get_bit((unsignedchar *)(&inp), 6)
return S_table[string* 16 + column];
}
//Реализует алгоритм подстановки S-блоков
void S_block (unsignedchar *dest, unsigned char *src)
{
int S_inp;//6 бит, подающиесяна вход в S-блок
int S_out;//4 бита, получаемыеиз S-блока
for (int i=0; i
for (int i=0; i
{
shift_left (src,6, i);
S_inp=(src[0] >>2) & 0x3F;
S_out=get_S_substitution(S_inp,table_S_block[i]);
dest[i/2] |= S_out
}
}
//Сам алгоритм DES. i_key — 64 бита (8 байт) (с битами четности);data — 64 бита
//Алгоритм используется какпри шифровании, так и при дешифровании. Ключ при
//дешифровании менять самим.При decode==false — зашифровка, если ==true -
//расшифровка
void DES_algorithm(unsigned char *i_key, unsigned char *data,
bool decode=false)
{
unsigned char key[7];//Ключ без битов четности
unsigned char Li[4]; //сохраненная левая половина данных
unsigned char small_key[6];//ключ после перестановки со сжатием
unsigned char big_data[6];//данные после перестановки с расширением
unsigned char small_data[4];//данные после подстановки с помощью
//S-блоков
//Перестановка ключа (+ избавлениеот 8х битов)
transposition (key,i_key, table_key_initial_transposition, 56);
//Первоначальнаяперестановка данных
transposition (data,NULL, table_initial_transposition, 64);
for (int i=0; i
{
//Сохранение Li (берется из правой части)
memcpy(Li, &data[4],4);
//Сдвиг ключа
if (!decode)
{
shift_left_key(key, table_shift_key[i]); //При зашифровке
}
else
{
shift_right_key(key, table_shift_key_right[i]); //При расшифровке
}
//Перестановкаключа со сжатием
transposition (small_key,key,
table_transposition_with_compression,48);
//Перестановка данных с расширением
transposition (big_data, &data[4],
table_transposition_with_extension,48);
//Сложение данныхXOR с ключом
for (int k=0; k
//Подстановка с помощью S-блоков
S_block (small_data,big_data);
//Перестановка данных с помощьюP-блоков
transposition (small_data,NULL, table_transposition_P_block, 32);
//Сложение XOR данных левой и правой частей
for (int k=0; k
//Запись в data полученных результатов
memcpy(&data[0], Li, 4);
memcpy(&data[4], small_data, 4);
}
//Заключительный обмен полученныхрезультатов
memcpy(Li, &data[0],4);
memcpy(&data[0],&data[4], 4);
memcpy(&data[4],Li, 4);
//Заключительнаяперестановка
transposition (data,NULL, table_final_transposition, 64);
}