Главная Учебники - Разные Лекции (разные) - часть 34
|
Использование современных симметрических (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.
№
п/п
Шифр
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) означает, что открытый ключ КA
и функция Эйлера Далее, используя расширенный алгоритм Евклида, вычисляют секретный ключ K B
, такой, что или Это можно осуществить, так как получатель В знает пару простых чисел (P,Q) и может легко найти Открытый ключ К A
используют для шифрования данных, а секретный ключ K B
-для расшифрования. Преобразование шифрования определяет криптограмму С
через пару (открытый ключ КA
, сообщение М
) в соответствии со следующей формулой: (6)
Обращение функции Однако обратную задачу, т.е. задачу расшифрования криптограммы С
, можно решить, используя пару (секретный ключ K B
, криптограмма С
) по следующей формуле: (7)
Процесс расшифрования можно записать так: DB
(ЕА
(М)) = М
. (8)
Подставляя в (8) значения (6) и (7), получаем: Или Величина или в несколько более общей форме Сопоставляя выражения (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 Затем выполняется шифрование, состоящее из 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
Матрицы 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 Результат функции Е(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
К табл.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 Таким образом, 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 первоначальной подготовки ключа
Результат преобразования 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 завершающей обработки ключа Ключ K(i) будет состоять из битов 14, 17, ..., 29, 32 последовательности C(i)D(i). Таким образом: K(i) = H(C(i)D(i)) Блок-схема алгоритма вычисления ключа приведена на рис.4. Рис.4. Блок-схема алгоритма вычисления ключа K(i) Восстановление исходного текста осуществляется по такому же алгоритму, что и для шифрования, однако вначале используется ключ Для шифра 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_crypted\Z_20_5_ECB.txt'); razmer:=1024*20; end; if Form1.RadioButton9.Checked=true then begin Wifrovanie_ECB('50.txt','DES_crypted\Z_50_5_ECB.txt'); razmer:=1024*50; end; if Form1.RadioButton8.Checked=true then begin Wifrovanie_ECB('100.txt','DES_crypted\Z_100_5_ECB.txt'); razmer:=1024*100; end; if Form1.RadioButton7.Checked=true then begin Wifrovanie_ECB('500.txt','DES_crypted\Z_500_5_ECB.txt'); razmer:=1024*500; end; if Form1.RadioButton6.Checked=true then begin Wifrovanie_ECB('1.txt','DES_crypted\Z_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_crypted\Z_20_5_ECB.txt','DES_uncrypted\R_20_5_ECB.txt'); razmer:=1024*20; end; if Form1.RadioButton9.Checked=true then begin Raswifrovanie_ECB('DES_crypted\Z_50_5_ECB.txt','DES_uncrypted\R_50_5_ECB.txt'); razmer:=1024*50; end; if Form1.RadioButton8.Checked=true then begin Raswifrovanie_ECB('DES_crypted\Z_100_5_ECB.txt','DES_uncrypted\R_100_5_ECB.txt'); razmer:=1024*100; end; if Form1.RadioButton7.Checked=true then begin Raswifrovanie_ECB('DES_crypted\Z_500_5_ECB.txt','DES_uncrypted\R_500_5_ECB.txt'); razmer:=1024*500; end; if Form1.RadioButton6.Checked=true then begin Raswifrovanie_ECB('DES_crypted\Z_1_5_ECB.txt','DES_uncrypted\R_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_crypted\Z_20_6_ECB.txt'); razmer:=1024*20; end; if Form1.RadioButton9.Checked=true then begin Wifrovanie_ECB('50.txt','DES_crypted\Z_50_6_ECB.txt'); razmer:=1024*50; end; if Form1.RadioButton8.Checked=true then begin Wifrovanie_ECB('100.txt','DES_crypted\Z_100_6_ECB.txt'); razmer:=1024*100; end; if Form1.RadioButton7.Checked=true then begin Wifrovanie_ECB('500.txt','DES_crypted\Z_500_6_ECB.txt'); razmer:=1024*500; end; if Form1.RadioButton6.Checked=true then begin Wifrovanie_ECB('1.txt','DES_crypted\Z_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_crypted\Z_20_6_ECB.txt','DES_uncrypted\R_20_6_ECB.txt'); razmer:=1024*20; end; if Form1.RadioButton9.Checked=true then begin Raswifrovanie_ECB('DES_crypted\Z_50_6_ECB.txt','DES_uncrypted\R_50_6_ECB.txt'); razmer:=1024*50; end; if Form1.RadioButton8.Checked=true then begin Raswifrovanie_ECB('DES_crypted\Z_100_6_ECB.txt','DES_uncrypted\R_100_6_ECB.txt'); razmer:=1024*100; end; if Form1.RadioButton7.Checked=true then begin Raswifrovanie_ECB('DES_crypted\Z_500_6_ECB.txt','DES_uncrypted\R_500_6_ECB.txt'); razmer:=1024*500; end; if Form1.RadioButton6.Checked=true then begin Raswifrovanie_ECB('DES_crypted\Z_1_6_ECB.txt','DES_uncrypted\R_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_crypted\Z_20_7_ECB.txt'); razmer:=1024*20; end; if Form1.RadioButton9.Checked=true then begin Wifrovanie_ECB('50.txt','DES_crypted\Z_50_7_ECB.txt'); razmer:=1024*50; end; if Form1.RadioButton8.Checked=true then begin Wifrovanie_ECB('100.txt','DES_crypted\Z_100_7_ECB.txt'); razmer:=1024*100; end; if Form1.RadioButton7.Checked=true then begin Wifrovanie_ECB('500.txt','DES_crypted\Z_500_7_ECB.txt'); razmer:=1024*500; end; if Form1.RadioButton6.Checked=true then begin Wifrovanie_ECB('1.txt','DES_crypted\Z_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_crypted\Z_20_7_ECB.txt','DES_uncrypted\R_20_7_ECB.txt'); razmer:=1024*20; end; if Form1.RadioButton9.Checked=true then begin Raswifrovanie_ECB('DES_crypted\Z_50_7_ECB.txt','DES_uncrypted\R_50_7_ECB.txt'); razmer:=1024*50; end; if Form1.RadioButton8.Checked=true then begin Raswifrovanie_ECB('DES_crypted\Z_100_7_ECB.txt','DES_uncrypted\R_100_7_ECB.txt'); razmer:=1024*100; end; if Form1.RadioButton7.Checked=true then begin Raswifrovanie_ECB('DES_crypted\Z_500_7_ECB.txt','DES_uncrypted\R_500_7_ECB.txt'); razmer:=1024*500; end; if Form1.RadioButton6.Checked=true then begin Raswifrovanie_ECB('DES_crypted\Z_1_7_ECB.txt','DES_uncrypted\R_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_crypted\Z_20_5_CBС.txt',vektor); razmer:=1024*20; end; if Form1.RadioButton9.Checked=true then begin Wifrovanie_CBC('50.txt','DES_crypted\Z_50_5_CBС.txt',vektor); razmer:=1024*50; end; if Form1.RadioButton8.Checked=true then begin Wifrovanie_CBC('100.txt','DES_crypted\Z_100_5_CBС.txt',vektor); razmer:=1024*100; end; if Form1.RadioButton7.Checked=true then begin Wifrovanie_CBC('500.txt','DES_crypted\Z_500_5_CBС.txt',vektor); razmer:=1024*500; end; if Form1.RadioButton6.Checked=true then begin Wifrovanie_CBC('1.txt','DES_crypted\Z_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_crypted\Z_20_5_CBС.txt','DES_uncrypted\R_20_5_CBС.txt',vektor); razmer:=1024*20; end; if Form1.RadioButton9.Checked=true then begin Raswifrovanie_CBC('DES_crypted\Z_50_5_CBС.txt','DES_uncrypted\R_50_5_CBС.txt',vektor); razmer:=1024*50; end; if Form1.RadioButton8.Checked=true then begin Raswifrovanie_CBC('DES_crypted\Z_100_5_CBС.txt','DES_uncrypted\R_100_5_CBС.txt',vektor); razmer:=1024*100; end; if Form1.RadioButton7.Checked=true then begin Raswifrovanie_CBC('DES_crypted\Z_500_5_CBС.txt','DES_uncrypted\R_500_5_CBС.txt',vektor); razmer:=1024*500; end; if Form1.RadioButton6.Checked=true then begin Raswifrovanie_CBC('DES_crypted\Z_1_5_CBС.txt','DES_uncrypted\R_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_crypted\Z_20_6_CBС.txt',vektor); razmer:=1024*20; end; if Form1.RadioButton9.Checked=true then begin Wifrovanie_CBC('50.txt','DES_crypted\Z_50_6_CBС.txt',vektor); razmer:=1024*50; end; if Form1.RadioButton8.Checked=true then begin Wifrovanie_CBC('100.txt','DES_crypted\Z_100_6_CBС.txt',vektor); razmer:=1024*100; end; if Form1.RadioButton7.Checked=true then begin Wifrovanie_CBC('500.txt','DES_crypted\Z_500_6_CBС.txt',vektor); razmer:=1024*500; end; if Form1.RadioButton6.Checked=true then begin Wifrovanie_CBC('1.txt','DES_crypted\Z_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_crypted\Z_20_6_CBС.txt','DES_uncrypted\R_20_6_CBС.txt',vektor); razmer:=1024*20; end; if Form1.RadioButton9.Checked=true then begin Raswifrovanie_CBC('DES_crypted\Z_50_6_CBС.txt','DES_uncrypted\R_50_6_CBС.txt',vektor); razmer:=1024*50; end; if Form1.RadioButton8.Checked=true then begin Raswifrovanie_CBC('DES_crypted\Z_100_6_CBС.txt','DES_uncrypted\R_100_6_CBС.txt',vektor); razmer:=1024*100; end; if Form1.RadioButton7.Checked=true then begin Raswifrovanie_CBC('DES_crypted\Z_500_6_CBС.txt','DES_uncrypted\R_500_6_CBС.txt',vektor); razmer:=1024*500; end; if Form1.RadioButton6.Checked=true then begin Raswifrovanie_CBC('DES_crypted\Z_1_6_CBС.txt','DES_uncrypted\R_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_crypted\Z_20_7_CBС.txt',vektor); razmer:=1024*20; end; if Form1.RadioButton9.Checked=true then begin Wifrovanie_CBC('50.txt','DES_crypted\Z_50_7_CBС.txt',vektor); razmer:=1024*50; end; if Form1.RadioButton8.Checked=true then begin Wifrovanie_CBC('100.txt','DES_crypted\Z_100_7_CBС.txt',vektor); razmer:=1024*100; end; if Form1.RadioButton7.Checked=true then begin Wifrovanie_CBC('500.txt','DES_crypted\Z_500_7_CBС.txt',vektor); razmer:=1024*500; end; if Form1.RadioButton6.Checked=true then begin Wifrovanie_CBC('1.txt','DES_crypted\Z_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_crypted\Z_20_7_CBС.txt','DES_uncrypted\R_20_7_CBС.txt',vektor); razmer:=1024*20; end; if Form1.RadioButton9.Checked=true then begin Raswifrovanie_CBC('DES_crypted\Z_50_7_CBС.txt','DES_uncrypted\R_50_7_CBС.txt',vektor); razmer:=1024*50; end; if Form1.RadioButton8.Checked=true then begin Raswifrovanie_CBC('DES_crypted\Z_100_7_CBС.txt','DES_uncrypted\R_100_7_CBС.txt',vektor); razmer:=1024*100; end; if Form1.RadioButton7.Checked=true then begin Raswifrovanie_CBC('DES_crypted\Z_500_7_CBС.txt','DES_uncrypted\R_500_7_CBС.txt',vektor); razmer:=1024*500; end; if Form1.RadioButton6.Checked=true then begin Raswifrovanie_CBC('DES_crypted\Z_1_7_CBС.txt','DES_uncrypted\R_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_crypted\Z_20_RSA.txt',Kb); razmer:=1024*20; end; if Form1.RadioButton9.Checked=true then begin Wifrovanie_RSA(Ka, P, Q, '50RSA.txt','RSA_crypted\Z_50_RSA.txt',Kb); razmer:=1024*50; end; if Form1.RadioButton8.Checked=true then begin Wifrovanie_RSA(Ka, P, Q, '100RSA.txt','RSA_crypted\Z_100_RSA.txt',Kb); razmer:=1024*100; end; if Form1.RadioButton7.Checked=true then begin Wifrovanie_RSA(Ka, P, Q, '500RSA.txt','RSA_crypted\Z_500_RSA.txt',Kb); razmer:=1024*500; end; if Form1.RadioButton6.Checked=true then begin Wifrovanie_RSA(Ka, P, Q, '1RSA.txt','RSA_crypted\Z_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_crypted\Z_20_RSA.txt','RSA_uncrypted\R_20_RSA.txt'); razmer:=1024*20; end; if Form1.RadioButton9.Checked=true then begin Raswifrovanie_RSA(Kb,P,Q,'RSA_crypted\Z_50_RSA.txt','RSA_uncrypted\R_50_RSA.txt'); razmer:=1024*20; end; if Form1.RadioButton8.Checked=true then begin Raswifrovanie_RSA(Kb,P,Q,'RSA_crypted\Z_100_RSA.txt','RSA_uncrypted\R_100_RSA.txt'); razmer:=1024*20; end; if Form1.RadioButton7.Checked=true then begin Raswifrovanie_RSA(Kb,P,Q,'RSA_crypted\Z_500_RSA.txt','RSA_uncrypted\R_500_RSA.txt'); razmer:=1024*20; end; if Form1.RadioButton6.Checked=true then begin Raswifrovanie_RSA(Kb,P,Q,'RSA_crypted\Z_1_RSA.txt','RSA_uncrypted\R_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;
| |||||||||||||||||||||||||||||||||||||||||||||