Разработка криптографической программы (стандарт DES)
Разработка программы, реализующей процедуры шифрования и расшифрования текста по стандарту DES (Data Encryption Standard). Структура алгоритма шифрования, схема выработки ключевых элементов. Использование криптографического программного средства.
Рубрика | Программирование, компьютеры и кибернетика |
Вид | курсовая работа |
Язык | русский |
Дата добавления | 15.06.2013 |
Размер файла | 1,7 M |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
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;
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]);
}
listBox1.Items.Add("Результат XOR L(" + (i - 1) + ") и " + i + "го ключевого элемента ");
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 = "";
for (int t = 0; t < 6; t++)
{
HHH[0][t] = L1[i - 1][t];
HHH[1][t] = L1[i - 1][t+6];
HHH[2][t] = L1[i - 1][t+12];
HHH[3][t] = L1[i - 1][t+18];
HHH[4][t] = L1[i - 1][t+24];
HHH[5][t] = L1[i - 1][t+30];
HHH[6][t] = L1[i - 1][t+36];
HHH[7][t] = L1[i - 1][t+42];
}
//выводим на экран
for (int t = 0; t < 8; t++)
{
listBox1.Items.Add((t + 1) + "й " + "H элемент ");
for (int z = 0; z < 6; z++)
{
bufff += (HHH[t][z] ? 1: 0).ToString();
}
listBox1.Items.Add(bufff);
bufff = "";
}
//задаем b1b6 и b2b3b4b5
for (int t = 0; t < 8; t++)
{
b1b6[t][0] = HHH[t][0];
b1b6[t][1] = HHH[t][5];
b2b3b4b5[t][0] = HHH[t][1];
b2b3b4b5[t][1] = HHH[t][2];
b2b3b4b5[t][2] = HHH[t][3];
b2b3b4b5[t][3] = HHH[t][4];
}
//переводим в число
for (int t = 0; t < 8; t++)
{
if ((b1b6[t][0] == false) && (b1b6[t][1] == false))
{
NStr[t] = 0;
}
if ((b1b6[t][0] == false) && (b1b6[t][1] == true))
{
NStr[t] = 1;
}
if ((b1b6[t][0] == true) && (b1b6[t][1] == false))
{
NStr[t] = 2;
}
if ((b1b6[t][0] == true) && (b1b6[t][1] == true))
{
NStr[t] = 3;
}
if ((b2b3b4b5[t][0] == false) && (b2b3b4b5[t][1] == false) && (b2b3b4b5[t][2] == false) && (b2b3b4b5[t][3] == false))
{
NStolb[t] = 0;
}
if ((b2b3b4b5[t][0] == false) && (b2b3b4b5[t][1] == false) && (b2b3b4b5[t][2] == false) && (b2b3b4b5[t][3] == true))
{
NStolb[t] = 1;
}
if ((b2b3b4b5[t][0] == false) && (b2b3b4b5[t][1] == false) && (b2b3b4b5[t][2] == true) && (b2b3b4b5[t][3] == false))
{
NStolb[t] = 2;
}
if ((b2b3b4b5[t][0] == false) && (b2b3b4b5[t][1] == false) && (b2b3b4b5[t][2] == true) && (b2b3b4b5[t][3] == true))
{
NStolb[t] = 3;
}
if ((b2b3b4b5[t][0] == false) && (b2b3b4b5[t][1] == true) && (b2b3b4b5[t][2] == false) && (b2b3b4b5[t][3] == false))
{
NStolb[t] = 4;
}
if ((b2b3b4b5[t][0] == false) && (b2b3b4b5[t][1] == true) && (b2b3b4b5[t][2] == false) && (b2b3b4b5[t][3] == true))
{
NStolb[t] = 5;
}
if ((b2b3b4b5[t][0] == false) && (b2b3b4b5[t][1] == true) && (b2b3b4b5[t][2] == true) && (b2b3b4b5[t][3] == false))
{
NStolb[t] = 6;
}
if ((b2b3b4b5[t][0] == false) && (b2b3b4b5[t][1] == true) && (b2b3b4b5[t][2] == true) && (b2b3b4b5[t][3] == true))
{
NStolb[t] = 7;
}
if ((b2b3b4b5[t][0] == true) && (b2b3b4b5[t][1] == false) && (b2b3b4b5[t][2] == false) && (b2b3b4b5[t][3] == false))
{
NStolb[t] = 8;
}
if ((b2b3b4b5[t][0] == true) && (b2b3b4b5[t][1] == false) && (b2b3b4b5[t][2] == false) && (b2b3b4b5[t][3] == true))
{
NStolb[t] = 9;
}
if ((b2b3b4b5[t][0] == true) && (b2b3b4b5[t][1] == false) && (b2b3b4b5[t][2] == true) && (b2b3b4b5[t][3] == false))
{
NStolb[t] = 10;
}
if ((b2b3b4b5[t][0] == true) && (b2b3b4b5[t][1] == false) && (b2b3b4b5[t][2] == true) && (b2b3b4b5[t][3] == true))
{
NStolb[t] = 11;
}
if ((b2b3b4b5[t][0] == true) && (b2b3b4b5[t][1] == true) && (b2b3b4b5[t][2] == false) && (b2b3b4b5[t][3] == false))
{
NStolb[t] = 12;
}
if ((b2b3b4b5[t][0] == true) && (b2b3b4b5[t][1] == true) && (b2b3b4b5[t][2] == false) && (b2b3b4b5[t][3] == true))
{
NStolb[t] = 13;
}
if ((b2b3b4b5[t][0] == true) && (b2b3b4b5[t][1] == true) && (b2b3b4b5[t][2] == true) && (b2b3b4b5[t][3] == false))
{
NStolb[t] = 14;
}
if ((b2b3b4b5[t][0] == true) && (b2b3b4b5[t][1] == true) && (b2b3b4b5[t][2] == true) && (b2b3b4b5[t][3] == true))
{
NStolb[t] = 15;
}
}
//узнаем узел замены
for (int t = 0; t < 8; t++)
{
if (t == 0)
{
if (NStr[t] == 0)
{
UzelZam[i-1,t]=S10[NStolb[t]];
}
if (NStr[t] == 1)
{
UzelZam[i - 1, t] = S11[NStolb[t]];
}
if (NStr[t] == 2)
{
UzelZam[i - 1, t] = S12[NStolb[t]];
}
if (NStr[t] == 3)
{
UzelZam[i - 1, t] = S13[NStolb[t]];
}
}
if (t == 1)
{
if (NStr[t] == 0)
{
UzelZam[i - 1, t] = S20[NStolb[t]];
}
if (NStr[t] == 1)
{
UzelZam[i - 1, t] = S21[NStolb[t]];
}
if (NStr[t] == 2)
{
UzelZam[i - 1, t] = S22[NStolb[t]];
}
if (NStr[t] == 3)
{
UzelZam[i - 1, t] = S23[NStolb[t]];
}
}
if (t == 2)
{
if (NStr[t] == 0)
{
UzelZam[i - 1, t] = S30[NStolb[t]];
}
if (NStr[t] == 1)
{
UzelZam[i - 1, t] = S31[NStolb[t]];
}
if (NStr[t] == 2)
{
UzelZam[i - 1, t] = S32[NStolb[t]];
}
if (NStr[t] == 3)
{
UzelZam[i - 1, t] = S33[NStolb[t]];
}
}
if (t == 3)
{
if (NStr[t] == 0)
{
UzelZam[i - 1, t] = S40[NStolb[t]];
}
if (NStr[t] == 1)
{
UzelZam[i - 1, t] = S41[NStolb[t]];
}
if (NStr[t] == 2)
{
UzelZam[i - 1, t] = S42[NStolb[t]];
}
if (NStr[t] == 3)
{
UzelZam[i - 1, t] = S43[NStolb[t]];
}
}
if (t == 4)
{
if (NStr[t] == 0)
{
UzelZam[i - 1, t] = S50[NStolb[t]];
}
if (NStr[t] == 1)
{
UzelZam[i - 1, t] = S51[NStolb[t]];
}
if (NStr[t] == 2)
{
UzelZam[i - 1, t] = S52[NStolb[t]];
}
if (NStr[t] == 3)
{
UzelZam[i - 1, t] = S53[NStolb[t]];
}
}
if (t == 5)
{
if (NStr[t] == 0)
{
UzelZam[i - 1, t] = S60[NStolb[t]];
}
if (NStr[t] == 1)
{
UzelZam[i - 1, t] = S61[NStolb[t]];
}
if (NStr[t] == 2)
{
UzelZam[i - 1, t] = S62[NStolb[t]];
}
if (NStr[t] == 3)
{
UzelZam[i - 1, t] = S63[NStolb[t]];
}
}
if (t == 6)
{
if (NStr[t] == 0)
{
UzelZam[i - 1, t] = S70[NStolb[t]];
}
if (NStr[t] == 1)
{
UzelZam[i - 1, t] = S71[NStolb[t]];
}
if (NStr[t] == 2)
{
UzelZam[i - 1, t] = S72[NStolb[t]];
}
if (NStr[t] == 3)
{
UzelZam[i - 1, t] = S73[NStolb[t]];
}
}
if (t == 7)
{
if (NStr[t] == 0)
{
UzelZam[i - 1, t] = S80[NStolb[t]];
}
if (NStr[t] == 1)
{
UzelZam[i - 1, t] = S81[NStolb[t]];
}
if (NStr[t] == 2)
{
UzelZam[i - 1, t] = S82[NStolb[t]];
}
if (NStr[t] == 3)
{
UzelZam[i - 1, t] = S83[NStolb[t]];
}
}
}
//переводим в биты
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 += " ";
}
else
{
bufff += (HShtrih[t] ? 1: 0).ToString();
}
}
listBox1.Items.Add(bufff);
bufff = "";
//переставляем P
for (int h = 0; h < 32; h++)
{
Funk[h] = HShtrih[P[h] - 1];
}
//выводим
listBox1.Items.Add("Перестановка P:");
for (int t = 0; t < 32; t++)
{
if ((t == 7) || (t == 15) || (t == 23) || (t == 31))
{
bufff += (Funk[t] ? 1: 0).ToString();
bufff += " ";
}
else
{
bufff += (Funk[t] ? 1: 0).ToString();
}
}
listBox1.Items.Add(bufff);
bufff = "";
if (i!= 16)
{
H0[i] = L0[i - 1];
L0[i]=H0[i-1].Xor(Funk);
//выводим
listBox1.Items.Add("Часть H" + i + " после итерации:");
for (int bn = 0; bn < 32; bn++)
{
if ((bn == 7) || (bn == 15) || (bn == 23) || (bn == 31))
{
bufff += (H0[i][bn] ? 1: 0).ToString();
bufff += " ";
}
else
{
bufff += (H0[i][bn] ? 1: 0).ToString();
}
}
listBox1.Items.Add(bufff);
bufff = "";
listBox1.Items.Add("Часть L" + i + " после итерации:");
for (int bn = 0; bn < 32; bn++)
{
if ((bn == 7) || (bn == 15) || (bn == 23) || (bn == 31))
{
bufff += (L0[i][bn] ? 1: 0).ToString();
bufff += " ";
}
else
{
bufff += (L0[i][bn] ? 1: 0).ToString();
}
}
listBox1.Items.Add(bufff);
bufff = "";
}
//последняя итерация
else
{
L0[i] = L0[i - 1];
H0[i] = H0[i - 1].Xor(Funk);
//выводим
listBox1.Items.Add("Часть L" + i + " после итерации:");
for (int bn = 0; bn < 32; bn++)
{
if ((bn == 7) || (bn == 15) || (bn == 23) || (bn == 31))
{
bufff += (L0[i][bn] ? 1: 0).ToString();
bufff += " ";
}
else
{
bufff += (L0[i][bn] ? 1: 0).ToString();
}
}
listBox1.Items.Add(bufff);
bufff = "";
listBox1.Items.Add("Часть H" + i + " после итерации:");
for (int bn = 0; bn < 32; bn++)
{
if ((bn == 7) || (bn == 15) || (bn == 23) || (bn == 31))
{
bufff += (H0[i][bn] ? 1: 0).ToString();
bufff += " ";
}
else
{
bufff += (H0[i][bn] ? 1: 0).ToString();
}
}
listBox1.Items.Add(bufff);
bufff = "";
//соединяем
for (int t = 0; t < 32; t++)
{
ItogPredv[counttt][t] = H0[i][t];
ItogPredv[counttt][t+32] = L0[i][t];
}
if (vector == true)
{
if (Shifr == true)
{
if (btTransp.Length!= 1)
{
if (counttt!= 0)
{
btTransp[counttt].Xor(ItogPredv[counttt - 1]);
}
}
}
if (Shifr == false)
{
CBCItog = new BitArray[btTransp.Length];
for (int a = 0; a < btTransp.Length; a++)
{
CBCItog[a] = new BitArray(64);
}
if (counttt == 0)
{
CBCItog[0] = ItogPredv[counttt];
ItogPredv[counttt].Xor(Vekt);
}
else
{
CBCItog[counttt] = ItogPredv[counttt];
ItogPredv[counttt].Xor(CBCItog[counttt - 1]);
}
}
}
//выводим
listBox1.Items.Add("Собранный блок 64 бит:");
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 = "";
//транспонируем IP-1
for (int h = 0; h < 64; h++)
{
Itog[counttt][h] = ItogPredv[counttt][IP1[h] - 1];
}
//выводим
listBox1.Items.Add("Транспонированный IP-1 блок 64 бит:");
for (int bn = 0; bn < 64; bn++)
{
if ((bn == 7) || (bn == 15) || (bn == 23) || (bn == 31) || (bn == 39) || (bn == 47) || (bn == 55))
{
bufff += (Itog[counttt][bn] ? 1: 0).ToString();
bufff += " ";
}
else
{
bufff += (Itog[counttt][bn] ? 1: 0).ToString();
}
}
listBox1.Items.Add(bufff);
bufff = "";
//переворачиваем каждые 8 бит
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
{
kluchC1[t] = kluchC0[1];
kluchD1[t] = kluchD0[1];
}
}
}
}
for (int m = 0; m < 56; m++)
{
if (m < 28)
{
KLUCHIPREDVORITELNII[i][m] = kluchC1[m];
}
else
{
KLUCHIPREDVORITELNII[i][m] = kluchD1[m-28];
}
}
for (int f = 0; f < 28; f++)
{
kluchC0[f] = kluchC1[f];
kluchD0[f] = kluchD1[f];
}
}
//преобразуем в ключевые элементы
for (int i = 0; i < 16; i++)
{
for (int h = 0; h < 48; h++)
{
KLUCHI[i][h] = KLUCHIPREDVORITELNII[i][PC2[h] - 1];
}
}
for (int i = 0; i < 16; i++)
{
listBox1.Items.Add((i + 1) + "й ключ после сдвига");
for (int n = 0; n < 56; n++)
{
if ((n == 7) || (n == 15) || (n == 23) || (n == 31) || (n == 39) || (n == 47))
{
bufff += (KLUCHIPREDVORITELNII[i][n] ? 1: 0).ToString();
bufff += " ";
}
else
{
bufff += (KLUCHIPREDVORITELNII[i][n] ? 1: 0).ToString();
}
}
listBox1.Items.Add(bufff);
bufff = "";
}
for (int i = 0; i < 16; i++)
{
listBox1.Items.Add((i + 1) + "й ключевой элемент");
for (int n = 0; n < 48; n++)
{
if ((n == 7) || (n == 15) || (n == 23) || (n == 31) || (n == 39) || (n == 47))
{
bufff += (KLUCHI[i][n] ? 1: 0).ToString();
bufff += " ";
}
else
{
bufff += (KLUCHI[i][n] ? 1: 0).ToString();
}
}
listBox1.Items.Add(bufff);
bufff = "";
}
}
Размещено на Allbest.ru
Подобные документы
Стандарт шифрования Advanced Encryption Standard как официальный стандарт правительства США для симметричного шифрования. Таблицы подстановки для S-Box и InvS-Box. Преобразование MixColumns, SubWord, RotWord. Процедура расширения ключа 128, 192, 256 бит.
презентация [2,2 M], добавлен 12.12.2013Разработка криптографического алгоритма программы ручного шифра по таблице Виженера. Разработка программы, выполняющей шифрование и расшифрование. Особенности использования в качестве ключа самого открытого текста. Алгоритмы решения "обратных" задач.
курсовая работа [45,0 K], добавлен 13.11.2009Разработка приложения для шифрования данных с помощью алгоритма DES5: процесс шифрования, расшифрования, получение ключей. Спецификация программы, процедуры и функции; описание интерфейса пользователя. Реализация задачи в среде программирования DELPHI.
курсовая работа [812,6 K], добавлен 27.03.2012История появления и развития шифрования текста. Проблема шифрования и дешифрования текстовых сообщений в современности. Создание программы для зашифровки и расшифровки вводимого текста пятью методами: Атбаш, Цезаря, Полибия, Гронсфельда и Винжера.
курсовая работа [923,6 K], добавлен 26.12.2011Схема работы и требования к программам шифрования и дешифрования. Алгоритмы и тексты программы шифрования и программы дешифрования, выполненные на языке программирования C/C++. Содержание файла с исходным текстом, с шифротекстом, с дешифрованным текстом.
курсовая работа [24,7 K], добавлен 20.10.2014Симметричные и асиметричные методы шифрования. Шифрование с помощью датчика псевдослучайных чисел. Алгоритм шифрования DES. Российский стандарт цифровой подписи. Описание шифрования исходного сообщения асимметричным методом с открытым ключом RSA.
курсовая работа [101,1 K], добавлен 09.03.2009Исследование симметричных алгоритмов блочного шифрования. Минусы и плюсы алгоритма IDEA. Разработка программы аутентификации пользователя и сообщений на основе алгоритма IDEA. Выбор языка программирования. Тестирование и реализация программного средства.
курсовая работа [314,2 K], добавлен 27.01.2015Понятие информационной безопасности. История развития криптографии. Функции информационных моделей. Переменные, используемые при разработке прикладной программы для шифрования и дешифрования сообщений с помощью шифра Цезаря. Блок-схема общего алгоритма.
курсовая работа [975,5 K], добавлен 11.06.2014Исследование системы распределения ключей на основе линейных преобразований. Описание компонентов сети конфиденциальной связи. Характеристика отечественного алгоритма шифрования данных. Обзор результатов расчетов криптостойкости алгоритма шифрования.
контрольная работа [56,5 K], добавлен 26.09.2012Основные методы криптографической защиты информации. Система шифрования Цезаря числовым ключом. Алгоритмы двойных перестановок и магические квадраты. Схема шифрования Эль Гамаля. Метод одиночной перестановки по ключу. Криптосистема шифрования данных RSA.
лабораторная работа [24,3 K], добавлен 20.02.2014