МІНІСТЕРСТВО ОСВІТИ І НАУКИ, МОЛОДІ ТА СПОРТУ УКРАЇНИ
НАЦІОНАЛЬНИЙ УНІВЕРСИТЕТ «ЛЬВІВСЬКА ПОЛІТЕХНІКА»
ІКТА
кафедра БІТ
З В І Т
до лабораторної роботи №1
з курсу: «КРИПТОГРАФІЧНІ СИСТЕМИ ТА ПРОТОКОЛИ»
на тему: «ДОСЛІДЖЕННЯ ШИФРІВ ПІДСТАНОВКИ»
Мета роботи - вивчити основні характеристики шифрів підстановки і навчитися розробляти програмне забезпечення для реалізації алгоритмів шифрування з використанням шифрів підстановки на комп’ютері.
1. Завдання
1.1. Домашня підготовка до роботи
1) Вивчити основні алгоритми шифрування, що використовують моноалфавітні та поліалфавітні підстановки.
2) Скласти блок-схеми алгоритмів та програму для реалізації шифру Плейфера.
3) Скласти блок-схеми алгоритмів та програму для реалізації зашифрування та розшифрування відкритого тексту величиною приблизно два аркуші формату А4 за допомогою шифру з автоключем і багатоконтурної системи Віженера з періодом n=5. Забезпечити введення ключа шифрування з клавіатури.
1.2. Робота в лабораторії
1) Ввести в комп'ютер програми згідно із завданням.
2) Відлагодити програми. При необхідності скоригувати блок-схеми алгоритмів та програми у відповідності з виявленими логічними та синтаксичними помилками.
3) Остаточні версії блок-схем, програм та отримані результати оформити у звіті з лабораторної роботи.
4) Здати звіт з лабораторної роботи.
2. Блок-схеми алгоритму програми
2.1. Шифр Плейфера
Метод main Метод Clean_Key
Метод Make_Resh Метод Print_Resh
Метод encrypt
Метод decrypt
2.1. Шифр Віженера
Функція main Функція upper Функція enciper
3. Текст програми
Шифр Плейфера
using System;
namespace ConsoleApplication1
{
class Program
{
static string Al = "ABCDEFGHIJKLMNOPQRSTUVWXYZАБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯabcdefghijklmnopqrstuvwxyzабвгдеёжзийклмнопрстуфхцчшщъыьэюя !@\"#№$;%^:&?*()-_+={}[]\\/<>.,~`0123456789";
static string MyText = "";
static string Key = "";
static string R = "";
static string ResText = "";
static char[,] Resh = new char[10, 16];
static string str = "";
static int x = 0;
static void Main(string[] args)
{
Console.WriteLine("Введите ключевое слово");
Key = Console.ReadLine();
Clean_Key();
Make_Resh();
Print_Resh();
Console.WriteLine("Введите текст для шифрования");
MyText = Console.ReadLine();
encrypt();
Console.WriteLine("\nзашифрованное\n{0}", ResText);
decrypt();
Console.WriteLine("\nрасшифрованное\n{0}", MyText);
Console.ReadKey();
}
static void Clean_Key()
{
x = 0;
do
{
if (Key[x] != (char)1)
Key = Key.Substring(0, x + 1) + Key.Substring(x + 1, Key.Length - x - 1).Replace(Key[x], (char)1);
x++;
} while (x != Key.Length);
str = "";
x = 0;
do
{
if (Key[x] != (char)1)
str += Key[x];
x++;
} while (x != Key.Length);
Key = str;
}
static void Make_Resh()
{
R = Key + Al;
for (int i = 0; i < Key.Length; i++)
R = R.Substring(0, i + 1) + R.Substring(i + 1, R.Length - i - 1).Replace(R[i], (char)1);
str = "";
x = 0;
do
{
if (R[x] != (char)1)
str += R[x];
x++;
} while (x != R.Length);
R = str;
int num = 0;
for (int i = 0; i < 10; i++)
for (int j = 0; j < 16; j++)
{
Resh[i, j] = R[num];
num++;
}
}
static void Print_Resh()
{
Console.WriteLine("\nПолучившееся решетка");
for (int i = 0; i < 10; i++)
{
for (int j = 0; j < 16; j++)
Console.Write("{0} ", Resh[i, j]);
Console.WriteLine();
}
Console.WriteLine();
}
//****************************************************************************//
//* Функція шифрування *//
static void encrypt()
{
int i = 0;
int j = 0;
int[] pos1 = new int[2];
int[] pos2 = new int[2];
for (int k = 0; k < MyText.Length - 1; k = k + 2)
if (MyText[k] == MyText[k + 1] /*&& MyText[k + 1] != 'й'*/)
MyText = MyText.Insert(k + 1, "й");
//перевірка
if (MyText.Length % 2 != 0)
MyText += " ";
Console.WriteLine("тест {0}", MyText);
for (int k = 0; k < MyText.Length - 1; k = k + 2)
{
for (i = 0; i < 10; i++)
{
for (j = 0; j < 16; j++)
{
if (Resh[i, j] == MyText[k]) { pos1[0] = i; pos1[1] = j; }
if (Resh[i, j] == MyText[k + 1]) { pos2[0] = i; pos2[1] = j; }
}
}
if (pos1[0] == pos2[0])
{
if (pos1[1] < pos2[1])
ResText = ResText + Resh[pos1[0], (pos1[1] + 1) % 16] + Resh[pos2[0], (pos2[1] + 1) % 16];
else if (pos1[1] > pos2[1])
ResText = ResText + Resh[pos2[0], (pos1[1] + 1) % 16] + Resh[pos2[0], (pos2[1] + 1) % 16];
}
else if (pos1[1] == pos2[1])
{
if (pos1[0] < pos2[0])
ResText = ResText + Resh[(pos1[0] + 1) % 10, pos2[1]] + Resh[(pos2[0] + 1) % 10, pos2[1]];
else if (pos1[0] > pos2[0])
ResText = ResText + Resh[(pos1[0] + 1) % 10, pos1[1]] + Resh[(pos2[0] + 1) % 10, pos1[1]];
}
else
{
ResText = ResText + Resh[pos1[0], pos2[1]] + Resh[pos2[0], pos1[1]];
}
}
}
//****************************************************************************//
//* Функція розшифровки *//
//****************************************************************************//
static void decrypt()
{
MyText = "";
int i = 0;
int j = 0;
int[] pos1 = new int[2];
int[] pos2 = new int[2];
for (int k = 0; k < ResText.Length - 1; k += 2)
{
for (i = 0; i < 10; i++)
{
for (j = 0; j < 16; j++)
{
if (Resh[i, j] == ResText[k]) { pos1[0] = i; pos1[1] = j; }
if (Resh[i, j] == ResText[k + 1]) { pos2[0] = i; pos2[1] = j; }
}
}
if (pos1[0] == pos2[0])
{
if (pos1[1] < pos2[1])
MyText = MyText + Resh[pos1[0], (pos1[1] + 15) % 16] + Resh[pos2[0], (pos2[1] + 15) % 16];
else if (pos1[1] > pos2[1])
MyText = MyText + Resh[pos2[0], (pos1[1] + 15) % 16] + Resh[pos2[0], (pos2[1] + 15) % 16];
}
else if (pos1[1] == pos2[1])
{
if (pos1[0] < pos2[0])
MyText = MyText + Resh[(pos1[0] + 9) % 10, pos2[1]] + Resh[(pos2[0] + 9) % 10, pos2[1]];
else if (pos1[0] > pos2[0])
MyText = MyText + Resh[(pos1[0] + 9) % 10, pos1[1]] + Resh[(pos2[0] + 9) % 10, pos1[1]];
}
else
MyText = MyText + Resh[pos1[0], pos2[1]] + Resh[pos2[0], pos1[1]];
}
for (int k = 1; k < MyText.Length - 1; k++)
if (MyText[k - 1] == MyText[k + 1] && MyText[k] == 'й')
MyText = MyText.Remove(k, 1);
if (MyText[MyText.Length - 1] == ' ')
MyText = MyText.Substring(0, MyText.Length - 1);
}
}
}
Шифр Віженера
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <conio.h>
void upper_case(char *src)
{
while (*src != '\0') {
if (islower(*src)) *src &= ~0x20;
src++;
}
}
char* encipher(const char *src, char *key, int is_encode)
{
int i, klen, slen;
char *dest;
dest = strdup(src);
upper_case(dest);
upper_case(key);
/* strip out non-letters */
for (i = 0, slen = 0; dest[slen] != '\0'; slen++)
if (isupper(dest[slen]))
dest[i++] = dest[slen];
dest[slen = i] = '\0';
klen = strlen(key);
for (i = 0; i < slen; i++) {
if (!isupper(dest[i])) continue;
dest[i] = 'A' + (is_encode
? dest[i] - 'A' + key[i % klen] - 'A'
: dest[i] - key[i % klen] + 26) % 26;
}
return dest;
getch();
}
int main()
{
const char *str = "politeh ";
const char *cod, *dec;
char key[] = "VIGENERECIPHER";
printf("Text: %s\n", str);
printf("key: %s\n", key);
cod = encipher(str, key, 1); printf("Code: %s\n", cod);
dec = encipher(cod, key, 0); printf("Back: %s\n", dec);
/* free(dec); free(cod); */ /* nah */
getch();
return 0;
}
4. Результати роботи програм
Шифр Плейфера
Шифр Віженера