- •«Московский технический университет связи и информатики»
- •«Цифровая экономика и массовые коммуникации»
- •«Цифровая экономика, цправление и бизнес‑технологии (цэУиБт)»
- •Введение
- •Изучение понятийного аппарта криптографии основные задачи криптографии
- •Конфиденциальность
- •Целостность
- •Аутентификация
- •Цифровая подпись
- •Глоссарий основных понятий
- •Описание алгебраической модели шифра
- •Классификация шифров
- •Исследование шифра простой замены модель шифра простой замены
- •Описание процесса поиска для данного закрытого текста, зашифрованного методом простой замены, соответствующего открытого текста
- •Исследование шифра виженера описание процедуры зашифрования и расшифрования на конкретных текстах
- •Программная реализация шифра виженера
- •Описание процесса поиска для данного закрытого текста соответствующего ему открытого текста
- •Заключение
- •Список использованных источников
- •Приложения
- •Москва 2024
Заключение
В данном отчёте рассмотрены основные понятия криптографии, её задачи, изучены некоторые виды шифров, а также более подробно исследованы шифр простой замены и шифр Виженера.
При работе с текстом, зашифрованным простой заменой, основной трудностью стал поиск ключа. Нахождение наиболее читабельных участков текста, подбор подходящих букв заняли большую часть времени расшифровки.
При работе с текстом, зашифрованным с помощью шифра Виженера, для начала нужно ознакомиться с методами, с помощью которых можно расшифровываться текст, ознакомиться с наиболее понятным и только затем приступить к работе. В отличие от работы с шифром простой замены, здесь больше всего времени заняла программная реализация шифра Виженера.
Программная реализация, с помощью которой расшифровывались выданные закрытые тексты, в некоторых местах требует доработки. Не исключено, что есть более лёгкие способы реализации приведённых выше алгоритмов, а также то, что некоторые алгоритмы можно упростить или объединить, но поставленную задачу они выполняют.
Шифр Виженера был популярен в XIX и XX веке. Сейчас он редко используется из-за своей ненадёжности. Для технологий XXI века этот шифр достаточно прост. Но стал базой для некоторых других более надёжных шифров, например, шифр Гронсфилда. Из-за этого, шифр Виженера является отличным пособием для начинающих осваивать криптоанализ. Поэтому останавливаться на изучении шифра простой замены и шифра Виженера не стоит, очень полезно в дальнейшем будет изучение более стойких шифров.
В последние десятилетия в криптографии стали появляться шифры, стойкость которых обосновывается сложностью решения чисто математических задач: разложения больших чисел на множители, решения показательных сравнений в целых числах и других. Стойкость шифров зависит также и от качества генераторов случайных чисел, порождающих ключи. Криптография является богатым источником трудных математических задач, а математика — одной из основ криптографии.
Список использованных источников
Основы криптографии Учебное пособие - Алферов А.П., Зубов А.Ю., Кузьмин А.С., Черемушкин А.В., 2002.
Криптографические методы защиты информации - А. Б. Лось, А. Ю. Нестеренко, М. И. Рожков. — 2-е изд., испр., 2019.
Сведения о частоте встречаемости букв в русском языке - http://dict.ruslang.ru/freq.php
Сведения о частоте встречаемости букв в русском языке -https://dpva.ru/Guide/GuideUnitsAlphabets/Alphabets/FrequencyRuLetters/
Приложения
Листинг 1.1 – Подсчёт букв
Язык программирования – C;
Используемый компилятор – C-Free 5;
Требования к входным данным - буквы русского алфавита;
Формат выходных данных - символ;
#include <stdio.h>
#include <locale.h>
#include <Windows.h>
int main()
{
setlocale(LC_ALL, "Rus");
SetConsoleCP(1251);
SetConsoleOutputCP(1251);
int i, a;
a=0;
char sym, num;
FILE *fp;
fp = fopen("file.txt", "r");
printf("Введите искомый символ: ");
scanf("%c", &sym);
while (!feof(fp))
{
num = fgetc(fp);
if (sym == num)
a++;
}
printf("Количество в тексте: %d\n", a);
fclose(fp);
return 0;
}
Листинг 1.2 – Замена букв
Язык программирования – C;
Используемый компилятор – C-Free 5;
Требования к входным данным - буквы русского алфавита;
Формат выходных данных - символ;
#include <stdio.h>
#include <locale.h>
#include <Windows.h>
int main()
{
setlocale(LC_ALL, "Rus");
SetConsoleCP(1251);
SetConsoleOutputCP(1251);
char alf, a, b;
FILE *fp, *fl;
fp=fopen("file_1.txt", "r");
fl = fopen("file_2.txt", "w");
printf("Введите символы, которые хотите поменять местами: ");
scanf("%c %c", &a, &b);
while(!feof(fp))
{
alf=fgetc(fp);
if(alf==a)
fprintf(fl, "%c", b);
else if(alf==b)
fprintf(fl, "%c", a);
else
fprintf(fl, "%c", alf);
}
fclose(fp);
fclose(fl);
return 0;
}
Листинг 2.1 – Редактор текста
Язык программирования – C;
Используемый компилятор – C-Free 5;
Требования к входным данным - нет;
Формат выходных данных - строка;
#include <stdio.h>
#include <Windows.h>
#include <locale.h>
int main()
{
setlocale(LC_ALL, "Rus");
SetConsoleCP(1251);
SetConsoleOutputCP(1251);
char in[256], out[256];
char alf[] = {'а', 'б', 'в', 'г', 'д', 'е', 'ё', 'ж', 'з', 'и', 'й', 'к', 'л', 'м', 'н', 'о', 'п', 'р', 'с', 'т', 'у', 'ф', 'х', 'ц', 'ч', 'ш', 'щ', 'ъ', 'ы', 'ь', 'э', 'ю', 'я'};
char Alf[] = {'А', 'Б', 'В', 'Г', 'Д', 'Е', 'Ё', 'Ж', 'З', 'И', 'Й', 'К', 'Л', 'М', 'Н', 'О', 'П', 'Р', 'С', 'Т', 'У', 'Ф', 'Х', 'Ц', 'Ч', 'Ш', 'Щ', 'Ъ', 'Ы', 'Ь', 'Э', 'Ю', 'Я'};
char mark[] = {',', '.', '"', '?', '!', '-', '(', ')', ';', ':', '…', '«', '»'};
int i, j, n;
printf("Введите текст: ");
fgets(in, 256, stdin);
for(i=0;i<256;i++)
{
for(j=0;j<33;j++)
{
if(in[i]==Alf[j])
in[i]=alf[j];
}
}
for(i=0;i<256;i++)
{
for(j=0;j<13;j++)
{
if(in[i]==mark[j])
in[i]=' ';
}
}
for(i=0, n=0;i<256;i++, n++)
{
if(in[i]==' ')
n--;
else
out[n]=in[i];
}
printf("%s\n", out);
return 0;
}
Листинг 2.2 – Шифратор Виженера
Язык программирования – C;
Используемый компилятор – C-Free 5;
Требования к входным данным - буквы русского алфавита;
Формат выходных данных - строка;
#include <stdio.h>
#include <Windows.h>
#include <locale.h>
#include <stdlib.h>
#include <string.h>
void code(int size_text, int size_key, char alf[], char text[], int numt[], int numk[])
{
int ind, key_ind, f, code_num;
char code[256];
for(ind=0, key_ind=0, f=0; ind<size_text; ind++, key_ind++, f++)
{
if (key_ind == size_key)
key_ind=0;
if(text[ind]>=alf[0] && text[ind]<=alf[32])
{
code_num = (numt[f]+numk[key_ind])%33;
code[ind] = alf[code_num];
}
else
{
code[ind]=text[ind];
key_ind--;
f--;
}
}
code[size_text]='\0';
printf("Encrypted record: %s\n", code);
}
void decode(int size_text, int size_key, char alf[], char text[], int numt[], int numk[])
{
int ind, key_ind, f, decode_num;
char decode[256];
for(ind=0, key_ind=0, f=0; ind<size_text; ind++, key_ind++, f++)
{
if (key_ind == size_key)
key_ind=0;
if(text[ind]>=alf[0] && text[ind]<=alf[32])
{
decode_num = (numt[f]-numk[key_ind]+33)%33;
decode[ind] = alf[decode_num];
}
else
{
decode[ind]=text[ind];
key_ind--;
f--;
}
}
decode[size_text]='\0';
printf("Decrypted record: %s\n", decode);
}
int main()
{
setlocale(LC_ALL, "Rus");
SetConsoleCP(1251);
SetConsoleOutputCP(1251);
int size_text, size_key, i, j, k, t, choose, numt[256], numk[256];
char text[256], key[256];
char alf[] = {'а', 'б', 'в', 'г', 'д', 'е', 'ё', 'ж', 'з', 'и', 'й', 'к', 'л', 'м','н', 'о', 'п', 'р', 'с', 'т', 'у', 'ф', 'х', 'ц', 'ч', 'ш', 'щ', 'ъ', 'ы', 'ь', 'э', 'ю', 'я'};
printf("Введите сообщение: ");
fgets(text, 256, stdin);
printf("Введите ключ: ");
fgets(key, 256, stdin);
size_text = strlen(text);
size_key = strlen(key);
text[size_text--]='\0';
key[size_key--]='\0';
t=0;k=0;
for(i=0; i<size_text; i++)
{
for(j = 0; j < 33; j++)
{
if(text[i]==alf[j])
{
numt[k]= j;
k++;
}
if(key[i]==alf[j])
{
numk[t]=j;
t++;
}
}
}
printf("Что делать? 1. Зашифровать 2.Расшифровать\n");
scanf("%d", &choose);
if(choose==1)
code(size_text, size_key, alf, text, numt, numk);
else if(choose==2)
decode(size_text, size_key, alf, text, numt, numk);
Else
printf("Введено некорректное значение\n");
return 0;
}
Листинг 2.3 – Поиск групп символов
Язык программирования – C;
Используемый компилятор – C-Free 5;
Требования к входным данным - буквы русского алфавита;
Формат выходных данных - строки;
#include <stdio.h>
#include <locale.h>
#include <Windows.h>
int main()
{
setlocale(LC_ALL, "Rus");
SetConsoleCP(1251);
SetConsoleOutputCP(1251);
int i, a, j;
char c;
a=0;
char str[10063];
FILE *fp;
fp = fopen("file.txt", "r");
fgets(str,10063,fp);
printf("Введите букву: ");
scanf("%c", &c);
for(i=0;i<10060;i++)
{
if(str[i]==c){
printf("%c%c%c%c%c ", str[i],str[i+1],str[i+2],str[i+3],str[i+4]);
for(j=0;j<10060;j++)
{
if(str[i]==str[j]&&str[i+1]==str[j+1]&&str[i+2]==str[j+2]&&str[i+3]==str[j+3]&&str[i+4]==str[j+4])
{
printf("j=%d ", j);
a++;
}
}
printf("Всего индексов: %d\n", a);
a=0;
}
}
fclose(fp);
return 0;
}
Листинг 2.4 – Поиск каждой седьмой буквы
Язык программирования – C;
Используемый компилятор – C-Free 5;
Требования к входным данным - буквы русского алфавита;
Формат выходных данных - строки;
#include <stdio.h>
#include <locale.h>
#include <Windows.h>
int main()
{
setlocale(LC_ALL, "Rus");
SetConsoleCP(1251);
SetConsoleOutputCP(1251);
int i,j, alf, p;
p=0;
FILE *fp;
fp = fopen("file.txt", "r");
while(!feof(fp))
{
alf=fgetc(fp);
if(p%7==0)
printf("%c", alf);
p++;
}
printf("\n");
fclose(fp);
return 0;
}
Листинг 2.5 – Шифратор Виженера (без «Ё»)
Язык программирования – C;
Используемый компилятор – C-Free 5;
Требования к входным данным – все буквы русского алфавита, кроме «Ё»;
Формат выходных данных - строки;
#include <stdio.h>
#include <Windows.h>
#include <locale.h>
#include <stdlib.h>
#include <string.h>
void code(int size_text, int size_key, char alf[], char text[], int numt[], int numk[])
{
int ind, key_ind, f, code_num;
char code[10062];
for(ind=0, key_ind=0, f=0; ind<size_text; ind++, key_ind++, f++)
{
if (key_ind == size_key)
key_ind=0;
if(text[ind]>=alf[0] && text[ind]<=alf[31])
{
code_num = (numt[f]+numk[key_ind])%32;
code[ind] = alf[code_num];
}
else
{
code[ind]=text[ind];
key_ind--;
f--;
}
}
code[size_text]='\0';
printf("Encrypted record: %s\n", code);
void decode(int size_text, int size_key, char alf[], char text[], int numt[], int numk[])
{
int ind, key_ind, f, decode_num;
char decode[10062];
for(ind=0, key_ind=0, f=0; ind<size_text; ind++, key_ind++, f++)
{
if (key_ind == size_key)
key_ind=0;
if(text[ind]>=alf[0] && text[ind]<=alf[31])
{
decode_num = (numt[f]-numk[key_ind]+32)%32;
decode[ind] = alf[decode_num];
}
else
{
decode[ind]=text[ind];
key_ind--;
f--;
}
}
decode[size_text]='\0';
printf("Decrypted record: %s\n", decode);
}
int main()
{
setlocale(LC_ALL, "Rus");
SetConsoleCP(1251);
SetConsoleOutputCP(1251);
FILE *fp;
fp = fopen("file.txt", "r");
int size_text, size_key, i, j, k, t, choose, numt[10062], numk[10062];
char text[10062], key[256];
char alf[] = {'а', 'б', 'в', 'г', 'д', 'е', 'ж', 'з', 'и', 'й', 'к', 'л', 'м','н', 'о', 'п', 'р', 'с', 'т', 'у', 'ф', 'х', 'ц', 'ч', 'ш', 'щ', 'ъ', 'ы', 'ь', 'э', 'ю', 'я'};
fgets(text, 10063, fp);
printf("Введите ключ: ");
fgets(key, 10063, stdin);
size_text = strlen(text);
size_key = strlen(key);
text[size_text--]='\0';
key[size_key--]='\0';
t=0;k=0;
for(i=0; i<size_text; i++)
{
for(j = 0; j < 32; j++)
{
if(text[i]==alf[j])
{
numt[k]= j;
k++;
}
if(key[i]==alf[j])
{
numk[t]=j;
t++;
}
}
}
printf("Что делать? 1. Зашифровать 2.Расшифровать\n");
scanf("%d", &choose);
if(choose==1)
code(size_text, size_key, alf, text, numt, numk);
else if(choose==2)
decode(size_text, size_key, alf, text, numt, numk);
dlse
printf("Введено некорректное значение\n");
return 0;
}
