ПРАКТИЧЕСКАЯ РАБОТА № 3
НАЗВАНИЕ ПРАКТИЧЕСКОЙ РАБОТЫ
РЕАЛИЗАЦИЯ ШИФРА ВИЖИНЕРА
ВЫПОЛНИЛ: студент группы ИС-20-03 Манбаев Казбек Зельгабиденович
ЦЕЛЬ ПРАКТИЧЕСКОЙ РАБОТЫ
Получение навыков создания зашифрованного сообщения при помощи алгоритма шифрования Виженера и его расшифровки
ТЕКСТ ПРОГРАММЫ
1
2
3
4
5
| char[] characters = new char[] { 'А', 'Б', 'В', 'Г', 'Д', 'Е', 'Ё', 'Ж', 'З', 'И',
'Й', 'К', 'Л', 'М', 'Н', 'О', 'П', 'Р', 'С',
'Т', 'У', 'Ф', 'Х', 'Ц', 'Ч', 'Ш', 'Щ', 'Ь', 'Ы', 'Ъ',
'Э', 'Ю', 'Я', ' ', '1', '2', '3', '4', '5', '6', '7',
'8', '9', '0' };
| Тогда мощность алфавита будет равна: Приведем реализацию метода на языке C#, шифрующего строку методом Виженера.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
| //зашифровать
private string Encode(string input, string keyword)
{
input = input.ToUpper();
keyword = keyword.ToUpper();
string result = "";
int keyword_index = 0;
foreach (char symbol in input)
{
int c = (Array.IndexOf(characters, symbol) +
Array.IndexOf(characters, keyword[keyword_index])) % N;
result += characters[c];
keyword_index++;
if ((keyword_index + 1) == keyword.Length)
keyword_index = 0;
}
return result;
}
| На вход поступает строка, которую нужно зашифровать (input) и ключ (keyword).
Теперь приведем реализацию метода, расшифровывающего строку.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
| //расшифровать
private string Decode(string input, string keyword)
{
input = input.ToUpper();
keyword = keyword.ToUpper();
string result = "";
int keyword_index = 0;
foreach (char symbol in input)
{
int p = (Array.IndexOf(characters, symbol) + N -
Array.IndexOf(characters, keyword[keyword_index])) % N;
result += characters[p];
keyword_index++;
if ((keyword_index + 1) == keyword.Length)
keyword_index = 0;
}
return result;
}
| Кроме того, для гаммирования понадобится генерирование псевдослучайного ключа. Вот метод, который делает это:
1
2
3
4
5
6
7
8
9
10
11
| private string Generate_Pseudorandom_KeyWord(int length, int startSeed)
{
Random rand = new Random(startSeed);
string result = "";
for (int i = 0; i < length; i++)
result += characters[rand.Next(0, characters.Length)];
return result;
}
| length — нужная длина ключа. startSeed — число, которым инициализируется генератор случайных чисел. Это число должно быть всегда одинаковым, таким образом и ключ будет всегда один и тот же.
Программа имеет следующий интерфейс:
Код кнопки «Зашифровать» приведен ниже.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
| //зашифровать
private void buttonEncrypt_Click(object sender, EventArgs e)
{
if (radioButtonGamma.Checked)
{
string s;
StreamReader sr = new StreamReader("in.txt");
StreamWriter sw = new StreamWriter("out.txt");
while (!sr.EndOfStream)
{
s = sr.ReadLine();
sw.WriteLine(Encode(s, Generate_Pseudorandom_KeyWord(s.Length, 100)));
}
sr.Close();
sw.Close();
}
else
{
if (textBoxKeyWord.Text.Length > 0)
{
string s;
StreamReader sr = new StreamReader("in.txt");
StreamWriter sw = new StreamWriter("out.txt");
while (!sr.EndOfStream)
{
s = sr.ReadLine();
sw.WriteLine(Encode(s, textBoxKeyWord.Text));
}
sr.Close();
sw.Close();
}
else
MessageBox.Show("Введите ключевое слово!");
}
}
| Происходит чтение данных из файла in.txt, выполняется шифрование (в зависимости от выбранного radioButton) и запись результата в файл out.txt.
Код кнопки «Расшифровать» приводится далее.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
| //расшифровать
private void buttonDecipher_Click(object sender, EventArgs e)
{
if (radioButtonGamma.Checked)
{
string s;
StreamReader sr = new StreamReader("in.txt");
StreamWriter sw = new StreamWriter("out.txt");
while (!sr.EndOfStream)
{
s = sr.ReadLine();
sw.WriteLine(Decode(s, Generate_Pseudorandom_KeyWord(s.Length, 100)));
}
sr.Close();
sw.Close();
}
else
{
if (textBoxKeyWord.Text.Length > 0)
{
string s;
StreamReader sr = new StreamReader("in.txt");
StreamWriter sw = new StreamWriter("out.txt");
while (!sr.EndOfStream)
{
s = sr.ReadLine();
sw.WriteLine(Decode(s, textBoxKeyWord.Text));
}
sr.Close();
sw.Close();
}
else
MessageBox.Show("Введите ключевое слово!");
}
}
| Демонстрация работы программы (шифрование и расшифровка данных методом Виженера) приведена на скриншоте ниже.
|