МІНІСТЕРСТВО ОСВІТИ ТА НАУКИ, МОЛОДІ ТА СПОРТУ УКРАЇНИ
НАЦІОНАЛЬНИЙ УНІВЕРСИТЕТ «ЛЬВІВСЬКА ПОЛІТЕХНІКА»
/
ЗВІТ
до лабораторної роботи №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++)
{
...