МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ
НАЦІОНАЛЬНИЙ УНІВЕРСИТЕТ «ЛЬВІВСЬКА ПОЛІТЕХНІКА»
Кафедра ЗІ
Лабороторна робота №1
з курсу «Методи і засоби криптологічних перетворень»
на тему: «Класичні методи шифрування. Шифр з автоключем»
Мета роботи: ознайомитися з класичними методами шифрування (шифр простої заміни, поліграмні, поліалфавітні шифри, шифрування блоками, шифри перестановки).
Завдання:
Написати програму на мові програмування С/С++ для реалізації методу шифрування/дешифрування відкритого тексту за допомогою шифру з автоключем (довжина ключа – 3).
Короткі теоретичні відомості
Шифр з автоключем відноситься до класу полі алфавітних шифрів і ґрунтується на ідеях Віженера і Кардано. Подібно до шифру Віженера, криптотекст отримують сумуванням відкритого тексту із послідовністю букв такої ж довжини. Проте цю послідовність записують дещо інакше, ніж у шифрі Віженера – спочатку записують ключ, а справа до нього дописують початковий відрізок самого відкритого тексту. Розглянемо це на прикладі:
БОРОНІТЬКОРОЛІВНУВІДВОРОГІВ
+ КЛЮЧБОРОНІТЬКОРОЛІВНУВІДВОР
ЛАОЇОЩЗЛЮЩЗЛЩЩТВДЙЙТХРЮУДЩТ
Відкритий текст і криптотекст у шифрі з автоключем записуються у одному і тому ж алфавіті. Для знаходження криптотексту зручно користуватися таблицею Віженера:
Шифр з автоключем також піддається криптоаналізу за методом Казізкі. За цим методом визначається довжина ключа, потім ключове слово знаходиться перебором. В основі крипто аналізу є те, що деякі слова в кожній мові єчасто вживані. Тому можна сподіватися, що відстань між ними у досить довгому тексті хоча б раз виявиться кратною періоду, а це приведе до появи однакових l-грам в крипто тексті, відстань між якими кратна довжині ключа.
На відміну від шифру простої заміни, при використанні шифру з автоключем, однаковим буквам у відкритому тексті можуть відповідати різні букви у криптотексті. Ця обставина безперечно ускладнює частотний аналіз.
Текст програми
#include<stdio.h>
#include<string.h>
#define M 100
#define K 3
void main(void) {
char alfavit[100] = { 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j',
'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't',
'u', 'v', 'w', 'x', 'y', 'z','a' };
char dwerelo[M],
kluch[K],
shyfr[M],
rozshyfr[M];
int cyftext[M],
cyfkluch[K],
avtocluch[M],
cyfshyfr[M],
cyfrozshyfr[M];
int i, j, t, k, a;
a = strlen(alfavit) - 1;
printf("\n\n\t vidkrytuy text \t"); scanf("%s", dwerelo);
t = strlen(dwerelo) - 1;
for (i=0; i<=t; i++)
{ for (j=0; j<=a; j++)
{ if (dwerelo[i] == alfavit[j]) cyftext[i] = j;
}
}
printf("\n\t kluch \t\t"); scanf("%s", kluch);
k = strlen(kluch) - 1;
for (i=0; i<=k; i++)
{ for (j=0; j<=a; j++)
{ if (kluch[i] == alfavit[j]) cyfkluch[i] = j;
}
}
for (i=0; i<=k; i++) avtocluch[i] = cyfkluch[i];
for (i=(k+1); i<=t; i++) avtocluch[i] = cyftext[i-(k+1)];
for (i=0; i<=t; i++)
{ cyfshyfr[i] = cyftext[i] + avtocluch[i];
if (cyfshyfr[i] > a) cyfshyfr[i] -= a;
}
printf("\n\n\t shyfrovanuy text \t");
for (i=0; i<=t; i++) printf("%c", alfavit[cyfshyfr[i]]);
for (i=0; i<=k; i++)
{ cyfrozshyfr[i] = cyfshyfr[i] - cyfkluch[i];
if ( cyfrozshyfr[i] < 0) cyfrozshyfr[i] += a;
}
for (i=(k+1); i<=t; i++)
{ cyfrozshyfr[i] = cyfshyfr[i] - cyfrozshyfr[i-(k+1)];
if (cyfrozshyfr[i] < 0) cyfrozshyfr[i] += a;
}
printf("\n\n\t rozshyfrovanuy text \t");
for (i=0; i<=t; i++) printf("%c", alfavit[cyfrozshyfr[i]]);
getch();
return;
}
Результат виконання програми
Блок-схема програми
-
+
-
+
-
+
+
Висновки: на даній лабораторній роботі я реалізувала класичний метод шифрування, а саме шифр з автоключем, перевагою такого шифру є простота реалізації, а недоліком-недостатня стійкість (хоча він є стійкіший у порівнянні, н-д, з шифром зсуву). Цей шифр піддається частотному аналізу, і останній буде більш ефективним, коли довжина тексту співвідносно з довжиною ключа є великою.