Алгоритм шифрования DES

Автор работы: Пользователь скрыл имя, 06 Мая 2014 в 01:16, лабораторная работа

Краткое описание

Краткие сведения о стандарте шифрования DES
DES (Data Encryption Standard) симметричный алгоритм шифрования, разработанный фирмой IBM и утвержденный правительством США в 1977 году как официальный стандарт (FIPS 46-3). DES имеет блоки по 64 бита и 16 цикловую структуру сети Фейстеля. Для шифрования использует ключ с длиной 56 бит. Алгоритм использует комбинацию нелинейных (S-блоки) и линейных (перестановки E, IP, IP-1) преобразований.

Прикрепленные файлы: 1 файл

ЛабDES.docx

— 127.43 Кб (Скачать документ)

public int[] S22 = { 0, 14, 7, 11, 10, 4, 13, 1, 5, 8, 12, 6, 9, 3, 2, 15 };

public int[] S23 = { 13, 8, 10, 1, 3, 15, 4, 2, 11, 6, 7, 12, 0, 5, 14, 9 };

public int[] S30 = { 10, 0, 9, 14, 6, 3, 15, 5, 1, 13, 12, 7, 11, 4, 2, 8 };

public int[] S31 = { 13, 7, 0, 9, 3, 4, 6, 10, 2, 8, 5, 14, 12, 11, 15, 1 };

public int[] S32 = { 13, 6, 4, 9, 8, 15, 3, 0, 11, 1, 2, 12, 5, 10, 14, 7 };

public int[] S33 = { 1, 10, 13, 0, 6, 9, 8, 7, 4, 15, 14, 3, 11, 5, 2, 12 };

public int[] S40 = { 7, 13, 14, 3, 0, 6, 9, 10, 1, 2, 8, 5, 11, 12, 4, 15 };

public int[] S41 = { 13, 8, 11, 5, 6, 15, 0, 3, 4, 7, 2, 12, 1, 10, 14, 9 };

public int[] S42 = { 10, 6, 9, 0, 12, 11, 7, 13, 15, 1, 3, 14, 5, 2, 8, 4 };

public int[] S43 = { 3, 15, 0, 6, 10, 1, 13, 8, 9, 4, 5, 11, 12, 7, 2, 14 };

public int[] S50 = { 2, 12, 4, 1, 7, 10, 11, 6, 8, 5, 3, 15, 13, 0, 14, 9 };

public int[] S51 = { 14, 11, 2, 12, 4, 7, 13, 1, 5, 0, 15, 10, 3, 9, 8, 6 };

public int[] S52 = { 4, 2, 1, 11, 10, 13, 7, 8, 15, 9, 12, 5, 6, 3, 0, 14 };

public int[] S53 = { 11, 8, 12, 7, 1, 14, 2, 13, 6, 15, 0, 9, 10, 4, 5, 3 };

public int[] S60 = { 12, 1, 10, 15, 9, 2, 6, 8, 0, 13, 3, 4, 14, 7, 5, 11 };

public int[] S61 = { 10, 15, 4, 2, 7, 12, 9, 5, 6, 1, 13, 14, 0, 11, 3, 8 };

public int[] S62 = { 9, 14, 15, 5, 2, 8, 12, 3, 7, 0, 4, 10, 1, 13, 11, 6 };

public int[] S63 = { 4, 3, 2, 12, 9, 5, 15, 10, 11, 14, 1, 7, 6, 0, 8, 13 };

public int[] S70 = { 4, 11, 2, 14, 15, 0, 8, 13, 3, 12, 9, 7, 5, 10, 6, 1 };

public int[] S71 = { 13, 0, 11, 7, 4, 9, 1, 10, 14, 3, 5, 12, 2, 15, 8, 6 };

public int[] S72 = { 1, 4, 11, 13, 12, 3, 7, 14, 10, 15, 6, 8, 0, 5, 9, 2 };

public int[] S73 = { 6, 11, 13, 8, 1, 4, 10, 7, 9, 5, 0, 15, 14, 2, 3, 12 };

public int[] S80 = { 13, 2, 8, 4, 6, 15, 11, 1, 10, 9, 3, 14, 5, 0, 12, 7 };

public int[] S81 = { 1, 15, 13, 8, 10, 3, 7, 4, 12, 5, 6, 11, 0, 14, 9, 2 };

public int[] S82 = { 7, 11, 4, 1, 9, 12, 14, 2, 0, 6, 10, 13, 15, 3, 5, 8 };

public int[] S83 = { 2, 1, 14, 7, 4, 10, 8, 13, 15, 12, 9, 0, 3, 5, 6, 11 };

public int[] PC1 = { 57,49,41,33,25,17,9,

1,58,50,42,34,26,18,

10,2,59,51,43,35,27,

19,11,3,60,52,44,36,

63,55,47,39,31,23,15,

7,62,54,46,38,30,22,

14,6,61,53,45,37,29,

21,13,5,28,20,12,4};

public int[] PC2 = { 14,17,11,24,1,5,

3,28,15,6,21,10,

23,19,12,4,26,8,

16,7,27,20,13,2,

41,52,31,37,47,55,

30,40,51,45,33,48,

44,49,39,56,34,53,

46,42,50,36,29,32};

public int[] SDVIGG = { 1,1,2,2,2,2,2,2,1,2,2,2,2,2,2,1};

//вектор в биты

public void VectorToByte()

{

buf = 0;

vector = false;

if (IshSoobshen.Length == 8)

{

//переводим в байты

vector = true;

byte[] T = Encoding.Default.GetBytes(IshSoobshen);

//в биты

Vekt = new BitArray(T);

////переворачиваем

for (int g = 0; g < Vekt.Length / 8; g++)

{

buf = 0;

for (int i = 0; i < 4; i++)

{

steck = Vekt[i + (g * 8)];

Vekt[i + (g * 8)] = Vekt[i + (g * 8) + 7 - buf];

Vekt[i + (g * 8) + 7 - buf] = steck;

buf += 2;

}

}

}

else

{

MessageBox.Show("Неправильный вектор");

kluch = false;

}

}

//ключ в биты

public void KeyToByte()

{

buf = 0;

kluch = false;

if (IshSoobshen.Length == 7)

{

//переводим  в байты

kluch = true;

byte[] T = Encoding.Default.GetBytes(IshSoobshen);

//в биты

btKluch1 = new BitArray(T);

////переворачиваем

for (int g = 0; g < btKluch1.Length / 8; g++)

{

buf = 0;

for (int i = 0; i < 4; i++)

{

steck = btKluch1[i + (g * 8)];

btKluch1[i + (g * 8)] = btKluch1[i + (g * 8) + 7 - buf];

btKluch1[i + (g * 8) + 7 - buf] = steck;

buf += 2;

}

}

}

else

{

MessageBox.Show("Неправильный ключ");

kluch = false;

}

}

//сообщение в биты

public void MessToByte()

{

buf = 0;

//переводим в байты

byte[] T = Encoding.Default.GetBytes(IshSoobshen);

//в биты

bt2 = new BitArray(T);

if (bt2.Length % 64!= 0)

{//проверяем  кратность 64 бит

bt1 = new BitArray(bt2.Length + (64 - bt2.Length % 64));

for (int y = 0; y < bt2.Length; y++)

{

bt1[y] = bt2[y];

}

}

else

{

bt1 = new BitArray(bt2.Length);

for (int y = 0; y < bt2.Length; y++)

{

bt1[y] = bt2[y];

}

}

//меняем  местами биты в блоках

for (int g = 0; g < bt1.Length / 8; g++)

{

buf = 0;

for (int i = 0; i < 4; i++)

{

steck = bt1[i + (g * 8)];

bt1[i + (g * 8)] = bt1[i + (g * 8) + 7 - buf];

bt1[i + (g * 8) + 7 - buf] = steck;

buf += 2;

}

}

}

//делим  сообщение на блоки по 8 бит

public void CutForBlock()

{

//кол-во блоков

buf = bt1.Length / 64;

//делим  на перестановленные блоки

btTransp = new BitArray[buf];

for (int i = 0; i < buf; i++)

{

btTransp[i] = new BitArray(64);

}

buf2 = 0;

for (int g = 0; g < buf; g++)

{

for (int h = g * 64; h < (g + 1) * 64; h++)

{

if (g == 0)

{

btTransp[buf2][h] = bt1[IP[h] - 1];

}

else

{

btTransp[buf2][h - g * 64] = bt1[IP[h - g * 64] - 1 + g * 64];

}

}

buf2++;

}

}

//дополняем ключ битом четности

public void KeyTo64()

{

// бит четности

buf = 0;

buf2 = 0;

buf3 = new BitArray(8);

for (int y = 0; y < 8; y++)

{

for (int u = 0; u < 7; u++)

{

if (btKluch1[y * 7 + u] == true)

{

buf++;

}

}

if ((buf % 2 == 0) || (buf == 0))

{

buf3[buf2] = false;

}

else { buf3[buf2] = true; }

buf = 0;

buf2++;

}

//заносим  бит четности в ключ

buf = 0;

buf2 = 0;

btKluch2 = new BitArray(64);

for (int k = 0; k < 64; k++)

{

if ((k == 7) || (k == 15) || (k == 23) || (k == 31) || (k == 39) || (k == 47) || (k == 55) || (k == 63))

{

btKluch2[k] = buf3[buf2];

buf2++;

}

else

{

btKluch2[k] = btKluch1[buf];

buf++;

}

}

}

//разбиваем  сообщение на 2 части

public void OneToTwo()

