МІНІСТЕРСТВО ОСВІТИ ТА НАУКИ, МОЛОДІ ТА СПОРТУ УКРАЇНИ
НАЦІОНАЛЬНИЙ УНІВЕРСИТЕТ «ЛЬВІВСЬКА ПОЛІТЕХНІКА»
/
ЗВІТ
до лабораторної роботи №2
з курсу: «Криптографія і стеганографія»
Мета роботи: дослідити метод матричного обходу,виявити його переваги і недоліки і написати програму для за шифрування і розшифрування повідомлень даним методом
Короткі теоретичні відомості
Лінійний шифр третього порядку
Ключ: а таке, що 0 < а < п і НСД (а, п) = 1.
Шифрування. У повідомленні кожна буква х заміщується буквою Е{х) = (ах) mod n.
Дешифрування. У криптотексті кожна буква х' заміщується буквою D(x') = (a'x') mod п, де а' — a-1 mod n — дешифруючий ключ.
Ключовий простір для лінійного шифру k-го порядку збігається з безліччю оборотних матриць k-го порядку над Z. Ця кількість оцінюється значенням узагальненої функції Ейлера:
,
де
Блок – схема
Код програми
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.IO;
namespace WindowsFormsApplication4
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
int[, ,] statM = new int[3, 3, 3];
int[, ,] MatrixMul;
int[, ,] bla;
int global_size2;
int global_size;
bool global_bool;
private void Form1_Load(object sender, EventArgs e)
{
}
private void button1_Click(object sender, EventArgs e)
{
int size = textBox5.Text.Length;
global_size2 = size;
char[] line = textBox5.Text.ToCharArray();
int num_rows;
bool divide = false;
if (size % 2 == 0) num_rows = size / 2;
else { num_rows = size / 2 + 1; divide = true; }
bla = new int[3, 3, num_rows];
int [, ,] text = new int[3, 3, num_rows];
global_size = num_rows;
global_bool = divide;
//To matrix
int k = 0;
for (int j = 0; j < num_rows; j++)
{
for (int i = 0; i < 3; i++)
{
for (int l = 0; l < 3; l++)
{
if (divide == true && k == size)
break;
text[l, i, j] = Convert.ToInt32(line[k]) - 1039;
k++;
}
}
}
//multiplie
statM[0, 0, 0] = Convert.ToInt32(textBox1.Text);
statM[0, 0, 1] = Convert.ToInt32(textBox2.Text);
statM[0, 1, 0] = Convert.ToInt32(textBox3.Text);
statM[0, 1, 1] = Convert.ToInt32(textBox4.Text);
statM[1, 0, 0] = Convert.ToInt32(textBox6.Text);
statM[1, 0, 1] = Convert.ToInt32(textBox7.Text);
statM[1, 1, 0] = Convert.ToInt32(textBox8.Text);
statM[1, 1, 1] = Convert.ToInt32(textBox9.Text);
statM[0, 0, 2] = Convert.ToInt32(textBox10.Text);
MatrixMul = mulMatrix(statM, text);
//to text;
k = 0;
for (int j = 0; j < num_rows; j++)
{
for (int i = 0; i < 3; i++)
{
for (int l = 0; l < 3; l++)
{
if (divide == true && k == size)
{
break;
}
line[k] = Convert.ToChar(MatrixMul[l, i, j]+1039);
k++;
}
}
}
string f = new string (line);
label1.ResetText();
label1.Text = f;
//label1.Text = Convert.ToString(num_rows);
}
private int[, ,] mulMatrix(int[, ,] a, int[, ,] b)
{
int[, ,] r = new int[3, 3, global_size];
for (int i = 0; i < 3; i++)
{
for (int j = 0; j < global_size; j++)
{
for (int k = 0; k < 3; k++)
{
for (int l = 0; l < 3; l++)
{
r[l, i, j] += a[l, i, k] * b[l, k, j];
}
}
}
}
for (int i = 0; i < 3; i++)
{
for (int j = 0; j < global_size; j++)
{
for (int l = 0; l < 3; l++)
{
bla[i, l, j] = r[l, i, j] / 33;
r[l, i, j] = r[l, i, j] % 33;
}
}
}
return r;
}
//reverse function
private double[, ,] mulMatrix(double[, ,] a, int[, ,] b)
{
double[, ,] r = new double[3, 3, global_size];
for (int i = 0; i < 3; i++)
{
for (int j = 0; j < global_size; j++)
{
for (int k = 0; k < 3; k++)
{
for (int l = 0; l < 3; l++)
{
r[l, i, j] += a[l, i, k] * b[l, k, j];
}
}
}
}
for (int i = 0; i < 3; i++)
{
for (int j = 0; j < global_size; j++)
{
for (int l = 0; l < 3; l++)
{
r[l, i, j] = r[l, i, j] % 33;
}
}
}
return r;
}
private void button2_Click(object sender, EventArgs e)
{
int a = ((statM[0, 0, 0] * statM[1, 0, 0] * statM[0, 0, 2])+(statM[0, 0, 1] * statM[1, 0, 1] * statM[1, 1, 0])+(statM[0, 1, 0]*statM[0, 1, 1]*statM[1, 1, 1]));
int b = ((statM[0, 1, 0]*statM[1, 0, 0]*statM[1, 1, 0])+(statM[0, 0, 0]*statM[1, 0, 1]*statM[1, 1, 1])+(statM[0, 0, 1]*statM[0, 1, 1]*statM[0, 0, 2]));
a = a - b;
double zzz = 1.0 / a;
double[, ,] temp = new double[3, 3, 3];
temp[0, 0, 0] = Convert.ToDouble(statM[0, 0, 2]);
temp[0, 0, 1] = -(Convert.ToDouble(statM[0, 0, 1]));
temp[0, 1, 0] = -(Convert.ToDouble(statM[1, 1, 0]));
temp[0, 1, 1] = -(Convert.ToDouble(statM[0, 1, 1]));
temp[1, 0, 0] = Convert.ToDouble(statM[1, 0, 0]);
temp[1, 0, 1] = -(Convert.ToDouble(statM[1, 0, 1]));
temp[1, 1, 0] = -(Convert.ToDouble(statM[0, 1, 0]));
temp[1, 1, 1] = -(Convert.ToDouble(statM[1, 1, 1]));
temp[0, 0, 2] = Convert.ToDouble(statM[0, 0, 0]);
temp[0, 0, 0] *= zzz;
temp[0, 0, 1] *= zzz;
temp[0, 1, 0] *= zzz;
temp[0, 1, 1] *= zzz;
temp[1, 0, 0] *= zzz;
temp[1, 0, 1] *= zzz;
temp[1, 1, 0] *= zzz;
temp[1, 1, 1] *= zzz;
temp[0, 0, 2] *= zzz;
for (int i = 0; i < 3; i++)
{
for (int j = 0; j < global_size; j++)
{
for (int l = 0; l < 3; l++)
{
MatrixMul[l, i, j] = MatrixMul[l, i, j] + bla[l, i, j] * 33;
}
}
}
double[, ,] getb = mulMatrix(temp, MatrixMul);
int k = 0;
char[] zu = new char[global_size2];
for (int j = 0; j < global_size; j++)
{
for (int i = 0; i < 3; i++)
{
for (int l = 0; l < 3; l++)
{
if (global_bool == true && k == global_size2)
break;
zu[k] = Convert.ToChar((Convert.ToInt32(getb[l, i, j]))+1039);
k++;
}
}
}
string f = new string(zu);
f = textBox5.Text;
label2.ResetText();
label2.Text = f;
}
}
}
Результати роботи програми
/
Висновок: Лінійний шифр третього порядку є більш стійкий до розшифрування крипто аналітиками, це пояснюється способом його утворення, але все одно він піддається частотному аналізу.