Скачиваний:
49
Добавлен:
24.07.2019
Размер:
98.82 Кб
Скачать

Практическая работа № 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);

}

}

}

}

Результат работы программы: