Практические работы Часть 2 / Практическая работа 7 / ПР№ 7 Шифрование методом гаммирования
.docxПрактическая работа № 7
Шифрование данных методом гаммирования
в симметричных криптосистемах
Цель работы: изучить методы шифрования данных гаммированием и освоить их практическое применение.
Под гаммированием понимают процесс наложения по определенному закону гаммы шифра на открытые данные. Гамма шифра - это псевдослучайная последовательность, выработанная по заданному алгоритму для зашифрования открытых данных и расшифрования зашифрованных данных.
Процесс зашифрования заключается в генерации гаммы шифра и наложении полученной гаммы на исходный открытый текст обратимым образом, например с использованием операции сложения по модулю 2.
Процесс расшифрования сводится к повторной генерации гаммы шифра и наложению этой гаммы на зашифрованные данные.
Разница между случайными и псевдослучайными последовательностями чисел в том, что последние получены с использованием некого алгоритма. А это означает наличие некоторой закономерности в появлении таких чисел.
Псевдослучайная последовательность (ПСП) — последовательность чисел, которая была вычислена по некоторому определённому арифметическому правилу, но имеет все свойства случайной последовательности чисел в рамках решаемой задачи.
Задание:
1. Используя алгоритм шифрования данных методом гаммирования с ПСП на основе линейного конгруэнтного датчика, написать программу шифрования и дешифрования произвольного набора символов на любом языке программирования.
-
Используя алгоритм шифрования данных методом гаммирования с ПСП на основе М-последовательности, написать программу шифрования и дешифрования произвольного набора символов на любом языке программирования.
Программа:
-
на основе линейного конгруэнтного датчика
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
namespace pr6
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
string alfavit = "абвгдежзийклмнопрстуфхцчшщъыьэюя ";
char[] fraza = textBox1.Text.ToCharArray();
int A, C, n, i, j, dl_frazy, alf;
n = Convert.ToInt32(textBox2.Text);
A = Convert.ToInt32(textBox3.Text);
C = Convert.ToInt32(textBox4.Text);
dl_frazy = textBox1.Text.Length;
alf = alfavit.Length;
int[] t = new int[dl_frazy];
string shifr = "";
if (A % 4 != 1)
label8.Text = "Amod 4!=1,введите другое А!";
else
{
if (C % 2 == 0)
label8.Text = "Введите нечетное С!";
else
{
for (i = 0; i < dl_frazy; i++)
for (j = 0; j < alf; j++)
if (alfavit[j] == fraza[i])
{
n = (A * t[i] + C) % 32;
fraza[i] = alfavit[(j + n) % alf];
break;
}
for (i = 0; i < dl_frazy; i++)
shifr += fraza[i];
textBox5.Text = shifr;
}
}
}
private void button2_Click(object sender, EventArgs e)
{
string alfavit = "абвгдежзийклмнопрстуфхцчшщъыьэюя ";
char[] shifr = textBox5.Text.ToCharArray();
int A, C, n, i, j, dl_shifra, alf;
n = Convert.ToInt32(textBox2.Text);
A = Convert.ToInt32(textBox3.Text);
C = Convert.ToInt32(textBox4.Text);
dl_shifra = textBox5.Text.Length;
alf = alfavit.Length;
int[] t = new int[dl_shifra];
string deshifr = "";
for (i = 0; i < dl_shifra; i++)
for (j = 0; j < alf; j++)
if (alfavit[j] == shifr[i])
{
n = (A * t[i] + C) % 32;
shifr[i] = alfavit[(33 + j - n) % alf];
break;
}
for (i = 0; i < dl_shifra; i++)
deshifr += shifr[i];
textBox6.Text = deshifr;
}
}
}
Результат:
-
на основе М-последовательности
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
namespace pr6
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
string fraza=textBox1.Text;
int key,dl_frazy,i;
dl_frazy = fraza.Length;
key = Convert.ToInt32(textBox4.Text);
char[] sh = new char[dl_frazy];
string shifr = "";
for (i = 0; i < dl_frazy; i++)
{
sh[i] = Convert.ToChar((fraza[i] + key - 33) % 255 + 33);
key = (key >> 1) ^ ((key & 1) ^ (((key >> 3) & 1) ^ ((key >> 5) & 1)) << 6);
}
for (i = 0; i < dl_frazy; i++)
shifr += Convert.ToString(sh[i]);
textBox2.Text = shifr;
}
private void button2_Click(object sender, EventArgs e)
{
string shifr = textBox2.Text;
int key, dl_shifra, i;
dl_shifra = shifr.Length;
key = Convert.ToInt32(textBox4.Text);
char[] desh = new char[dl_shifra];
string deshifr = "";
for (i = 0; i < dl_shifra; i++)
{
desh[i] = Convert.ToChar((shifr[i] - key + 222) % 255 + 33);
key = (key >> 1) ^ ((key & 1) ^ (((key >> 3) & 1) ^ ((key >> 5) & 1)) << 6);
}
for (i = 0; i < dl_shifra; i++)
deshifr += Convert.ToString(desh[i]);
textBox3.Text = deshifr;
}
}
}
Результат выполнения программы: