РефератыИнформатикаИсИспользование современных симметрических DES и асимметрических RSA алгоритмов шифрования

Использование современных симметрических DES и асимметрических RSA алгоритмов шифрования

Использование современных симметрических (DES), и асимметрических (RSA) алгоритмов шифрования


Содержание


Постановка задачи


Теоретический материал


Исходные данные


Скриншоты работы программы


Выводы


Постановка задачи


1. Реализовать алгоритм DES и 4 режима шифрования. Шифрование реализовать для любой длины сообщения и любой длины ключа до 56 бит включительно.


2. Зашифровать сообщения длиной 1 МБ, 10 МБ, 20 МБ и ключом 5,6,7 байт. Для каждого режима, длины сообщения и ключа замерять время и скорость зашифрования


3. В режимах шифрования DESOFB и CFB размер блока шифрования брать равным порядковому номеру в списке группы


4. Реализовать алгоритм RSA. Сгенерировать 3 пары открытый/закрытый ключей. Брать файлы размером 20 Кб, 50 Кб, 100 Кб, 500 Кб, 1 МБ.


5. Каждый файл шифровать с 3 парами ключей. Посчитать время зашифрования/расшифрования и среднюю скорость шифрования/расшифрования для каждой пары ключей и каждого файла.


6. Программа должна предусматривать сохранение зашифрованного и расшифрованного файла на диск, а также вывод на экран скорости и времени шифрования.


Примечание.


1. Исходный текст брать произвольный, используя символы из Алфавита (Алфавит
брать из Таблицы 1, согласно Вашего варианта)


2. Ваш вариант
=(Номер в списке группы) mod
23


3. Буквам поставить в соотвествие числа [0..мощность_алфавита-1
] (например букве а->0,б->1, в->2 итд.)


Таблица 1.














п/п


A
B
Алфавит
15
2000
5000
Цифры, спецсимвол(@) и строчные буквы русского алфавита

Теоретический материал

Шифр
RSA


Алгоритм RSA предложили в 1978 г. три автора: Р.Райвест (Rivest), А.Шамир (Shamir) и А.Адлеман (Adleman). Алгоритм получил свое название по первым буквам фамилий его авторов. Алгоритм RSA стал первым полноценным алгоритмом с открытым ключом, который может работать как в режиме шифрования данных, так и в режиме электронной цифровой подписи.


Надежность алгоритма основывается на трудности факторизации больших чисел и трудности вычисления дискретных логарифмов.


В криптосистеме RSA открытый ключ КA

, секретный ключ КB

, сообщение М

и криптограмма С

принадлежат множеству целых чисел


ZN
={0,1,2,...,N-1}
(1)


где N

- модуль:


N = P*Q
. (2)


Здесь Р

и Q

- случайные большие простые числа. Для обеспечения максимальной безопасности выбирают Р

и Q

равной длины и хранят в секрете.


Множество ZN

с операциями сложения и умножения по модулю N

образует арифметику по модулю N

.


Открытый ключ КA

выбирают случайным образом так, чтобы выполнялись условия:



(3)


, (4)


где - функция Эйлера, указывающая количество положительных целых чисел в интервале от 1
до N

,
которые взаимно просты сN
.



Условие (4) означает, что открытый ключ КA

и функция Эйлера должны быть взаимно простыми.


Далее, используя расширенный алгоритм Евклида, вычисляют секретный ключ K B

, такой, что


KB
* К A
= 1 (
mod(
)
(5)


или



Это можно осуществить, так как получатель В знает пару простых чисел (P,Q) и может легко найти . Заметим, что K B

и N

должны быть взаимно простыми.


Открытый ключ К A

используют для шифрования данных, а секретный ключ K B

-для расшифрования.


Преобразование шифрования определяет криптограмму С

через пару (открытый ключ КA

, сообщение М

) в соответствии со следующей формулой:



(6)


Обращение функции , т.е. определение значения М

по известным значениям С

, К A

и N

, практически не осуществимо при N

> 2512
.


Однако обратную задачу, т.е. задачу расшифрования криптограммы С

, можно решить, используя пару (секретный ключ K B

, криптограмма С

) по следующей формуле:



(7)


Процесс расшифрования можно записать так:


DB
(ЕА
(М)) = М
. (8)


Подставляя в (8) значения (6) и (7), получаем:



Или


(9)


Величина играет важную роль в теореме Эйлера, которая утверждает, что если НОД (х,N)=1

, то



или в несколько более общей форме


(10)


Сопоставляя выражения (9) и (10), получаем


или, что то же самое, .


Именно поэтому для вычисления секретного ключа KB

используют соотношение (5).


Таким образом, если криптограмму



возвести в степень K B

, то в результате восстанавливается исходный открытый текст М

, так как



Таким образом, получатель В, который создает криптосистему, защищает два параметра: секретный ключ
K B

и пару чисел
(P,Q)

, произведение которых дает значение модуля N

. С другой стороны, получатель В

открывает значение модуля N

и открытый ключ К А

.


Противнику известны лишь значения К А

и N

. Если бы он смог разложить число N

на множители Р

и Q

, то он узнал бы "потайной ход" - тройку чисел {Р,Q, К A

}, вычислил значение функции Эйлера



и определил значение секретного ключа K B

.


Однако, как уже отмечалось, разложение очень большого N

на множители вычислительно не осуществимо (при условии, что длины выбранных Р

и Q

составляют не менее 100 десятичных знаков).


Алгоритм шифрования и расшифрования в криптосистеме RSA


Предположим, что пользователь А

хочет передать пользователю В

сообщение в зашифрованном виде, используя криптосистему RSA. В таком случае пользователь А

выступает в роли отправителя сообщения, а пользователь В

- в роли получателя. Как отмечалось выше, криптосистему RSA должен сформировать получатель сообщения, т.е. пользователь В

. Рассмотрим последовательность действий пользователя В

и пользователя А

.


1.
Пользователь В

выбирает два произвольных больших простых числа Р

и Q

.


2.
Пользователь В

вычисляет значение модуля N=Р*Q

.


3.
Пользователь В

вычисляет функцию Эйлера (8):



4.
Выбирает случайным образом значение открытого ключа К A

с учетом выполнения условий:



5.
Пользователь В

вычисляет значение секретного ключа kB

, используя расширенный алгоритм Евклида при решении сравнения



6.
Пользователь В

пересылает пользователю А

пару чисел (N, К A

) по незащищенному каналу.


Если пользователь А

хочет передать пользователю В

сообщение М

, он выполняет следующие шаги.


7.
Пользователь А

разбивает исходный открытый текст М

на блоки, каждый из которых может быть представлен в виде числа


Мi
=0,1,2,...,N-1
.


8.
Пользователь А

шифрует текст, представленный в виде последовательности чисел М

, по формуле



9.
Пользователь А

отправляет криптограмму C1
, С2
, С3
,...,Ci
, ...
пользователю В

.


10.
Пользователь В

расшифровывает принятую криптограмму C1
, С2
, С3
,...,Ci
, ...,
используя секретный ключ kB

, по формуле


.


В результате будет получена последовательность чисел Mi

, которые представляют собой исходное сообщение М

. Чтобы алгоритм RSA имел практическую ценность, необходимо иметь возможность без существенных затрат генерировать большие простые числа, уметь оперативно вычислять значения ключей К A

и К B

.


Шифр
DES


DES осуществляет шифрование 64-битовых блоков данных с помощью 56-битового ключа. Расшифрование в DES является операцией обратной шифрованию и выполняется путем повторения операций шифрования в обратной последовательности (несмотря на кажущуюся очевидность, так делается далеко не всегда. Позже мы рассмотрим шифры, в которых шифрование и расшифрование осуществляются по разным алгоритмам).


Процесс шифрования заключается в начальной перестановке битов 64-битового блока, шестнадцати циклах шифрования и, наконец, обратной перестановки битов (рис.1).



Рис.1. Обобщенная схема шифрования в алгоритме DES


Необходимо сразу же отметить, что ВСЕ таблицы, приведенные в данной статье, являются СТАНДАРТНЫМИ, а следовательно должны включаться в вашу реализацию алгоритма в неизменном виде. Все перестановки и коды в таблицах подобраны разработчиками таким образом, чтобы максимально затруднить процесс расшифровки путем подбора ключа. Структура алгоритма DES приведена на рис.2.



Рис.2. Структура алгоритма шифрования DES


Пусть из файла считан очередной 8-байтовый блок T, который преобразуется с помощью матрицы начальной перестановки IP (табл.1) следующим образом: бит 58 блока T становится битом 1, бит 50 - битом 2 и т.д., что даст в результате: T(0) = IP(T).


Полученная последовательность битов T(0) разделяется на две последовательности по 32 бита каждая: L(0) - левые или старшие биты, R(0) - правые или младшие биты.


Таблица 1: Матрица начальной перестановки IP


58 50 42 34 26 18 10 0260 52 44 36 28 20 12 0462 54 46 38 30 22 14 0664 56 48 40 32 24 16 0857 49 41 33 25 17 09 0159 51 43 35 27 19 11 0361 53 45 37 29 21 13 0563 55 47 39 31 23 15 07

Затем выполняется шифрование, состоящее из 16 итераций. Результат i-й итерации описывается следующими формулами:




L(i) = R(i-1)


R(i) = L(i-1) xor f(R(i-1), K(i)) ,



где xor - операция ИСКЛЮЧАЮЩЕЕ ИЛИ.


Функция f называется функцией шифрования. Ее аргументы - это 32-битовая последовательность R(i-1), полученная на (i-1)-ой итерации, и 48-битовый ключ K(i), который является результатом преобразования 64-битового ключа K. Подробно функция шифрования и алгоритм получения ключей К(i) описаны ниже.


На 16-й итерации получают последовательности R(16) и L(16) (без перестановки), которые конкатенируют в 64-битовую последовательность R(16)L(16).


Затем позиции битов этой последовательности переставляют в соответствии с матрицей IP-1
(табл.2).


Таблица 2: Матрица обратной перестановки IP-1


40 08 48 16 56 24 64 3239 07 47 15 55 23 63 3138 06 46 14 54 22 62 3037 05 45 13 53 21 61 2936 04 44 12 52 20 60 2835 03 43 11 51 19 59 2734 02 42 10 50 18 58 2633 01 41 09 49 17 57 25

Матрицы IP-1
и IP соотносятся следующим образом: значение 1-го элемента матрицы IP-1
равно 40, а значение 40-го элемента матрицы IP равно 1, значение 2-го элемента матрицы IP-1
равно 8, а значение 8-го элемента матрицы IP равно 2 и т.д.


Процесс расшифрования данных является инверсным по отношению к процессу шифрования. Все действия должны быть выполнены в обратном порядке. Это означает, что расшифровываемые данные сначала переставляются в соответствии с матрицей IP-1
, а затем над последовательностью бит R(16)L(16) выполняются те же действия, что и в процессе шифрования, но в обратном порядке.


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




R(i-1) = L(i), i = 1, 2, ..., 16;


L(i-1) = R(i) xor f(L(i), K(i)), i = 1, 2, ..., 16 .



На 16-й итерации получают последовательности L(0) и R(0), которые конкатенируют в 64-битовую последовательность L(0)R(0).


Затем позиции битов этой последовательности переставляют в соответствии с матрицей IP. Результат такой перестановки - исходная 64-битовая последовательность.


Теперь рассмотрим функцию шифрования f(R(i-1),K(i)). Схематически она показана на рис. 3.



Рис.3. Вычисление функции f(R(i-1), K(i))


Для вычисления значения функции f используются следующие функции-матрицы:


· Е - расширение 32-битовой последовательности до 48-битовой,


· S1, S2, ... , S8 - преобразование 6-битового блока в 4-битовый,


· Р - перестановка бит в 32-битовой последовательности.


Функция расширения Е определяется табл.3. В соответствии с этой таблицей первые 3 бита Е(R(i-1)) - это биты 32, 1 и 2, а последние - 31, 32 и 1.


Таблица 3:Функция расширения E


32 01 02 03 04 0504 05 06 07 08 0908 09 10 11 12 1312 13 14 15 16 1716 17 18 19 20 2120 21 22 23 24 2524 25 26 27 28 2928 29 30 31 32 01

Результат функции Е(R(i-1)) есть 48-битовая последовательность, которая складывается по модулю 2 (операция xor) с 48-битовым ключом К(i). Получается 48-битовая последовательность, которая разбивается на восемь 6-битовых блоков B(1)B(2)B(3)B(4)B(5)B(6)B(7)B(8). То есть:


E(R(i-1)) xor K(i) = B(1)B(2)...B(8) .


Функции S1, S2, ... , S8 определяются табл.4.


Таблица 4


Функции преобразования S1, S2, ..., S8







































Номер столбца 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
Н о м е р с т р о к и 0 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
0 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
0 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
0 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
0 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
0 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
0 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
0 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(j) = b1b2b3b4b5b6, тогда двухбитовое число b1b6 указывает номер строки матрицы, а b2b3b4b5 - номер столбца. Результатом Sj(B(j)) будет 4-битовый элемент, расположенный на пересечении указанных строки и столбца.


Например, В(1)=011011. Тогда S1(В(1)) расположен на пересечении строки 1 и столбца 13. В столбце 13 строки 1 задано значение 5. Значит, S1(011011)=0101.


Применив операцию выбора к каждому из 6-битовых блоков B(1), B(2), ..., B(8), получаем 32-битовую последовательность S1(B(1))S2(B(2))S3(B(3))...S8(B(8)).


Наконец, для получения результата функции шифрования надо переставить биты этой последовательности. Для этого применяется функция перестановки P (табл.5). Во входной последовательности биты перестанавливаются так, чтобы бит 16 стал битом 1, а бит 7 - битом 2 и т.д.


Таблица 5:Функция перестановки P


16 07 20 2129 12 28 1701 15 23 2605 18 31 1002 08 24 1432 27 03 0919 13 30 0622 11 04 25

Таким образом,


f(R(i-1), K(i)) = P(S1(B(1)),...S8(B(8)))


Чтобы завершить описание алгоритма шифрования данных, осталось привести алгоритм получения 48-битовых ключей К(i), i=1...16. На каждой итерации используется новое значение ключа K(i), которое вычисляется из начального ключа K. K представляет собой 64-битовый блок с восемью битами контроля по четности, расположенными в позициях 8,16,24,32,40,48,56,64.


Для удаления контрольных битов и перестановки остальных используется функция G первоначальной подготовки ключа (табл.6).


Таблица 6


Матрица G первоначальной подготовки ключа


57 49 41 33 25 17 0901 58 50 42 34 26 1810 02 59 51 43 35 2719 11 03 60 52 44 3663 55 47 39 31 23 1507 62 54 46 38 30 2214 06 61 53 45 37 2921 13 05 28 20 12 04

Результат преобразования G(K) разбивается на два 28-битовых блока C(0) и D(0), причем C(0) будет состоять из битов 57, 49, ..., 44, 36 ключа K, а D(0) будет состоять из битов 63, 55, ..., 12, 4 ключа K. После определения C(0) и D(0) рекурсивно определяются C(i) и D(i), i=1...16. Для этого применяют циклический сдвиг влево на один или два бита в зависимости от номера итерации, как показано в табл.7.


Таблица 7


Таблица сдвигов для вычисления ключа







Номер итерации Сдвиг (бит)


Полученное значение вновь "перемешивается" в соответствии с матрицей H (табл.8).


Таблица 8:


Матрица H завершающей обработки ключа


14 17 11 24 01 0503 28 15 06 21 1023 19 12 04 26 0816 07 27 20 13 0241 52 31 37 47 5530 40 51 45 33 4844 49 39 56 34 5346 42 50 36 29 32

Ключ K(i) будет состоять из битов 14, 17, ..., 29, 32 последовательности C(i)D(i). Таким образом:


K(i) = H(C(i)D(i))


Блок-схема алгоритма вычисления ключа приведена на рис.4.



Рис.4. Блок-схема алгоритма вычисления ключа K(i)


Восстановление исходного текста осуществляется по такому же алгоритму, что и для шифрования, однако вначале используется ключ K(16), затем - K(15) и так далее.


Исходные данные


Для шифра RSA использовался алфавит


0123456789@абвгдеёжзиклмнопрстуфхцчшщъыьэюя


Текст в файлах состоит из повторений фраз


В миску кашу со стен соскребите


в@миску@кашей@


Текст
программы


unit main;


interface


uses


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


Dialogs, StdCtrls, ComCtrls,DES_unit,Podkluchi_unit,DES_ECB_CBC_unit,RSA_unit;


type


TForm1 = class(TForm)


Button17: TButton;


Label28: TLabel;


Label29: TLabel;


Label30: TLabel;


Label31: TLabel;


Label32: TLabel;


Label33: TLabel;


Label34: TLabel;


Edit10: TEdit;


Edit11: TEdit;


Edit12: TEdit;


Button18: TButton;


Button19: TButton;


Button20: TButton;


Button21: TButton;


Button22: TButton;


Edit1: TEdit;


Button1: TButton;


Button2: TButton;


Button3: TButton;


Button4: TButton;


Button5: TButton;


Button6: TButton;


Label5: TLabel;


Button7: TButton;


Button8: TButton;


RadioButton6: TRadioButton;


RadioButton7: TRadioButton;


RadioButton8: TRadioButton;


RadioButton9: TRadioButton;


RadioButton10: TRadioButton;


Button9: TButton;


Edit4: TEdit;


Edit5: TEdit;


ListBox3: TListBox;


Button10: TButton;


ListBox4: TListBox;


Label12: TLabel;


Label13: TLabel;


Label14: TLabel;


Label15: TLabel;


Label36: TLabel;


Label37: TLabel;


Label38: TLabel;


GroupBox1: TGroupBox;


GroupBox2: TGroupBox;


Label1: TLabel;


Label2: TLabel;


Label3: TLabel;


procedure Button1Click(Sender: TObject);


procedure Button2Click(Sender: TObject);


procedure Button3Click(Sender: TObject);


procedure Button4Click(Sender: TObject);


procedure Button5Click(Sender: TObject);


procedure Button6Click(Sender: TObject);


procedure Button7Click(Sender: TObject);


procedure Button8Click(Sender: TObject);


procedure Button9Click(Sender: TObject);


procedure Button10Click(Sender: TObject);


procedure Button11Click(Sender: TObject);


procedure Button12Click(Sender: TObject);


procedure FormCreate(Sender: TObject);


procedure Button13Click(Sender: TObject);


procedure Button14Click(Sender: TObject);


procedure Button15Click(Sender: TObject);


procedure Button16Click(Sender: TObject);


private


{ Private declarations }


public


{ Public declarations }


end;


var


Form1: TForm1;


implementation


{$R *.dfm}


//Zawifrovanie failov klju4om na 5 bait


procedure TForm1.Button1Click(Sender: TObject);


var


klu4:string;


t1,t2:TDateTime;


vremja:integer;


razmer:integer;


begin


klu4:=Edit10.text;


while( Length(klu4)<8 ) do


klu4:=klu4+'0';


Formirovanie_16_podklju4ei(klu4);


razmer:=0;


t1:=Time;


if Form1.RadioButton10.Checked=true then


begin


Wifrovanie_ECB('20.txt','DES_cryptedZ_20_5_ECB.txt');


razmer:=1024*20;


end;


if Form1.RadioButton9.Checked=true then


begin


Wifrovanie_ECB('50.txt','DES_cryptedZ_50_5_ECB.txt');


razmer:=1024*50;


end;


if Form1.RadioButton8.Checked=true then


begin


Wifrovanie_ECB('100.txt','DES_cryptedZ_100_5_ECB.txt');


razmer:=1024*100;


end;


if Form1.RadioButton7.Checked=true then


begin


Wifrovanie_ECB('500.txt','DES_cryptedZ_500_5_ECB.txt');


razmer:=1024*500;


end;


if Form1.RadioButton6.Checked=true then


begin


Wifrovanie_ECB('1.txt','DES_cryptedZ_1_5_ECB.txt');


razmer:=1024*1024;


end;


t2:=Time;


vremja:=round((t2 - t1)*24*60*60)+1;


Label33.Caption := IntToStr(vremja-1)+ 'сек';


Label34.Caption := FloatToStr((razmer/vremja)-1)+'байт/сек';


end;


//Raswifrovanie failov klju4om na 5 bait


procedure TForm1.Button2Click(Sender: TObject);


var


klu4:string;


t1,t2:TDateTime;


vremja:integer;


razmer:integer;


begin


klu4:=Edit10.text;


razmer:=0;


while( Length(klu4)<8 ) do


klu4:=klu4+'0';


Formirovanie_16_podklju4ei(klu4);


t1:=Time;


if Form1.RadioButton10.Checked=true then


begin


Raswifrovanie_ECB('DES_cryptedZ_20_5_ECB.txt','DES_uncryptedR_20_5_ECB.txt');


razmer:=1024*20;


end;


if Form1.RadioButton9.Checked=true then


begin


Raswifrovanie_ECB('DES_cryptedZ_50_5_ECB.txt','DES_uncryptedR_50_5_ECB.txt');


razmer:=1024*50;


end;


if Form1.RadioButton8.Checked=true then


begin


Raswifrovanie_ECB('DES_cryptedZ_100_5_ECB.txt','DES_uncryptedR_100_5_ECB.txt');


razmer:=1024*100;


end;


if Form1.RadioButton7.Checked=true then


begin


Raswifrovanie_ECB('DES_cryptedZ_500_5_ECB.txt','DES_uncryptedR_500_5_ECB.txt');


razmer:=1024*500;


end;


if Form1.RadioButton6.Checked=true then


begin


Raswifrovanie_ECB('DES_cryptedZ_1_5_ECB.txt','DES_uncryptedR_1_5_ECB.txt');


razmer:=1024*1024;


end;


t2:=Time;


vremja:=round((t2 - t1)*24*60*60)+1;


Label33.Caption := IntToStr(vremja-1)+ 'сек';


Label34.Caption := FloatToStr(razmer/vremja-1)+'байт/сек';


end;


//Zawifrovanie failov klju4om na 6 bait


procedure TForm1.Button3Click(Sender: TObject);


var


klu4:string;


t1,t2:TDateTime;


vremja:integer;


razmer:integer;


begin


klu4:=Edit11.text;


while( Length(klu4)<8 ) do


klu4:=klu4+'0';


Formirovanie_16_podklju4ei(klu4);


t1:=Time;


if Form1.RadioButton10.Checked=true then


begin


Wifrovanie_ECB('20.txt','DES_cryptedZ_20_6_ECB.txt');


razmer:=1024*20;


end;


if Form1.RadioButton9.Checked=true then


begin


Wifrovanie_ECB('50.txt','DES_cryptedZ_50_6_ECB.txt');


razmer:=1024*50;


end;


if Form1.RadioButton8.Checked=true then


begin


Wifrovanie_ECB('100.txt','DES_cryptedZ_100_6_ECB.txt');


razmer:=1024*100;


end;


if Form1.RadioButton7.Checked=true then


begin


Wifrovanie_ECB('500.txt','DES_cryptedZ_500_6_ECB.txt');


razmer:=1024*500;


end;


if Form1.RadioButton6.Checked=true then


begin


Wifrovanie_ECB('1.txt','DES_cryptedZ_1_6_ECB.txt');


razmer:=1024*1024;


end;


t2:=Time;


vremja:=round((t2 - (t1))*24*60*60)+1;


Label33.Caption := IntToStr(vremja-1)+ 'сек';


Label34.Caption := FloatToStr(razmer/vremja-1)+'байт/сек';


end;


//Raswifrovanie failov klju4om na 6 bait


procedure TForm1.Button4Click(Sender: TObject);


var


klu4:string;


t1,t2:TDateTime;


vremja:integer;


razmer:integer;


begin


klu4:=Edit11.text;


while( Length(klu4)<8 ) do


klu4:=klu4+'0';


Formirovanie_16_podklju4ei(klu4);


t1:=Time;


if Form1.RadioButton10.Checked=true then


begin


Raswifrovanie_ECB('DES_cryptedZ_20_6_ECB.txt','DES_uncryptedR_20_6_ECB.txt');


razmer:=1024*20;


end;


if Form1.RadioButton9.Checked=true then


begin


Raswifrovanie_ECB('DES_cryptedZ_50_6_ECB.txt','DES_uncryptedR_50_6_ECB.txt');


razmer:=1024*50;


end;


if Form1.RadioButton8.Checked=true then


begin


Raswifrovanie_ECB('DES_cryptedZ_100_6_ECB.txt','DES_uncryptedR_100_6_ECB.txt');


razmer:=1024*100;


end;


if Form1.RadioButton7.Checked=true then


begin


Raswifrovanie_ECB('DES_cryptedZ_500_6_ECB.txt','DES_uncryptedR_500_6_ECB.txt');


razmer:=1024*500;


end;


if Form1.RadioButton6.Checked=true then


begin


Raswifrovanie_ECB('DES_cryptedZ_1_6_ECB.txt','DES_uncryptedR_1_6_ECB.txt');


razmer:=1024*1024;


end;


t2:=Time;


vremja:=round((t2 - t1)*24*60*60)+1;


Label33.Caption := IntToStr(vremja-1)+ 'сек';


Label34.Caption := FloatToStr(razmer/vremja-1)+'байт/сек';


end;


//Zawifrovanie failov klju4om na 7 bait


procedure TForm1.Button5Click(Sender: TObject);


var


klu4:string;


t1,t2:TDateTime;


vremja:integer;


razmer:integer;


begin


klu4:=Edit12.text;


while( Length(klu4)<8 ) do


klu4:=klu4+'0';


Formirovanie_16_podklju4ei(klu4);


t1:=Time;


if Form1.RadioButton10.Checked=true then


begin


Wifrovanie_ECB('20.txt','DES_cryptedZ_20_7_ECB.txt');


razmer:=1024*20;


end;


if Form1.RadioButton9.Checked=true then


begin


Wifrovanie_ECB('50.txt','DES_cryptedZ_50_7_ECB.txt');


razmer:=1024*50;


end;


if Form1.RadioButton8.Checked=true then


begin


Wifrovanie_ECB('100.txt','DES_cryptedZ_100_7_ECB.txt');


razmer:=1024*100;


end;


if Form1.RadioButton7.Checked=true then


begin


Wifrovanie_ECB('500.txt','DES_cryptedZ_500_7_ECB.txt');


razmer:=1024*500;


end;


if Form1.RadioButton6.Checked=true then


begin


Wifrovanie_ECB('1.txt','DES_cryptedZ_1_7_ECB.txt');


razmer:=1024*1024;


end;


t2:=Time;


vremja:=round((t2 - t1)*24*60*60)+1;


Label33.Caption := IntToStr(vremja-1)+ 'сек';


Label34.Caption := FloatToStr(razmer/vremja-1)+'байт/сек';


end;


//Raswifrovanie failov klju4om na 7 bait


procedure TForm1.Button6Click(Sender: TObject);


var


klu4:string;


t1,t2:TDateTime;


vremja:integer;


razmer:integer;


begin


klu4:=Edit12.text;


while( Length(klu4)<8 ) do


klu4:=klu4+'0';


Formirovanie_16_podklju4ei(klu4);


t1:=Time;


if Form1.RadioButton10.Checked=true then


begin


Raswifrovanie_ECB('DES_cryptedZ_20_7_ECB.txt','DES_uncryptedR_20_7_ECB.txt');


razmer:=1024*20;


end;


if Form1.RadioButton9.Checked=true then


begin


Raswifrovanie_ECB('DES_cryptedZ_50_7_ECB.txt','DES_uncryptedR_50_7_ECB.txt');


razmer:=1024*50;


end;


if Form1.RadioButton8.Checked=true then


begin


Raswifrovanie_ECB('DES_cryptedZ_100_7_ECB.txt','DES_uncryptedR_100_7_ECB.txt');


razmer:=1024*100;


end;


if Form1.RadioButton7.Checked=true then


begin


Raswifrovanie_ECB('DES_cryptedZ_500_7_ECB.txt','DES_uncryptedR_500_7_ECB.txt');


razmer:=1024*500;


end;


if Form1.RadioButton6.Checked=true then


begin


Raswifrovanie_ECB('DES_cryptedZ_1_7_ECB.txt','DES_uncryptedR_1_7_ECB.txt');


razmer:=1024*1024;


end;


t2:=Time;


vremja:=round((t2 - t1)*24*60*60)+1;


Label33.Caption := IntToStr(vremja-1)+ 'сек';


Label34.Caption := FloatToStr(razmer/vremja-1)+'байт/сек';


end;


//CBC zawifrovanie failov klju4om na 5 bait


procedure TForm1.Button7Click(Sender: TObject);


var


klu4:string;


vektor:string;


t1,t2:TDateTime;


vremja:integer;


razmer:integer;


begin


klu4:=Edit10.text;


while( Length(klu4)<8 ) do


klu4:=klu4 + '*';


Formirovanie_16_podklju4ei(klu4);


vektor:=Edit1.text;


while( Length(vektor)<8 ) do


vektor:=vektor+ '0';


t1:=Time;


if Form1.RadioButton10.Checked=true then


begin


Wifrovanie_CBC('20.txt','DES_cryptedZ_20_5_CBС.txt',vektor);


razmer:=1024*20;


end;


if Form1.RadioButton9.Checked=true then


begin


Wifrovanie_CBC('50.txt','DES_cryptedZ_50_5_CBС.txt',vektor);


razmer:=1024*50;


end;


if Form1.RadioButton8.Checked=true then


begin


Wifrovanie_CBC('100.txt','DES_cryptedZ_100_5_CBС.txt',vektor);


razmer:=1024*100;


end;


if Form1.RadioButton7.Checked=true then


begin


Wifrovanie_CBC('500.txt','DES_cryptedZ_500_5_CBС.txt',vektor);


razmer:=1024*500;


end;


if Form1.RadioButton6.Checked=true then


begin


Wifrovanie_CBC('1.txt','DES_cryptedZ_1_5_CBС.txt',vektor);


razmer:=1024*1024;


end;


t2:=Time;


vremja:=round((t2 - t1)*24*60*60)+1;


Label34.Caption := IntToStr(vremja-1)+ 'сек';


Label34.Caption := FloatToStr(razmer/vremja-1)+'байт/сек';


end;


//CBC raswifrovanie failov klju4om na 5 bait


procedure TForm1.Button8Click(Sender: TObject);


var


klu4:string;


vektor:string;


t1,t2:TDateTime;


vremja:integer;


razmer:integer;


begin


klu4:=Edit10.text;


while( Length(klu4)<8 ) do


klu4:=klu4 + '*';


Formirovanie_16_podklju4ei(klu4);


vektor:=Edit1.text;


while( Length(vektor)<8 ) do


vektor:=vektor+ '0';


t1:=Time;


if Form1.RadioButton10.Checked=true then


begin


Raswifrovanie_CBC('DES_cryptedZ_20_5_CBС.txt','DES_uncryptedR_20_5_CBС.txt',vektor);


razmer:=1024*20;


end;


if Form1.RadioButton9.Checked=true then


begin


Raswifrovanie_CBC('DES_cryptedZ_50_5_CBС.txt','DES_uncryptedR_50_5_CBС.txt',vektor);


razmer:=1024*50;


end;


if Form1.RadioButton8.Checked=true then


begin


Raswifrovanie_CBC('DES_cryptedZ_100_5_CBС.txt','DES_uncryptedR_100_5_CBС.txt',vektor);


razmer:=1024*100;


end;


if Form1.RadioButton7.Checked=true then


begin


Raswifrovanie_CBC('DES_cryptedZ_500_5_CBС.txt','DES_uncryptedR_500_5_CBС.txt',vektor);


razmer:=1024*500;


end;


if Form1.RadioButton6.Checked=true then


begin


Raswifrovanie_CBC('DES_cryptedZ_1_5_CBС.txt','DES_uncryptedR_1_5_CBС.txt',vektor);


razmer:=1024*1024;


end;


t2:=Time;


vremja:=round((t2 - t1)*24*60*60)+1;


Label33.Caption := IntToStr(vremja-1)+ 'сек';


Label34.Caption := FloatToStr(razmer/vremja-1)+'байт/сек';


end;


//CBC zawifrovanie failov klju4om na 6 bait


procedure TForm1.Button9Click(Sender: TObject);


var


klu4:string;


vektor:string;


t1,t2:TDateTime;


vremja:integer;


razmer:integer;


begin


klu4:=Edit11.text;


while( Length(klu4)<8 ) do


klu4:=klu4 + '*';


Formirovanie_16_podklju4ei(klu4);


vektor:=Edit1.text;


while( Length(vektor)<8 ) do


vektor:=vektor+ '0';


t1:=Time;


if Form1.RadioButton10.Checked=true then


begin


Wifrovanie_CBC('20.txt','DES_cryptedZ_20_6_CBС.txt',vektor);


razmer:=1024*20;


end;


if Form1.RadioButton9.Checked=true then


begin


Wifrovanie_CBC('50.txt','DES_cryptedZ_50_6_CBС.txt',vektor);


razmer:=1024*50;


end;


if Form1.RadioButton8.Checked=true then


begin


Wifrovanie_CBC('100.txt','DES_cryptedZ_100_6_CBС.txt',vektor);


razmer:=1024*100;


end;


if Form1.RadioButton7.Checked=true then


begin


Wifrovanie_CBC('500.txt','DES_cryptedZ_500_6_CBС.txt',vektor);


razmer:=1024*500;


end;


if Form1.RadioButton6.Checked=true then


begin


Wifrovanie_CBC('1.txt','DES_cryptedZ_1_6_CBС.txt',vektor);


razmer:=1024*1024;


end;


t2:=Time;


vremja:=round((t2 - t1)*24*60*60)+1;


Label33.Caption := IntToStr(vremja-1)+ 'сек';


Label34.Caption := FloatToStr(razmer/vremja-1)+'байт/сек';


end;


//CBC raswifrovanie failov klju4om na 6 bait


procedure TForm1.Button10Click(Sender: TObject);


var


klu4:string;


vektor:string;


t1,t2:TDateTime;


vremja:integer;


razmer:integer;


begin


klu4:=Edit11.text;


while( Length(klu4)<8 ) do


klu4:=klu4 + '*';


Formirovanie_16_podklju4ei(klu4);


vektor:=Edit1.text;


while( Length(vektor)<8 ) do


vektor:=vektor+ '0';


t1:=Time;


if Form1.RadioButton10.Checked=true then


begin


Raswifrovanie_CBC('DES_cryptedZ_20_6_CBС.txt','DES_uncryptedR_20_6_CBС.txt',vektor);


razmer:=1024*20;


end;


if Form1.RadioButton9.Checked=true then


begin


Raswifrovanie_CBC('DES_cryptedZ_50_6_CBС.txt','DES_uncryptedR_50_6_CBС.txt',vektor);


razmer:=1024*50;


end;


if Form1.RadioButton8.Checked=true then


begin


Raswifrovanie_CBC('DES_cryptedZ_100_6_CBС.txt','DES_uncryptedR_100_6_CBС.txt',vektor);


razmer:=1024*100;


end;


if Form1.RadioButton7.Checked=true then


begin


Raswifrovanie_CBC('DES_cryptedZ_500_6_CBС.txt','DES_uncryptedR_500_6_CBС.txt',vektor);


razmer:=1024*500;


end;


if Form1.RadioButton6.Checked=true then


begin


Raswifrovanie_CBC('DES_cryptedZ_1_6_CBС.txt','DES_uncryptedR_1_6_CBС.txt',vektor);


razmer:=1024*1024;


end;


t2:=Time;


vremja:=round((t2 - t1)*24*60*60);


Label33.Caption := IntToStr(vremja)+ 'сек';


Label34.Caption := FloatToStr(razmer/vremja)+'байт/сек';


end;


//CBC zawifrovanie failov klju4om na 7 bait


procedure TForm1.Button11Click(Sender: TObject);


var


klu4:string;


vektor:string;


t1,t2:TDateTime;


vremja:integer;


razmer:integer;


begin


klu4:=Edit12.text;


while( Length(klu4)<8 ) do


klu4:=klu4 + '*';


Formirovanie_16_podklju4ei(klu4);


vektor:=Edit1.text;


while( Length(vektor)<8 ) do


vektor:=vektor+ '0';


t1:=Time;


if Form1.RadioButton10.Checked=true then


begin


Wifrovanie_CBC('20.txt','DES_cryptedZ_20_7_CBС.txt',vektor);


razmer:=1024*20;


end;


if Form1.RadioButton9.Checked=true then


begin


Wifrovanie_CBC('50.txt','DES_cryptedZ_50_7_CBС.txt',vektor);


razmer:=1024*50;


end;


if Form1.RadioButton8.Checked=true then


begin


Wifrovanie_CBC('100.txt','DES_cryptedZ_100_7_CBС.txt',vektor);


razmer:=1024*100;


end;


if Form1.RadioButton7.Checked=true then


begin


Wifrovanie_CBC('500.txt','DES_cryptedZ_500_7_CBС.txt',vektor);


razmer:=1024*500;


end;


if Form1.RadioButton6.Checked=true then


begin


Wifrovanie_CBC('1.txt','DES_cryptedZ_1_7_CBС.txt',vektor);


razmer:=1024*1024;


end;


t2:=Time;


vremja:=round((t2 - t1)*24*60*60)+1;


Label33.Caption := IntToStr(vremja-1)+ 'сек';


Label34.Caption := FloatToStr(razmer/vremja-1)+'байт/сек';


end;


//CBC raswifrovanie failov klju4om na 7 bait


procedure TForm1.Button12Click(Sender: TObject);


var


klu4:string;


vektor:string;


t1,t2:TDateTime;


vremja:integer;


razmer:integer;


begin


klu4:=Edit12.text;


while( Length(klu4)<8 ) do


klu4:=klu4 + '*';


Formirovanie_16_podklju4ei(klu4);


vektor:=Edit1.text;


while( Length(vektor)<8 ) do


vektor:=vektor+ '0';


t1:=Time;


if Form1.RadioButton10.Checked=true then


begin


Raswifrovanie_CBC('DES_cryptedZ_20_7_CBС.txt','DES_uncryptedR_20_7_CBС.txt',vektor);


razmer:=1024*20;


end;


if Form1.RadioButton9.Checked=true then


begin


Raswifrovanie_CBC('DES_cryptedZ_50_7_CBС.txt','DES_uncryptedR_50_7_CBС.txt',vektor);


razmer:=1024*50;


end;


if Form1.RadioButton8.Checked=true then


begin


Raswifrovanie_CBC('DES_cryptedZ_100_7_CBС.txt','DES_uncryptedR_100_7_CBС.txt',vektor);


razmer:=1024*100;


end;


if Form1.RadioButton7.Checked=true then


begin


Raswifrovanie_CBC('DES_cryptedZ_500_7_CBС.txt','DES_uncryptedR_500_7_CBС.txt',vektor);


razmer:=1024*500;


end;


if Form1.RadioButton6.Checked=true then


begin


Raswifrovanie_CBC('DES_cryptedZ_1_7_CBС.txt','DES_uncryptedR_1_7_CBС.txt',vektor);


razmer:=1024*1024;


end;


t2:=Time;


vremja:=round((t2 - t1)*24*60*60);


Label33.Caption := IntToStr(vremja)+ 'сек';


Label34.Caption := FloatToStr(razmer/vremja)+'байт/сек';


end;


//S4itivaem alfavit dlja RSA


procedure TForm1.FormCreate(Sender: TObject);


begin


alf:=Form1.Label38.Caption;


end;


//Generacija prostih 4isel s pomowiju reweta Eratosfena


procedure TForm1.Button13Click(Sender: TObject);


const


n = 5000;


var


a:array[2..n] of boolean;


i,j:integer;


begin


for i:=2 to n do


a[i] := false;


for i:=2 to n do


begin


if(a[i] = false) then


begin


j:=2;


while i*j<=n do


begin


a[i*j]:=true;


j:=j+1;


end;


end;


end;


ListBox4.Clear;


for i:=1 to n do


begin


if(a[i] = false) then


ListBox4.Items.Add(IntToStr(i));


end;


end;


//Generacija vozmognih variantov klju4a Ka


procedure TForm1.Button14Click(Sender: TObject);


var


i:integer;


f:int64;//4islo vzaimno prostih 4isel s N


N,P,Q:int64;


x,y:int64;


k:integer;


begin


P:=StrToInt(Edit5.Text);


Q:=StrToInt(Edit4.Text);


N:=Q*P;


//Vi4isljaem koli4estvo vzaimno prostih s N 4isel


f:=(P-1)*(Q-1);


//Vivodim vse vozmognie Ka


ListBox3.Clear;


k:=0;


for i:=(f div 2) to f do


begin


if(NOD(i,f,x,y)= 1) then


begin


ListBox3.Items.Add(IntToStr(i));


inc(k);


if k=100 then


break;


end;


end;


end;


//Zawifrovanie failov klju4om Ka


procedure TForm1.Button15Click(Sender: TObject);


var


Ka:int64;


Kb:int64;


Q,P:int64;


i:integer;


t1,t2:TDateTime;


vremja:integer;


razmer:integer;


begin


P:= StrToInt(Edit5.Text); //S4itivaem P


Q:= StrToInt(Edit4.Text); //S4itivaem Q


if(ListBox3.ItemIndex <> -1) then


begin


Ka:= StrToInt(ListBox3.Items[ListBox3.ItemIndex]);//Opredeljaem sly4ainim obrazom Ka


Kb := -1;


t1:=Time;


if Form1.RadioButton10.Checked=true then


begin


Wifrovanie_RSA(Ka, P, Q, '20RSA.txt','RSA_cryptedZ_20_RSA.txt',Kb);


razmer:=1024*20;


end;


if Form1.RadioButton9.Checked=true then


begin


Wifrovanie_RSA(Ka, P, Q, '50RSA.txt','RSA_cryptedZ_50_RSA.txt',Kb);


razmer:=1024*50;


end;


if Form1.RadioButton8.Checked=true then


begin


Wifrovanie_RSA(Ka, P, Q, '100RSA.txt','RSA_cryptedZ_100_RSA.txt',Kb);


razmer:=1024*100;


end;


if Form1.RadioButton7.Checked=true then


begin


Wifrovanie_RSA(Ka, P, Q, '500RSA.txt','RSA_cryptedZ_500_RSA.txt',Kb);


razmer:=1024*500;


end;


if Form1.RadioButton6.Checked=true then


begin


Wifrovanie_RSA(Ka, P, Q, '1RSA.txt','RSA_cryptedZ_1_RSA.txt',Kb);


razmer:=1024*1024;


end;


t2:=Time;


end;


Label13.Caption := IntToStr(Ka);; //Vivodin Ka


Label12.Caption := IntToStr(Kb); //Vivodim Kb


vremja:=round((t2 - (t1+0.0000001))*24*60*60*1000);


Label33.Caption := (IntToStr(vremja-round(0.0000001)))+ 'милисек';


Label34.Caption := FloatToStr((razmer/vremja)-0.0000001)+'байт/милисек';


end;


//Raswifrovat faili klju4om Ka1


procedure TForm1.Button16Click(Sender: TObject);


var


Ka:int64;


Kb:int64;


Q,P:int64;


i:integer;


ish_f,vihod_f:TextFile;


t1,t2:TDateTime;


vremja:integer;


razmer:integer;


begin


P:= StrToInt(Edit5.Text); //S4itivaem P


Q:= StrToInt(Edit4.Text); //S4itivaem Q


if(ListBox3.ItemIndex <> -1) then


begin


Ka:= StrToInt(ListBox3.Items[ListBox3.ItemIndex]);//Opredeljaem sly4ainim obrazom Ka


Kb:=StrToInt(Label12.Caption);


t1:=Time;


if Form1.RadioButton10.Checked=true then


begin


Raswifrovanie_RSA(Kb,P,Q,'RSA_cryptedZ_20_RSA.txt','RSA_uncryptedR_20_RSA.txt');


razmer:=1024*20;


end;


if Form1.RadioButton9.Checked=true then


begin


Raswifrovanie_RSA(Kb,P,Q,'RSA_cryptedZ_50_RSA.txt','RSA_uncryptedR_50_RSA.txt');


razmer:=1024*20;


end;


if Form1.RadioButton8.Checked=true then


begin


Raswifrovanie_RSA(Kb,P,Q,'RSA_cryptedZ_100_RSA.txt','RSA_uncryptedR_100_RSA.txt');


razmer:=1024*20;


end;


if Form1.RadioButton7.Checked=true then


begin


Raswifrovanie_RSA(Kb,P,Q,'RSA_cryptedZ_500_RSA.txt','RSA_uncryptedR_500_RSA.txt');


razmer:=1024*20;


end;


if Form1.RadioButton6.Checked=true then


begin


Raswifrovanie_RSA(Kb,P,Q,'RSA_cryptedZ_1_RSA.txt','RSA_uncryptedR_1_RSA.txt');


razmer:=1024*20;


end;


t2:=Time;


end;


vremja:=round((t2 - t1)*24*60*60)+1;


Label33.Caption := IntToStr(vremja-1)+ 'милисек';


Label34.Caption := FloatToStr((razmer/vremja)-1)+'байт/сек';


end;


end.


Подключаемые
модули


unit DES_ECB_CBC_unit;


interface


procedure Wifrovanie_ECB(nazv_ish_f:string;nazv_vih_f:string);


procedure Raswifrovanie_ECB(nazv_ish_f:string;nazv_vih_f:string);


procedure Wifrovanie_CBC(nazv_ish_f:string;nazv_vih_f:string;vektor:string);


procedure Raswifrovanie_CBC(nazv_ish_f:string;nazv_vih_f:string;vektor:string);


implementation


uses DES_unit;


procedure Wifrovanie_ECB(nazv_ish_f:string;nazv_vih_f:string);


var


i:integer;


ish_text,vihod_text:string;


bykva:byte;


ish_f,vihod_f:file of byte;


begin


assignfile(ish_f,nazv_ish_f);


reset(ish_f);


assignfile(vihod_f,nazv_vih_f);


rewrite(vihod_f);


while not EOF(ish_f) do


begin


read(ish_f,bykva);


ish_text:=ish_text+chr(bykva);


if Length(ish_text) = 8 then


begin


vihod_text:= Kodirovat(ish_text);


for i:=1 to 8 do


begin


bykva:=byte(vihod_text[i]);


write(vihod_f,bykva);


end;


ish_text := '';


end;


end;


if(Length(ish_text) <> 0) then


begin


while length(ish_text)<8 do


ish_text:=ish_text+'0';


vihod_text := Kodirovat(ish_text);


for i:=1 to 8 do


begin


bykva:=byte(vihod_text[i]);


write(vihod_f,bykva);


end;


end;


end;


procedure Raswifrovanie_ECB(nazv_ish_f:string;nazv_vih_f:string);


var


i:integer;


ish_text,vihod_text:string;


bykva:byte;


ish_f,vihod_f:file of byte;


begin


assignfile(ish_f,nazv_ish_f);


reset(ish_f);


assignfile(vihod_f,nazv_vih_f);


rewrite(vihod_f);


while not EOF(ish_f) do


begin


read(ish_f,bykva);


ish_text:=ish_text+chr(bykva);


if Length(ish_text) = 8 then


begin


vihod_text:= Raskodirovat(ish_text);


for i:=1 to 8 do


begin


bykva:=byte(vihod_text[i]);


write(vihod_f,bykva);


end;


ish_text := '';


end;


end;


if(Length(ish_text) <> 0) then


begin


while length(ish_text)<8 do


ish_text:=ish_text+'0';


vihod_text := Raskodirovat(ish_text);


for i:=1 to 8 do


begin


bykva:=byte(vihod_text[i]);


write(vihod_f,bykva);


end;


end;


end;


procedure Wifrovanie_CBC(nazv_ish_f:string;nazv_vih_f:string;vektor:string);


var


i:integer;


ish_text,vihod_text:string;


bykva:byte;


ish_f,vihod_f:file of byte;


begin


assignfile(ish_f,nazv_ish_f);


reset(ish_f);


assignfile(vihod_f,nazv_vih_f);


rewrite(vihod_f);


while not EOF(ish_f) do


begin


read(ish_f,bykva);


ish_text:=ish_text+chr(bykva);


if Length(ish_text) = 8 then


begin


for i:=1 to 8 do


ish_text[i]:=chr(ord(ish_text[i]) xor ord(vektor[i]));


vihod_text:= Kodirovat(ish_text);


vektor := vihod_text;


for i:=1 to 8 do


begin


bykva:=byte(vihod_text[i]);


write(vihod_f,bykva);


end;


ish_text := '';


end;


end;


if(Length(ish_text) <> 0) then


begin


while length(ish_text)<8 do


ish_text:=ish_text+'0';


for i:=1 to 8 do


ish_text[i] := chr(ord(ish_text[i]) xor ord(vektor[i]));


vihod_text := Kodirovat(ish_text);


for i:=1 to 8 do


begin


bykva:=byte(vihod_text[i]);


write(vihod_f,bykva);


end;


end;


end;


procedure Raswifrovanie_CBC(nazv_ish_f:string;nazv_vih_f:string;vektor:string);


var


i:integer;


ish_text,vihod_text,tmp:string;


bykva:byte;


ish_f,vihod_f:file of byte;


begin


assignfile(ish_f,nazv_ish_f);


reset(ish_f);


assignfile(vihod_f,nazv_vih_f);


rewrite(vihod_f);


while not EOF(ish_f) do


begin


read(ish_f,bykva);


ish_text:=ish_text+chr(bykva);


if Length(ish_text) = 8 then


begin


tmp := ish_text;


vihod_text:= Raskodirovat(ish_text);


for i:=1 to 8 do


vihod_text[i] := chr(ord(vihod_text[i]) xor ord(vektor[i]));


vektor := tmp;


for i:=1 to 8 do


begin


bykva:=byte(vihod_text[i]);


write(vihod_f,bykva);


end;


ish_text := '';


end;


end;


if(Length(ish_text) <> 0) then


begin


while length(ish_text)<8 do


ish_text:=ish_text+'0';


tmp := ish_text;


vihod_text:= Raskodirovat(ish_text);


for i:=1 to 8 do


vihod_text[i] := chr(ord(vihod_text[i]) xor ord(vektor[i]));


vektor := tmp;


for i:=1 to 8 do


begin


bykva:=byte(vihod_text[i]);


write(vihod_f,bykva);


end;


end;


end;


end.


unit DES_unit;


interface


type odnom_1_64=array[1..64] of byte;


type odnom_1_56=array[1..56] of byte;


type odnom_1_48=array[1..48] of byte;


type odnom_1_32=array[1..32] of byte;


type dvym_1_17_1_32=array[1..17,1..32] of byte;


type dvym_1_17_1_28=array[1..17,1..28] of byte;


type dvym_1_16_1_48=array[1..16,1..48] of byte;//16 подключей


procedure Perestanovka_IP (var Klju4_64_posle_IP: odnom_1_64);


procedure Perestanovka_E (n:integer; Tekst_32_do_E: dvym_1_17_1_32; var Tekst_48_posle_E: odnom_1_48);


procedure Perestanovka_P(var Tekst_32_posle_P:odnom_1_32);


procedure S_Blok (e: odnom_1_48; var p: odnom_1_32);


procedure Perestanovka_IP_1 (var Tekst_64_posle_IP1: odnom_1_64);


procedure TextVBinarn (Tekst_bykv: string; var Tekst_64_binar: odnom_1_64);


procedure BinarnVText(Tekst_64_binar: odnom_1_64;var Tekst_bykv: string);


function Kodirovat(Ish_tekst_bykv:string):string;


function Raskodirovat(Wifr_tekst_bykv:string):string;


implementation


uses podkluchi_unit;


var


matrica_IP:array[1..64] of byte=(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);


matrica_E:array[1..48] of byte=(32, 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);


matrica_P:array[1..32] of byte=(16, 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);


matrica_IP_1:array[1..64] of byte=(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);


procedure Perestanovka_IP (var Klju4_64_posle_IP: odnom_1_64);


var Vrem_klju4_64: odnom_1_64;


i:integer;


begin


//Kopirivanie binarnogo predstavlenia


for i:=1 to 64 do


Vrem_klju4_64[i]:=Klju4_64_posle_IP[i];


//IP perestanovka


for i:=1 to 64 do


Klju4_64_posle_IP[i]:=Vrem_klju4_64[matrica_IP[i]];


end;


procedure Perestanovka_E (n:integer; Tekst_32_do_E: dvym_1_17_1_32; var Tekst_48_posle_E: odnom_1_48);


var i:integer;


begin


for i:=1 to 48 do


Tekst_48_posle_E[i]:=Tekst_32_do_E[n,matrica_E[i]];


end;


procedure Perestanovka_P(var Tekst_32_posle_P:odnom_1_32);


var i:integer;


Vrem_tekst_32:odnom_1_32;


begin


//Kopiy binarnogo predstavlenia


for i:=1 to 32 do


Vrem_tekst_32[i]:=Tekst_32_posle_P[i];


//P perestanovka bit


for i:=1 to 32 do


Tekst_32_posle_P[i]:=Vrem_tekst_32[matrica_P[i]];


end;


procedure S_Blok (e: odnom_1_48; var p: odnom_1_32);


var q,i,j:integer;//s4et4iki


k:integer;//4islo na perese4enii neobhodimoi stro4ki i stolbika


h:integer;


symma_2_krainih,symma_4_vnytrennih:integer;


s_blok:array[0..3,0..15] of byte;


B_dvym_8_6:array[1..8,1..6] of byte;


f:textfile;


begin


//Razbitie na 8 4astei po 6 bit


q:=0;


for i:=1 to 8 do


for j:=1 to 6 do


begin


q:=q+1;


B_dvym_8_6[i,j]:=e[q];


end;


//S4itivaem S blok


AssignFile(f,'S.txt');


Reset(f);


//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!


for q:=1 to 8 do


begin


symma_2_krainih:=B_dvym_8_6[q,6]+B_dvym_8_6[q,1]*2;


symma_4_vnytrennih:=B_dvym_8_6[q,2]+2*B_dvym_8_6[q,3]+4*B_dvym_8_6[q,4]+8*B_dvym_8_6[q,5];


for i:=0 to 3 do


for j:=0 to 15 do


read(f,s_blok[i,j]);


k:=s_blok[symma_2_krainih,symma_4_vnytrennih];


h:=4*q;


for j:=1 to 4 do


begin


p[h]:=k mod 2;


k:=k div 2;


h:=h-1;


end


end;


closefile(f);


end;


procedure Perestanovka_IP_1 (var Tekst_64_posle_IP1: odnom_1_64);


var Vrem_tekst_64: odnom_1_64;


i:integer;


begin


//Kopiy binarnogo predstavlenia


for i:=1 to 64 do


Vrem_tekst_64[i]:=Tekst_64_posle_IP1[i];


//IP perestanovka bit


for i:=1 to 64 do


Tekst_64_posle_IP1[i]:=Vrem_tekst_64[matrica_IP_1[i]];


end;


//Perevodit text v binarnoe predstavlenie


procedure TextVBinarn (Tekst_bykv: string; var Tekst_64_binar: odnom_1_64);


var j,h,a,i:integer;


alfav_ASCII:array[1..8] of integer;


begin


//Perevod simvolov v ASCII-kodi


for i:=1 to 8 do


alfav_ASCII[i]:=ord(Tekst_bykv[i]);//vozvrawaet № simvola v ASC


//Perevod chisel v binarniy kod


for j:=1 to 8 do


begin


h:=8*j;


a:=alfav_AscII[j];


for i:=1 to 8 do


begin


Tekst_64_binar[h]:=a mod 2;


a:=a div 2;//sdvig vpravo na 1


h:=h-1;


end


end;


end;


//+++++++++++++++++++++++++++++++++++++++++++++++++++++++


//Perevodit binarnoe predstavlenie v tekst


procedure BinarnVText(Tekst_64_binar: odnom_1_64;var Tekst_bykv: string);


var Vrem_tekst:string;


a,i,j:integer;


begin


Vrem_tekst:='';


for i:=1 to 8 do


begin


a:=0;


for j:=(i-1)*8+1 to i*8 do


a:= a*2+Tekst_64_binar[j];


Vrem_tekst:=concat(Vrem_tekst,char(a));//prilirljaet k s a


end;


Tekst_bykv:=Vrem_tekst;


end;


function Kodirovat(Ish_tekst_bykv:string):string;


var Ish_tekst_64_binar:odnom_1_64;


i,j:integer;


levaja,pravaja:dvym_1_17_1_32;


Tekst_48_posle_raswirenija:odnom_1_48;


B_tekst_32:odnom_1_32;


begin


TextVBinarn (Ish_tekst_bykv,Ish_tekst_64_binar);


Perestanovka_IP (Ish_tekst_64_binar);


//Delim na levyju i na pravyju 4asti


j:=0;


for i:=1 to 64 do


if i<33 then


levaja[1,i]:=Ish_tekst_64_binar[i]


else


begin


j:=j+1;


pravaja[1,j]:=Ish_tekst_64_binar[i];


end;


//16 rayndov wifrovanija


for i:=2 to 17 do


begin


for j:=1 to 32 do


levaja[i,j]:=pravaja[i-1,j];


Perestanovka_E(i-1,pravaja,Tekst_48_posle_raswirenija);


for j:=1 to 48 do


Tekst_48_posle_raswirenija[j]:=Tekst_48_posle_raswirenija[j] xor podklu4i[i-1,j];


s_blok(Tekst_48_posle_raswirenija,B_tekst_32);


Perestanovka_P(B_tekst_32);


for j:=1 to 32 do


pravaja[i,j]:=levaja[i-1,j] xor B_tekst_32[j];


end;


//!!!


//Menjaem mestami


for i:=1 to 32 do


begin


j:= pravaja[17][i];


pravaja[17][i] := levaja[17][i];


levaja[17][i] := j;


end;


//Skladivanie levoi i pravoi


j:=0;


for i:=1 to 64 do


if i<33 then


Ish_tekst_64_binar[i]:=levaja[17,i]


else


begin


j:=j+1;


Ish_tekst_64_binar[i]:=pravaja[17,j];


end;


Perestanovka_IP_1(Ish_tekst_64_binar);


BinarnVText(Ish_tekst_64_binar,Ish_tekst_bykv);


kodirovat:= Ish_tekst_bykv;


end;


function Raskodirovat(Wifr_tekst_bykv:string):string;


var Wifr_tekst_64_binar:odnom_1_64;


i,j:integer;


levaja,pravaja:dvym_1_17_1_32;


Tekst_48_posle_raswirenija:odnom_1_48;


B_tekst_32:odnom_1_32;


begin


TextVBinarn (Wifr_tekst_bykv,Wifr_tekst_64_binar);


Perestanovka_IP (Wifr_tekst_64_binar);


//Delim na levyju i na pravyju 4asti


j:=0;


for i:=1 to 64 do


if i<33 then


levaja[17,i]:=Wifr_tekst_64_binar[i]


else


begin


j:=j+1;


pravaja[17,j]:=Wifr_tekst_64_binar[i];


end;


//!!!!!!!!


//Menjaem mestami


for i:=1 to 32 do


begin


j:= pravaja[17][i];


pravaja[17][i]:=levaja[17][i];


levaja[17][i]:=j;


end;


//16 raundov wifrovanija


for i:=17 downto 2 do


begin


for j:=1 to 32 do


pravaja[i-1,j]:=levaja[i,j];


Perestanovka_E(i,levaja,Tekst_48_posle_raswirenija);


for j:=1 to 48 do


Tekst_48_posle_raswirenija[j]:=Tekst_48_posle_raswirenija[j] xor podklu4i[i-1,j];


s_blok(Tekst_48_posle_raswirenija,B_tekst_32);


Perestanovka_P(B_tekst_32);


for j:=1 to 32 do


levaja[i-1,j]:=pravaja[i,j] xor B_tekst_32[j];


end;


//Skladivanie levoi i pravoi


j:=0;


for i:=1 to 64 do


if i<33 then


Wifr_tekst_64_binar[i]:=levaja[1,i]


else


begin


j:=j+1;


Wifr_tekst_64_binar[i]:=pravaja[1,j];


end;


Perestanovka_IP_1(Wifr_tekst_64_binar);


BinarnVText(Wifr_tekst_64_binar,Wifr_tekst_bykv);


Raskodirovat:=Wifr_tekst_bykv;


end;


end.


unit Podkluchi_unit;


interface


uses DES_unit;


var


podklu4i:dvym_1_16_1_48;


matrica_PC1:array[1..56] of byte=(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);


matrica_PC2:array[1..48] of byte=(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);


matrica_sdvigov:array[1..16] of byte=(1,1,2,2,


2,2,2,2,


1,2,2,2,


2,2,2,1);


procedure Formirovanie_16_podklju4ei(Klju4_64:string);


implementation


//+++++++++++++++++++++++++++++++++++++++++++++++++++++++


procedure Perestanovka_PC1(Klju4_64_do_PC1: odnom_1_64; var Klju4_64_posle_PC1:odnom_1_56);


var i:integer;


begin


for i:=1 to 56 do


Klju4_64_posle_PC1[i]:=Klju4_64_do_PC1[matrica_PC1[i]];


end;


//+++++++++++++++++++++++++++++++++++++++++++++++++++++++


procedure Perestanovka_PC2(Klju4_56_do_PC2:odnom_1_56; k:integer);


var i:integer;


begin


for i:=1 to 48 do


podklu4i[k][i]:=Klju4_56_do_PC2[matrica_PC2[i]];


end;


//+++++++++++++++++++++++++++++++++++++++++++++++++++++++


procedure Formirovanie_16_podklju4ei(Klju4_64:string);


var


i,j,k:integer;


c_vrem,d_vrem: dvym_1_17_1_28;


c: dvym_1_17_1_28;


d: dvym_1_17_1_28;


c_d: odnom_1_56;


Klju4ik_64:odnom_1_64;


Klju4ik_56:odnom_1_56;


begin


TextVBinarn (Klju4_64,Klju4ik_64);//ключиз 64 в 64


Perestanovka_PC1(Klju4ik_64,Klju4ik_56);//битовыйключ 64, битовыйключ 56


//Razbivaem na c i d


j:=0;


for i:=1 to 56 do


if i<29 then


c[1,i]:=Klju4ik_56[i]


else


begin


j:=j+1;


d[1,j]:=Klju4ik_56[i];


end;


//Kopiryem с i d vo vremennie c_vrem i d_vrem


for j:=1 to 28 do


begin


c_vrem[1,j]:=c[1,j];


d_vrem[1,j]:=d[1,j];


end;


//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!


//Delaem sdvigi LSi


for i:=2 to 17 do


begin


k:=0;


for j:=1 to 28 do


if j+matrica_sdvigov[i-1]>28 then


begin


k:=k+1;


c[i,j]:=c_vrem[i-1,k];


d[i,j]:=d_vrem[i-1,k];


c_vrem[i,j]:=c[i,j];


d_vrem[i,j]:=d[i,j];


end


else


begin


c[i,j]:=c_vrem[i-1,j+matrica_sdvigov[i-1]];


d[i,j]:=d_vrem[i-1,j+matrica_sdvigov[i-1]];


c_vrem[i,j]:=c[i,j];


d_vrem[i,j]:=d[i,j];


end;


end;


//Sobiraem с i d vmeste


for i:=2 to 17 do


begin


k:=0;


for j:=1 to 28 do


begin


k:=k+1;


c_d[k]:=c[i,j];


end;


for j:=1 to 28 do


begin


k:=k+1;


c_d[k]:=d[i,j];


end;


Perestanovka_PC2(c_d,i-1);


end;


end;


end.


unit RSA_unit;


interface


function NOD(a{3}:int64;b{fi}:int64;var x:int64;var y:int64):int64;


function Nomer_v_alfavite(a:char):byte;


function Vozvedenie_po_modylju(osnovanie:int64; stepen:int64;modyl:int64):int64;


procedure Wifrovanie_RSA(Ka:int64; P:int64; Q:int64; nazv_ish_f:string;nazv_vih_f:string;var Kb:int64);


procedure RasWifrovanie_RSA(Kb:int64; P:int64; Q:int64; nazv_ish_f:string;nazv_vih_f:string);


var


alf:string;


implementation


function Vozvedenie_v_stepen(osnovanie:int64; stepen:int64):int64;


var


rez:longint;


i:longint;


begin


rez:=1;


for i:= 1 to stepen do


rez := rez*osnovanie;


Vozvedenie_v_stepen:= rez;


end;


function Vozvedenie_po_modylju(osnovanie:int64; stepen:int64;modyl:int64):int64;


var


rez:int64;


i:longint;


t:int64;//osnovanie vo vremennoi stepeni


begin


rez:=1;


t:=osnovanie;


while(stepen<> 0) do


begin


if(stepen mod 2 = 1) then


rez := (rez * t) mod modyl;


t:=(t*t) mod modyl;


stepen:= stepen div 2;


end;


Vozvedenie_po_modylju:=rez;


end;


//Vozvrawaet nomer bykvi v alfavite


function Nomer_v_alfavite(a:char):byte;


var


i:byte;


begin


i:=0;


while( (i<=Length(alf)) and (alf[i+1] <> a) ) do


i:=i+1;


Nomer_v_alfavite:= i;


end;


//Naibolwii obwii delitel


function NOD(a{3}:int64;b{fi}:int64;var x:int64;var y:int64):int64;


var


x1,y1:longint;


x2,y2:longint;


q:longint;


r:longint;


begin


if(b=0)then


begin


NOD:=a;


x:=1;


y:=0;


end


else


begin


x2:=1;


x1:=0;


y2:=0;


y1:=1;


while (b>0)do


begin


q:=a div b;


r:=a-q*b;


x:=x2-q*x1;


y:=y2-q*y1;


a:=b;


b:=r;


x2:=x1;


x1:=x;


y2:=y1;


y1:=y;


end;


NOD:=a;


x:=x2;


y:=y2;


end;


end;


//RSA wifrovanie failov


procedure Wifrovanie_RSA(Ka:int64; P:int64; Q:int64; nazv_ish_f:string;nazv_vih_f:string;var Kb:int64);


var


N:int64;


M,C:int64;


f:int64;//4islo vzaimnoprostih 4isel s N


i:integer;


ish_text,vihod_text:string;


bykva:char;


ish_f,vihod_f:TextFile;


begin


N := Q*P; //Nahodim N


f := (P-1)*(Q-1); //Nahodin 4islo vzaimnoprostih 4isel s N


NOD(Ka,f,Kb,M); //Nahodim Kb


while(Kb < 0) do


Kb:= Kb + f; //Esli Kb otricatelno to yveli4ivaem ego


assignfile(ish_f,nazv_ish_f);


reset(ish_f);


assignfile(vihod_f,nazv_vih_f);


rewrite(vihod_f);


while not EOF(ish_f) do


begin


read(ish_f,bykva);


C := Nomer_v_alfavite(bykva);


C:=Vozvedenie_po_modylju(C,Ka,N);


writeln(vihod_f,C);


end;


closefile(ish_f);


closefile(vihod_f);


end;


//RSA raswifrovanie failov


procedure RasWifrovanie_RSA(Kb:int64; P:int64; Q:int64; nazv_ish_f:string;nazv_vih_f:string);


var


N:int64;


M,C:int64;


f:int64;//4islo vzaimnoprostih 4isel s N


i:integer;


ish_text,vihod_text:string;


bykva:char;


ish_f,vihod_f:TextFile;


begin


N := Q*P; //Nahodim N


f := (P-1)*(Q-1); //Nahodin 4islo vzaimnoprostih 4isel s N


assignfile(ish_f,nazv_ish_f);


reset(ish_f);


assignfile(vihod_f,nazv_vih_f);


rewrite(vihod_f);


while not EOF(ish_f) do


begin


readln(ish_f,C);


C:=Vozvedenie_po_modylju(C,Kb,N);


bykva:= alf[C+1];


write(vihod_f,bykva);


end;


closefile(ish_f);


closefile(vihod_f);


end;


end.


Зашифрованный и разшифрованный текст записывается в директорию с исходным файлом.


Скриншоты работы программы





Выводы


В результате выполнения данной работы были получены практические навыки использования современных как симметрических (DES), так и асимметрических (RSA) алгоритмов шифрования.

Сохранить в соц. сетях:
Обсуждение:
comments powered by Disqus

Название реферата: Использование современных симметрических DES и асимметрических RSA алгоритмов шифрования

Слов:7149
Символов:78550
Размер:153.42 Кб.