МІНІСТЕРСТВО ОСВІТИ ТА НАУКИ, МОЛОДІ ТА СПОРТУ УКРАЇНИ
НАЦІОНАЛЬНИЙ УНІВЕРСИТЕТ «ЛЬВІВСЬКА ПОЛІТЕХНІКА»
/
ЗВІТ
до лабораторної роботи №1
з курсу: «Криптографія і стеганографія»
Мета роботи: дослідити метод матричного обходу,виявити його переваги і недоліки і написати програму для за шифрування і розшифрування повідомлень даним методом
Короткі теоретичні відомості
Матричний шифр обходу.
Повідомлення записується рядками у вигляді прямокутної матриці. Криптотекст формується зчитуванням букв із матриці у зміненому порядку, а саме, стовпчиками.
При цьому послідовність, у якій зчитуються стовпчики, визначається ключем. Було поширеним задання ключа у вигляді ключового слова, що легко запам’ятовувалось. Порядок зчитування стовпчиків збігався з алфавітним порядком букв ключового слова.
«FXADFAXGVAGXXGGFXGADAVAVXGGFFFFFXGADDAADVXVXADFD».Нехай ключове слово є «GARDEN». Тепер застосуємо до отриманого текстуматричний шифр обходу:
4 1 6 2 3 5
G A R D E N
F X A D F A
X G V A G X
X G G F X G
A D A V A V
X G G F F F
F F X G A D
D A A D V X
V X A D F D
Тепер, зчитуючи стовпці отриманої матриці відповідно зі старшинством букв ключового слова і розбиваючи текст на блоки, отримуємо остаточно шифротекст:«XGGDG FAXDA FVFGD DFGXA FAVFF XXAXF DVAXG VFDXD AVGAG XAA».
Алгоритм методу
Код програми
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;
namespace Lab1__AutoKey_
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void openToolStripMenuItem_Click(object sender, EventArgs e)
{
try
{
FileStream fs = null;
OpenFileDialog ofd = new OpenFileDialog();
ofd.InitialDirectory = "c:\\";
ofd.Filter = "txt (*.txt)|*.txt|All files (*.*)|*.*";
ofd.FilterIndex = 1;
ofd.RestoreDirectory = true;
if (ofd.ShowDialog() == DialogResult.OK)
{
try
{
fs = new FileStream(ofd.FileName, FileMode.Open);
}
catch (FileNotFoundException ex)
{
MessageBox.Show(ex.Message, "Error!", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
fs.Close();
textBox_input.Text = File.ReadAllText(ofd.FileName, Encoding.ASCII);
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
private void exitToolStripMenuItem_Click(object sender, EventArgs e)
{
Application.Exit();
}
private void encryptToolStripMenuItem_Click(object sender, EventArgs e)
{
int row, column;
string text = textBox_input.Text;
string open_txt = text.Replace(" ", "");
char[] open_txt_chars = open_txt.ToCharArray();
text = textBox_key.Text;
char[] key = text.ToCharArray();
char[] sorted_key = new char[key.Length];
Array.Copy(key, sorted_key, key.Length);
Array.Sort(sorted_key);
if ((row = open_txt_chars.Length / key.Length) != 0)
row++;
column = key.Length;
char[,] all_text = new char[row, column];
char[] encr_chars = new char[row*column];
int k = 0;
for (int i = 0; i < row; i++)
{
for (int j = 0; j < column; j++)
{
if (k >= open_txt_chars.Length)
all_text[i, j] = ' ';
else
{
all_text[i, j] = open_txt_chars[k];
}
k++;
}
}
int indx;
k=0;
for (int j = 0; j < column; j++)
{
indx = Array.IndexOf(key, sorted_key[j]);
for (int i = 0; i < row; i++)
{
encr_chars[k] = all_text[i, indx];
k++;
}
}
text = new string(encr_chars);
textBox_output.Text = text;
}
private void decryptToolStripMenuItem_Click(object sender, EventArgs e)
{
int row, column, k;
string text = textBox_input.Text;
char[] encr_txt_chars = text.ToCharArray();
text = textBox_key.Text;
char[] key = text.ToCharArray();
char[] sorted_key = new char[key.Length];
Array.Copy(key, sorted_key, key.Length);
Array.Sort(sorted_key);
row = encr_txt_chars.Length / key.Length;
column = key.Length;
char[,] all_text = new char[row, column];
char[] decr_chars = new char[row * column];
int indx;
k = 0;
for (int j = 0; j < column; j++)
{
indx = Array.IndexOf(key, sorted_key[j]);
for (int i = 0; i < row; i++)
{
all_text[i, indx]= encr_txt_chars[k] ;
k++;
}
}
k = 0;
for (int i = 0; i < row; i++)
{
for (int j = 0; j < column; j++)
{
decr_chars[k] = all_text[i, j];
k++;
}
}
text = new string(decr_chars);
text = text.TrimEnd();
textBox_output.Text = text;
}
private void saveOutputToolStripMenuItem_Click(object sender, EventArgs e)
{
try
{
SaveFileDialog saveFileDialog1 = new SaveFileDialog();
saveFileDialog1.Filter = "txt files (*.txt)|*.txt|All files (*.*)|*.*";
saveFileDialog1.FilterIndex = 1;
saveFileDialog1.RestoreDirectory = true;
if (saveFileDialog1.ShowDialog() == DialogResult.OK)
{
StreamWriter myStream = new StreamWriter(saveFileDialog1.FileName, false, Encoding.ASCII);
myStream.Write(textBox_output.Text);
myStream.Close();
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
private void cleanAllFieldsToolStripMenuItem_Click(object sender, EventArgs e)
{
textBox_input.Text = "";
textBox_key.Text = "";
textBox_output.Text = "";
}
private void Form1_Load(object sender, EventArgs e)
{
}
}
}
Результати роботи програми
/ /
Висновок: Метод матричного обходу для зашифрування повідомлень є нескладним для програмної реалізації. Недоліком методу є те, що його можна легко взламати методом перебору, тільки це може зайняти багато часу, якщо довжина повідомлення значно перевищує довжину ключа.