Алгоритм шифрования 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 Кб (Скачать документ)

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();

}

}

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

public void FUNKCIY()

{

listBox1.Items.Add(" ");

if (Shifr == true)

{

listBox1.Items.Add("---------------------------ШИФРОВАНИЕ--------------------------- ");

}

else

{

listBox1.Items.Add("---------------------------ДЕШИФРОВАНИЕ--------------------------- ");

}

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

{

listBox1.Items.Add(" ");

listBox1.Items.Add((counttt + 1) + "й блок: ");

if ((counttt == 0) || (vector == false))

{

H0[0] = HPart[counttt];

L0[0] = LPart[counttt];

}

//для CBC

else

{

if (Shifr == true)

{

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];

}

}

H0[0] = HPart[counttt];

L0[0] = LPart[counttt];

}

else

{

H0[0] = HPart[counttt];

L0[0] = LPart[counttt];

}

}

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

{

listBox1.Items.Add(" ");

listBox1.Items.Add(i + "я итерация: ");

//в 48 бит

for(int cv=0; cv< 48; cv++)

{

L1[i - 1][cv] = L0[i-1][E[cv] - 1];

}

//проверка

listBox1.Items.Add("блок L" + (i - 1) + " в 48 бит: ");

bufff = "";

for (int bn = 0; bn < 48; bn++)

{

if ((bn == 7) || (bn == 15) || (bn == 23) || (bn == 31) || (bn == 39) || (bn == 47))

{

bufff += (L1[i - 1][bn] ? 1: 0).ToString();

bufff += " ";

}

else

{

bufff += (L1[i - 1][bn] ? 1: 0).ToString();

}

}

listBox1.Items.Add(bufff);

bufff = "";

listBox1.Items.Add("блок L" + (i - 1) + " в 48 бит: ");

for (int n = 0; n < 48; n++)

{

if ((n == 7) || (n == 15) || (n == 23) || (n == 31) || (n == 39) || (n == 47))

{

bufff += (KLUCHI[i - 1][n] ? 1: 0).ToString();

bufff += " ";

}

else

{

bufff += (KLUCHI[i - 1][n] ? 1: 0).ToString();

}

}

listBox1.Items.Add(bufff);

bufff = "";

//XOR

if (Shifr == true)

{

L1[i - 1].Xor(KLUCHI[i - 1]);

}

else

{

L1[i - 1].Xor(KLUCHI[17-i - 1]);

}

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

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

{

if (UzelZam[i - 1, t] == 0)

{

TTT[t][0] = false;

TTT[t][1] = false;

TTT[t][2] = false;

TTT[t][3] = false;

}

if (UzelZam[i - 1, t] == 1)

{

TTT[t][0] = false;

TTT[t][1] = false;

TTT[t][2] = false;

TTT[t][3] = true;

}

if (UzelZam[i - 1, t] == 2)

{

TTT[t][0] = false;

TTT[t][1] = false;

TTT[t][2] = true;

TTT[t][3] = false;

}

if (UzelZam[i - 1, t] == 3)

{

TTT[t][0] = false;

TTT[t][1] = false;

TTT[t][2] = true;

TTT[t][3] = true;

}

if (UzelZam[i - 1, t] == 4)

{

TTT[t][0] = false;

TTT[t][1] = true;

TTT[t][2] = false;

TTT[t][3] = false;

}

if (UzelZam[i - 1, t] == 5)

{

TTT[t][0] = false;

TTT[t][1] = true;

TTT[t][2] = false;

TTT[t][3] = true;

}

if (UzelZam[i - 1, t] == 6)

{

TTT[t][0] = false;

TTT[t][1] = true;

TTT[t][2] = true;

TTT[t][3] = false;

}

if (UzelZam[i - 1, t] == 7)

{

TTT[t][0] = false;

TTT[t][1] = true;

TTT[t][2] = true;

TTT[t][3] = true;

}

if (UzelZam[i - 1, t] == 8)

{

TTT[t][0] = true;

TTT[t][1] = false;

TTT[t][2] = false;

TTT[t][3] = false;

}

if (UzelZam[i - 1, t] == 9)

{

TTT[t][0] = true;

TTT[t][1] = false;

TTT[t][2] = false;

TTT[t][3] = true;

}

if (UzelZam[i - 1, t] == 10)

{

TTT[t][0] = true;

TTT[t][1] = false;

TTT[t][2] = true;

TTT[t][3] = false;

}

if (UzelZam[i - 1, t] == 11)

{

TTT[t][0] = true;

TTT[t][1] = false;

TTT[t][2] = true;

TTT[t][3] = true;

}

if (UzelZam[i - 1, t] == 12)

{

TTT[t][0] = true;

TTT[t][1] = true;

TTT[t][2] = false;

TTT[t][3] = false;

}

if (UzelZam[i - 1, t] == 13)

{

TTT[t][0] = true;

TTT[t][1] = true;

TTT[t][2] = false;

TTT[t][3] = true;

}

if (UzelZam[i - 1, t] == 14)

{

TTT[t][0] = true;

TTT[t][1] = true;

TTT[t][2] = true;

TTT[t][3] = false;

}

if (UzelZam[i - 1, t] == 15)

{

TTT[t][0] = true;

TTT[t][1] = true;

TTT[t][2] = true;

TTT[t][3] = true;

}

}

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

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

{

listBox1.Items.Add("Узел замены S" + (t + 1) + " = " + (UzelZam[i - 1, t]));

listBox1.Items.Add("В битах: ");

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

{

bufff += (TTT[t][e] ? 1: 0).ToString();

}

listBox1.Items.Add(bufff);

bufff = "";

}

//восстанавливаем

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

{

if (t == 0)

{

HShtrih[0] = TTT[0][0];

HShtrih[1] = TTT[0][1];

HShtrih[2] = TTT[0][2];

HShtrih[3] = TTT[0][3];

}

if (t == 1)

{

HShtrih[4] = TTT[1][0];

HShtrih[5] = TTT[1][1];

HShtrih[6] = TTT[1][2];

HShtrih[7] = TTT[1][3];

}

if (t == 2)

{

HShtrih[8] = TTT[2][0];

HShtrih[9] = TTT[2][1];

HShtrih[10] = TTT[2][2];

HShtrih[11] = TTT[2][3];

}

if (t == 3)

{

HShtrih[12] = TTT[3][0];

HShtrih[13] = TTT[3][1];

HShtrih[14] = TTT[3][2];

HShtrih[15] = TTT[3][3];

}

if (t == 4)

{

HShtrih[16] = TTT[4][0];

HShtrih[17] = TTT[4][1];

HShtrih[18] = TTT[4][2];

HShtrih[19] = TTT[4][3];

}

if (t == 5)

{

HShtrih[20] = TTT[5][0];

HShtrih[21] = TTT[5][1];

HShtrih[22] = TTT[5][2];

HShtrih[23] = TTT[5][3];

}

if (t == 6)

{

HShtrih[24] = TTT[6][0];

HShtrih[25] = TTT[6][1];

HShtrih[26] = TTT[6][2];

HShtrih[27] = TTT[6][3];

}

if (t == 7)

{

HShtrih[28] = TTT[7][0];

HShtrih[29] = TTT[7][1];

HShtrih[30] = TTT[7][2];

HShtrih[31] = TTT[7][3];

}

}

//выводим

listBox1.Items.Add("Объединенные 8 элементов:");

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

{

if ((t == 7) || (t == 15) || (t == 23) || (t == 31))

{

bufff += (HShtrih[t] ? 1: 0).ToString();

bufff += " ";

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

{

ItogPredv[counttt][t] = Itog[counttt][7-t];

ItogPredv[counttt][t+8] = Itog[counttt][15 - t];

ItogPredv[counttt][t+16] = Itog[counttt][23 - t];

ItogPredv[counttt][t+24] = Itog[counttt][31 - t];

ItogPredv[counttt][t+32] = Itog[counttt][39 - t];

ItogPredv[counttt][t+40] = Itog[counttt][47 - t];

ItogPredv[counttt][t+48] = Itog[counttt][55 - t];

ItogPredv[counttt][t+56] = Itog[counttt][63 - t];

}

//выводим

listBox1.Items.Add("Перевернутый  блок 64 бит (из-за BitArray C#):");

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

{

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

{

bufff += (ItogPredv[counttt][bn] ? 1: 0).ToString();

bufff += " ";

}

else

{

bufff += (ItogPredv[counttt][bn] ? 1: 0).ToString();

}

}

listBox1.Items.Add(bufff);

bufff = "";

//в  привычную письменность

if (Shifr == true)

{

textBox3.Text += BitArrayToStr(ItogPredv[counttt]);

}

else

{

textBox5.Text += BitArrayToStr(ItogPredv[counttt]);

}

}

}

}

}

