Практические работы Часть 2 / Практическая работа 8 / пр8
.docПрактическая работа № 8
Шифрование данных методом замены в симметричных криптосистемах. Криптосистема Хилла
Ход работы
Задание 1. Используя алгоритм шифрования данных по криптосистеме Хилла, написать программу шифрования и дешифрования произвольного набора символов.
Листинг 1:
using System;
using System.Windows.Forms;
namespace Хилл {
public partial class Form1 : Form {
private Random rnd = new Random();
private const int SizeMartix = 2;
private int[,] matrica = new int[SizeMartix, SizeMartix];
private int[,] obr_matr = new int[SizeMartix, SizeMartix];
private string alfavit = "абвгдежзийклмнопрстуфхцчшщъыьэюя ";
private int dl_alf;
public Form1() {
InitializeComponent();
dl_alf = alfavit.Length;
}
//формирование матрицы
private void button1_Click(object sender, EventArgs e) {
richTextBox1.Text = "";
int opr = 0;
while (opr != 1) {
for (int i = 0; i < SizeMartix; i++)
for (int j = 0; j < SizeMartix; j++) matrica[i, j] = rnd.Next(10);
opr = matrica[0, 0] * matrica[1, 1] - matrica[0, 1] * matrica[1, 0];
}
for (int i = 0; i < SizeMartix; i++) {
for (int j = 0; j < SizeMartix; j++) richTextBox1.Text += matrica[i, j] + " ";
richTextBox1.Text += "\n";
}
//Обратная матрица
for (int i = 0; i < SizeMartix; i++) {
for (int j = 0; j < SizeMartix; j++) {
obr_matr[j, i] = Convert.ToInt32(Math.Pow(-1, (i + j)) * matrica[(1 - i), (1 - j)]);
}
}
richTextBox1.Text += "Обратная матрица \r\n";
for (int i = 0; i < SizeMartix; i++) {
for (int j = 0; j < SizeMartix; j++) richTextBox1.Text += obr_matr[i, j] + " ";
richTextBox1.Text += "\n";
}
}
//шифрование
private void button2_Click(object sender, EventArgs e) {
if (textBox1.Text.Length % SizeMartix != 0) textBox1.Text += " ";
string fraza = textBox1.Text;
int dl_frazy = fraza.Length;
int sum = 0;
int[] index = new int[dl_frazy];
int[] ind_shifr = new int[dl_frazy];
string shifr = "";
for (int i = 0; i < dl_frazy; i++) {
for (int j = 0; j < dl_alf; j++) {
if (String.Compare(Convert.ToString(fraza[i]), Convert.ToString(alfavit[j])) == 0)
index[i] = j;
}
}
for (int t = 0; t < dl_frazy; t += SizeMartix) {
for (int i = 0; i < SizeMartix; i++) {
sum = 0;
for (int j = 0; j < SizeMartix; j++)
sum += index[t + j] * matrica[i, j];
ind_shifr[t + i] = sum % dl_alf;
}
}
for (int i = 0; i < dl_frazy; i++) shifr += alfavit[ind_shifr[i]];
textBox3.Text = shifr;
}
//Дешифрование
private void button3_Click(object sender, EventArgs e) {
string shifr = textBox3.Text;
int dl_shifra = shifr.Length;
if (dl_shifra % SizeMartix != 0) shifr += " ";
int sum = 0;
int[] index = new int[dl_shifra];
int[] ind_deshifr = new int[dl_shifra];
string deshifr = "";
for (int i = 0; i < dl_shifra; i++) {
for (int j = 0; j < dl_alf; j++) {
if (String.Compare(Convert.ToString(shifr[i]),
Convert.ToString(alfavit[j])) == 0) index[i] = j;
}
}
for (int t = 0; t < dl_shifra; t += SizeMartix)
for (int i = 0; i < SizeMartix; i++) {
sum = 0;
for (int j = 0; j < SizeMartix; j++) sum += index[t + j] * obr_matr[i, j];
ind_deshifr[t + i] = sum % dl_alf;
if (ind_deshifr[t + i] < 0) ind_deshifr[t + i] += dl_alf;
}
for (int i = 0; i < dl_shifra; i++) deshifr += alfavit[ind_deshifr[i]];
textBox4.Text = deshifr;
}
}
}
Результат работы программы:
Задание 2. Используя алгоритм шифрования данных по системе Шеннона Фано, написать программу шифрования набора символов.
Листинг 2:
using System;
using System.Collections.Generic;
namespace ШеннонаФано1 {
class Program {
static void Main(string[] args) {
ШеннонаФано ob = new ШеннонаФано();
ob.Sort();
ob.Fano(0, 32);
for (int i = 0; i < 33; i++) Console.WriteLine(ob.Alphabit[i] + " " + ob.Res[i]);
Console.ReadKey();
}
}
public class ШеннонаФано {
public List<char> Alphabit = new List<char>() {
'а','б','в','г', 'д', 'е', 'ё', 'ж', 'з', 'и', 'й',
'к', 'л', 'м', 'н', 'о', 'п', 'р', 'с', 'т', 'у', 'ф',
'х', 'ц', 'ч', 'ш', 'щ', 'ъ', 'ы', 'ь', 'э', 'ю', 'я'
};
private List<double> p1 = new List<double>() {
0.062, 0.014, 0.038, 0.013, 0.025, 0.072, 0.072,
0.007, 0.016, 0.062, 0.010, 0.028, 0.035, 0.026, 0.053,
0.090, 0.023, 0.040, 0.045, 0.053, 0.021, 0.002, 0.009,
0.004, 0.012, 0.006, 0.003, 0.014, 0.003, 0.014, 0.003, 0.006, 0.018
};
private double schet1 = 0;
private double schet2 = 0;
public string[] Res = new string[33];
public void Sort() {
int count = p1.Count;
for (int i = 0; i < count; i++) {
for (int j = 0; j < count - i - 1; j++) {
if (p1[j] < p1[j + 1]) {
char temp2;
double temp1 = 0;
temp1 = p1[j];
temp2 = Alphabit[j];
p1[j] = p1[j + 1];
Alphabit[j] = Alphabit[j + 1];
p1[j + 1] = temp1;
Alphabit[j + 1] = temp2;
}
}
}
}
public int Delenie_Posledovatelnosty(int L, int R) {
int m;
schet1 = 0;
for (int i = L; i <= R - 1; i++) schet1 = schet1 + p1[i];
schet2 = p1[R];
m = R;
while (schet1 >= schet2) {
m = m - 1;
schet1 = schet1 - p1[m];
schet2 = schet2 + p1[m];
}
return m;
}
public void Fano(int L, int R) {
int n;
if (L < R) {
n = Delenie_Posledovatelnosty(L, R);
Console.WriteLine(n);
for (int i = L; i <= R; i++) {
if (i <= n) Res[i] += Convert.ToByte(0);
else Res[i] += Convert.ToByte(1);
}
Fano1(L, n);
Fano(n + 1, R);
}
}
public void Fano1(int L, int R) {
int n;
if (L < R) {
n = Delenie_Posledovatelnosty(L, R);
Console.WriteLine(n);
for (int i = L; i <= R; i++) {
if (i <= n) Res[i] += Convert.ToByte(0);
else Res[i] += Convert.ToByte(1);
}
Fano(L, n);
Fano1(n + 1, R);
}
}
}
}
Результат работы программы: