Поможем написать учебную работу
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.
Змн.
Арк.
№ докум.
Підпис
Дата
Арк.
11
8.050103.5151.14.02
Змн.
Арк.
№ докум.
Підпис
Дата
Арк.
11
8.050103.5151.14.02
Змн.
Арк.
№ докум.
Підпис
Дата
Арк.
1
8.050103.5151.14.02
Студент:
Паламарчук.Ю
Викладач:
Устенко І.В.
Блочные составные шифры. Сеть Фейстеля
Літ.
Аркушів
8
НУК ім. Адм. Макарова
Лабораторная робота №2
Тема: Блочные составные шифры. Сеть Фейстеля.
Мета: Ознакомиться с блочными составными шифрами, освоить криптографические преобразования подстановки и перестановки. Изучить и реализовать шифрование информации про помощи сети Фейстеля.
Задание:
I. Реализовать приложение для шифрования, позволяющее выполнять следующие действия:
1. Шифровать данные при помощи сети Фейстеля:
1) шифруемый текст должен храниться в одном файле, а ключ шифрования в другом;
2) приложение должно позволять выбирать способ получения подключей из заданного ключа шифрования;
а) для i-го раунда подключем Vi является цепочка из 32 подряд идущих бит заданного ключа, которая начинается с бита номер i, продолжается до последнего бита ключа и при его достижении циклически повторяется, начиная с 1 бита;
б) для i-го раунда, начиная с битв номер i, берётся цепочка из 8 подряд идущих бит ключа, которая является начальным значением для скремблера вида 0000 00112: подключем Vi является сгенерированная этим скремблером последовательность из 32 бит;
3) Приложение должно позволять выбирать вид образующей функции:
а) функция F единичная F(Vi) = Vi
б) функция имеет вид F(Vi, X) = S(X) XOR Vi, где S(X) левая часть шифруемого блока на которую посредством операции XOR била наложена 32-битная последовательность сгенерированная 16 разрядным скремблером вида 0100 0000 0000 00112;
4) Зашифрованный текст должен сохранятся в файл;
5) В процессе шифрования предусмотреть возможность просмотра и изменения ключа, шифруемого и зашифрованного текстов в шестнадцатеричном и символьном виде.
2. Исследовать лавинный эффект (исследования проводить на одном блоке текста)
1) для бита, который будет изменяться приложение должно позволять задавать его позицию (номер) в, открытом тексте или в ключе;
2) приложение должно уметь после каждого раунда шифрования подсчитывать число бит, изменившихся в зашифрованном тексте при изменении одного бита в открытом тексте либо в ключе;
3) приложение может строить графики зависимости числа бит, изменившихся в зашифрованном тексте, от раунда шифрования, либо графики можно строить в стороннем ПО, но тогда приложение для шифрования должно сохранять в файл необходимую для построения графиков информацию.
II Реализовать приложение для дешифрования, позволяющее выполнять следующие действия:
III С помощью реализованных приложений выполнить следующие задания:
Теоритические сведения:
В 1971 году, «крестный отец» стандарта DES, Хорст Фейстель (Horst Feistel), в стенах корпорации IBM, разработал два устройства, реализовавшие различные алгоритмы шифрования, названные затем общим название «Люцифер». В одной из этих устройств он использовал схему, которую впоследствии назвали Сетью Фейстеля. Эта сеть представляет собой определённую многократно итерированную (повторяющуюся) структуру, которою называют ячейкой Фейстеля.
Рисунок 1 Схема работы сети Фейстеля
Принцип работы сети :
Процесс расшифрования аналогичен процессу шифрования за исключением того, что раундовые ключи используются в обратном порядке.
Хід роботи:
Текст програми представлено в додатку А.
Результати роботи програми:
Рисунок 1 Головна форма створеної програми
Рисунок 2 обираємо файл тексту
Генеруємо ключ в файл за допомогою скремблеру:
Рисунок 3 Генерация ключа скремблером
Вибираєм сгенерированній скремблером ключь в файле k.txt:
Рисунок 4 Выбираем путь шифруемого текста
Рисунок 4 Зашифрований текст и біти
Рисунок 5 Расшифрованній текст и біти
Висновок: В ході цієї лабораторної роботи було створено програму, яка шифрує дані за допомогою сети Фейстеля, ознакомился с блочными составными шифрами, освоитл криптографические преобразования подстановки и перестановки. Изучил и реализовать шифрование информации про помощи сети Фейстеля.
Додаток А. Код програми
Form1.cs
using System;
using System.Collections;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace SetFeistela
{
public partial class Form1 : Form
{
static int rounds = 0;
int[] keys = new int[16];
int[] text = new int[2];
int[] dtext = new int[2];
int L, dL = 0;
int R, dR = 0;
string bite = "";
string stext = "";
string skey = "";
Shifraciya shif = new Shifraciya();
Deshifraciya deshif = new Deshifraciya();
Skrembler NewScr = new Skrembler();
string skr = "";
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
}
private void button2_Click(object sender, EventArgs e)
{
if (openFileDialog1.ShowDialog() == System.Windows.Forms.DialogResult.OK)
{
StreamReader sr = new StreamReader(openFileDialog1.FileName);
stext = sr.ReadToEnd();
string[] split = stext.Split(new Char[] { ' ', ',', '.', ':', '\t' });
for (int i = 0; i < split.Length; i++)
{
if (i < (split.Length - 1))
{
//if (s.Trim() != "")
text[i] += Convert.ToInt32(split[i]);
textBox2.Text += text[i] + " ";
}
else
{
text[i] += Convert.ToInt32(split[i]);
textBox2.Text += text[i];
}
}
L = text[0];
R = text[1];
label4.Visible = true;
}
bool[] b = new BitArray(new int[] { text[0] }).Cast<bool>().Reverse().ToArray();
foreach (var item in b)
{
bite += item ? "1" : "0";
Console.Write(item ? "1" : "0");
}
textBox5.Text += bite;
}
private void button1_Click(object sender, EventArgs e)
{
if (openFileDialog1.ShowDialog() == System.Windows.Forms.DialogResult.OK)
{
StreamReader sr = new StreamReader(openFileDialog1.FileName);
skey = sr.ReadLine();
string[] split = skey.Split(new Char[] { ' ', ',', '.', ':', '\t' });
rounds = split.Length;
for (int i = 0; i < split.Length; i++)
{
keys[i] += Convert.ToInt32(split[i]);
textBox1.Text += keys[i];
}
label3.Text = "Ключ заменен!";
label3.ForeColor = Color.Green;
}
}
private void button3_Click(object sender, EventArgs e)
{
string bite1 = "";
string a = shif.crypt(L, R, rounds, keys);
string[] split = a.Split(new Char[] { ' ', ',', '.', ':', '\t' });
for (int i = 0; i < split.Length; i++)
{
dtext[i] += Convert.ToInt32(split[i]);
}
dL = dtext[0];
dR = dtext[1];
textBox3.Text = a;
bool[] d = new BitArray(new int[] { dtext[0] }).Cast<bool>().Reverse().ToArray();
foreach (var item in d)
{
bite1 += item ? "1" : "0";
Console.Write(item ? "1" : "0");
}
TextBoxMsg.Text += bite1;
MessageBox.Show(a);
}
private void button4_Click(object sender, EventArgs e)
{
string bite2 = "";
string a = deshif.decrypt(dL, dR, rounds, keys);
textBox4.Text = a;
bool[] b = new BitArray(new int[] { text[0] }).Cast<bool>().Reverse().ToArray();
foreach (var item in b)
{
bite2 += item ? "1" : "0";
Console.Write(item ? "1" : "0");
}
textBox6.Text += bite2;
if (textBox2.Text == textBox4.Text)
{
MessageBox.Show("Расшифрованно успешно!");
}
}
private void button5_Click(object sender, EventArgs e)
{
try
{
skr = textBox7.Text;
string z = "";
string s = NewScr.BinaryString(skr);
char[] chars = s.ToCharArray();
for (int i = 0; i < 16; i++)
{
if (i < 15)
{
z += chars[i] + " ";
}
else
{
z += chars[i];
}
}
File.WriteAllText(@"F:\k.txt", z, Encoding.Default);
MessageBox.Show("Ключь успешно сгенерирован да диск : F в файл : k.txt");
}
catch (Exception)
{
MessageBox.Show("Введите ключ!");
}
}
public static int BinToInt(string binaryNumber)
{
int multiplier = 1;
int converted = 0;
for (int i = binaryNumber.Length - 1; i >= 0; i--)
{
int t = System.Convert.ToInt16(binaryNumber[i].ToString());
converted = converted + (t * multiplier);
multiplier = multiplier * 2;
}
return converted;
}
}
}
Shifraciya.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace SetFeistela
{
class Shifraciya
{
/* функция преобразования подблока по ключу (зависит от конкретного алгоритма)
subblock - преобразуемый подблок
key - ключ
возвращаяемое значение - преобразованный блок*/
int f(int subblock, int key)
{
return subblock + key;
}
/*Шифрование открытого текста
left - левый входной подблок
right - правый входной подблок
* key - массив ключей (по ключу на раунд)
rounds - количество раундов*/
public string crypt(int left, int right, int rounds, int[] key)
{
int i, temp;
for (i = 0; i < rounds; i++)
{
temp = right ^ f(left, key[i]);
right = left;
left = temp;
}
string z = left.ToString() + " " + right.ToString();
return z;
}
}
}
Deshifraciya.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace SetFeistela
{
class Deshifraciya
{
int f(int subblock, int key)
{
return subblock + key;
}
/*Расшифрование текста
left - левый зашифрованный подблок
right - правый зашифрованный подблок*/
public string decrypt(int left, int right, int rounds, int[] key)
{
int i, temp;
for (i = rounds - 1; i >= 0; i--)
{
temp = left ^ f(right, key[i]);
left = right;
right = temp;
}
string z = left.ToString() + " " + right.ToString();
return z;
}
}
}