{

H0 = new BitArray[17];

L0 = new BitArray[17];

H1 = new BitArray[17];

L1 = new BitArray[17];

HHH = new BitArray[8];

TTT = new BitArray[8];

b1b6 = new BitArray[8];

Itog = new BitArray[btTransp.Length];

ItogPredv = new BitArray[btTransp.Length];

b2b3b4b5 = new BitArray[8];

NStolb = new int[8];

NStr = new int[8];

UzelZam = new int[16, 8];

HShtrih = new BitArray(32);

Funk = new BitArray(32);

for (int gh = 0; gh < btTransp.Length; gh++)

{

Itog[gh] = new BitArray(64);

ItogPredv[gh] = new BitArray(64);

}

for (int qwe = 0; qwe < 8; qwe++)

{

TTT[qwe] = new BitArray(4);

HHH[qwe] = new BitArray(6);

b1b6[qwe] = new BitArray(2);

b2b3b4b5[qwe] = new BitArray(4);

}

HPart = new BitArray[btTransp.Length];

LPart = new BitArray[btTransp.Length];

for (int i = 0; i < 17; i++)

{

H0[i] = new BitArray(32);

L0[i] = new BitArray(32);

H1[i] = new BitArray(48);

L1[i] = new BitArray(48);

}

for (int e = 0; e < btTransp.Length; e++)

{

HPart[e] = new BitArray(32);

LPart[e] = new BitArray(32);

}

for (int s = 0; s < btTransp.Length; s++)

{

for (int d = 0; d < 32; d++)

{

HPart[s][d] = btTransp[s][d];

LPart[s][d] = btTransp[s][d + 32];

}

}

}

//все  методы print выводят шаги на экран

public void Print1()

{

buf = 0;

bufff = "";

for (int k = 0; k < bt1.Length / 64; k++)

{

listBox1.Items.Add((k + 1) + "й изначальный блок бит:");

for (int y = 0; y < 64; y++)

{

if ((y == 7) || (y == 15) || (y == 23) || (y == 31) || (y == 39) || (y == 47) || (y == 55) || (y == 63))

{

bufff += (bt1[64 * k + y] ? 1: 0).ToString();

bufff += " ";

}

else

{

bufff += (bt1[64 * k + y] ? 1: 0).ToString();

}

}

listBox1.Items.Add(bufff);

bufff = "";

}

}

//делим  на блоки

CutForBlock();

//выводим  на экран

Print2();

////вывод  на экран ключ

Print3();

//дополняем  ключ до 64 бит

KeyTo64();

//выводим  ключ 64 бит на экран

Print4();

//метод  для ключевых элементов

KEYS();

//разбиваем  сообщение на половинки

OneToTwo();

//функция  шифрования

FUNKCIY();

Shifr = true;

IshSoobshen = textBox7.Text;

KeyToByte();

IshSoobshen = textBox5.Text;

textBox5.Clear();

textBox3.Clear();

//переводим  сообщение в биты

MessToByte();

//выводим  на экран

listBox1.Items.Add(" ");

Print1();

//делим  на блоки

CutForBlock();

//выводим  на экран

Print2();

////вывод  на экран ключ

Print3();

//дополняем  ключ до 64 бит

KeyTo64();

//выводим  ключ 64 бит на экран

Print4();

//метод  для ключевых элементов

KEYS();

//разбиваем  сообщение на половинки

OneToTwo();

//функция  шифрования

FUNKCIY();

Shifr = false;

IshSoobshen = textBox4.Text;

KeyToByte();

IshSoobshen = textBox3.Text;

textBox3.Clear();

textBox3.Text = bufff1;

//переводим  сообщение в биты

MessToByte();

//выводим  на экран

listBox1.Items.Add(" ");

Print1();

//делим  на блоки

CutForBlock();

//выводим  на экран

Print2();

////вывод  на экран ключ

Print3();

//дополняем  ключ до 64 бит

KeyTo64();

//выводим  ключ 64 бит на экран

Print4();

//метод  для ключевых элементов

KEYS();

//разбиваем  сообщение на половинки

OneToTwo();

//функция  шифрования

FUNKCIY();

}

else

{

if (kluch == true)

{

MessageBox.Show("Исходное  сообщение отсутствует!");

}

}

}

}

else

{

MessageBox.Show("Проверьте  ключи. Один из них не подходит.");

}

}

private void button1_Click(object sender, EventArgs e)

{

listBox1.Items.Clear();

textBox3.Clear();

textBox5.Clear();

Shifr = true;

kluch = false;

vector = false;

EEE3 = false;

EEE2 = false;

EDE3 = false;

EDE2 = false;

if (radioButton1.Checked == true)

{

ECB();

}

if (radioButton2.Checked == true)

{

CBC();

}

if (radioButton3.Checked == true)

{

EEE3 = true;

EEE();

}

if (radioButton4.Checked == true)

{

EDE3 = true;

EDE();

}

if (radioButton5.Checked == true)

{

EEE2 = true;

EEE();

}

if (radioButton6.Checked == true)

{

EDE2 = true;

EDE();

}

}

private void button2_Click(object sender, EventArgs e)

{

listBox1.Items.Clear();

textBox5.Clear();

Shifr = false;

kluch = false;

vector = false;

EEE3 = false;

EEE2 = false;

EDE3 = false;

EDE2 = false;

Информация о работе Алгоритм шифрования DES