//из bitarray в string)

static String BitArrayToStr(BitArray ba)

{

byte[] strArr = new byte[ba.Length / 8];

System.Text.ASCIIEncoding encoding = new System.Text.ASCIIEncoding();

for (int i = 0; i < ba.Length / 8; i++)

{

for (int index = i * 8, m = 1; index < i * 8 + 8; index++, m *= 2)

{

strArr[i] += ba.Get(index) ? (byte)m: (byte)0;

}

}

return Encoding.Default.GetString(strArr);

}

//выработка  ключевых элементов

public void KEYS()

{

kluchC0=new BitArray(28);

kluchD0 = new BitArray(28);

kluchC1 = new BitArray(28);

kluchD1 = new BitArray(28);

KLUCHI = new BitArray[16];

KLUCHIPREDVORITELNII = new BitArray[16];

btKluch1 = new BitArray(56);

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

{

KLUCHI[i] = new BitArray(48);

KLUCHIPREDVORITELNII[i] = new BitArray(56);

}

//перестановка PC1

for (int h =0; h < 56; h++)

{

btKluch1[h] = btKluch2[PC1[h] - 1];

}

listBox1.Items.Add("Ключ  после перестановки PC1");

for (int n = 0; n < 56; n++)

{

if ((n == 7) || (n == 15) || (n == 23) || (n == 31) || (n == 39) || (n == 47))

{

bufff += (btKluch1[n] ? 1: 0).ToString();

bufff += " ";

}

else

{

bufff += (btKluch1[n] ? 1: 0).ToString();

}

}

listBox1.Items.Add(bufff);

bufff = "";

//делим  на две 28 битовые части

for (int w = 0; w < 28; w++)

{

kluchC0[w] = btKluch1[w];

kluchD0[w] = btKluch1[w+28];

}

listBox1.Items.Add("Ключ  С (Левая часть)");

for (int n = 0; n < 28; n++)

{

bufff += (kluchC0[n] ? 1: 0).ToString();

}

listBox1.Items.Add(bufff);

bufff = "";

listBox1.Items.Add("Ключ D (Правая часть)");

for (int n = 0; n < 28; n++)

{

bufff += (kluchD0[n] ? 1: 0).ToString();

}

listBox1.Items.Add(bufff);

bufff = "";

//сдвигаем

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

{

for (int t = 0; t < 28; t++)

{

if (SDVIGG[i] == 1)

{

if (t!= 27)

{

kluchC1[t] = kluchC0[t + 1];

kluchD1[t] = kluchD0[t + 1];

}

else

{

kluchC1[t] = kluchC0[0];

kluchD1[t] = kluchD0[0];

}

}

else

{

if ((t!= 27) && (t!= 26))

{

kluchC1[t] = kluchC0[t + 2];

kluchD1[t] = kluchD0[t + 2];

}

else

{

if (t == 26)

{

kluchC1[t] = kluchC0[0];

kluchD1[t] = kluchD0[0];

}

else

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