Автор работы: Пользователь скрыл имя, 06 Мая 2014 в 01:16, лабораторная работа
Краткие сведения о стандарте шифрования DES
DES (Data Encryption Standard) симметричный алгоритм шифрования, разработанный фирмой IBM и утвержденный правительством США в 1977 году как официальный стандарт (FIPS 46-3). DES имеет блоки по 64 бита и 16 цикловую структуру сети Фейстеля. Для шифрования использует ключ с длиной 56 бит. Алгоритм использует комбинацию нелинейных (S-блоки) и линейных (перестановки E, IP, IP-1) преобразований.
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,
//вектор в биты
public void VectorToByte()
{
buf = 0;
vector = false;
if (IshSoobshen.Length == 8)
{
//переводим в байты
vector = true;
byte[]
T = Encoding.Default.GetBytes(
//в биты
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(
//в биты
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(
//в биты
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;