Автор работы: Пользователь скрыл имя, 06 Мая 2014 в 01:16, лабораторная работа
Краткие сведения о стандарте шифрования DES
DES (Data Encryption Standard) симметричный алгоритм шифрования, разработанный фирмой IBM и утвержденный правительством США в 1977 году как официальный стандарт (FIPS 46-3). DES имеет блоки по 64 бита и 16 цикловую структуру сети Фейстеля. Для шифрования использует ключ с длиной 56 бит. Алгоритм использует комбинацию нелинейных (S-блоки) и линейных (перестановки E, IP, IP-1) преобразований.
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("
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("
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[
}
else
{
textBox5.Text
+= BitArrayToStr(ItogPredv[
}
}
}
}
}
//из 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(
}
//выработка ключевых элементов
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