Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
реферат / 00_реферат_оиуп.docx
Скачиваний:
0
Добавлен:
13.05.2026
Размер:
168.32 Кб
Скачать

Заключение

В данном отчёте рассмотрены основные понятия криптографии, её задачи, изучены некоторые виды шифров, а также более подробно исследованы шифр простой замены и шифр Виженера.

При работе с текстом, зашифрованным простой заменой, основной трудностью стал поиск ключа. Нахождение наиболее читабельных участков текста, подбор подходящих букв заняли большую часть времени расшифровки.

При работе с текстом, зашифрованным с помощью шифра Виженера, для начала нужно ознакомиться с методами, с помощью которых можно расшифровываться текст, ознакомиться с наиболее понятным и только затем приступить к работе. В отличие от работы с шифром простой замены, здесь больше всего времени заняла программная реализация шифра Виженера.

Программная реализация, с помощью которой расшифровывались выданные закрытые тексты, в некоторых местах требует доработки. Не исключено, что есть более лёгкие способы реализации приведённых выше алгоритмов, а также то, что некоторые алгоритмы можно упростить или объединить, но поставленную задачу они выполняют.

Шифр Виженера был популярен в XIX и XX веке. Сейчас он редко используется из-за своей ненадёжности. Для технологий XXI века этот шифр достаточно прост. Но стал базой для некоторых других более надёжных шифров, например, шифр Гронсфилда. Из-за этого, шифр Виженера является отличным пособием для начинающих осваивать криптоанализ. Поэтому останавливаться на изучении шифра простой замены и шифра Виженера не стоит, очень полезно в дальнейшем будет изучение более стойких шифров.

В последние десятилетия в криптографии стали появляться шифры, стойкость которых обосновывается сложностью решения чисто математических задач: разложения больших чисел на множители, решения показательных сравнений в целых числах и других. Стойкость шифров зависит также и от качества генераторов случайных чисел, порождающих ключи. Криптография является богатым источником трудных математических задач, а математика — одной из основ криптографии.

Список использованных источников

  1. Основы криптографии Учебное пособие - Алферов А.П., Зубов А.Ю., Кузьмин А.С., Черемушкин А.В., 2002.

  2. Криптографические методы защиты информации - А. Б. Лось, А. Ю. Нестеренко, М. И. Рожков. — 2-е изд., испр., 2019. 

  3. Сведения о частоте встречаемости букв в русском языке - http://dict.ruslang.ru/freq.php

  4. Сведения о частоте встречаемости букв в русском языке -https://dpva.ru/Guide/GuideUnitsAlphabets/Alphabets/FrequencyRuLetters/

Приложения

Листинг 1.1 – Подсчёт букв

Язык программирования – C;

Используемый компилятор – C-Free 5;

Требования к входным данным - буквы русского алфавита;

Формат выходных данных - символ;

  1. #include <stdio.h>

  2. #include <locale.h>

  3. #include <Windows.h>

  4. int main()

  5. {

  6. setlocale(LC_ALL, "Rus");

  7. SetConsoleCP(1251);

  8. SetConsoleOutputCP(1251);

  9. int i, a;

  10. a=0;

  11. char sym, num;

  12. FILE *fp;

  13. fp = fopen("file.txt", "r");

  14. printf("Введите искомый символ: ");

  15. scanf("%c", &sym);

  16. while (!feof(fp))

  17. {

  18. num = fgetc(fp);

  19. if (sym == num)

  20. a++;

  21. }

  22. printf("Количество в тексте: %d\n", a);

  23. fclose(fp);

  24. return 0;

  25. }

Листинг 1.2 – Замена букв

Язык программирования – C;

Используемый компилятор – C-Free 5;

Требования к входным данным - буквы русского алфавита;

Формат выходных данных - символ;

  1. #include <stdio.h>

  2. #include <locale.h>

  3. #include <Windows.h>

  4. int main()

  5. {

  6. setlocale(LC_ALL, "Rus");

  7. SetConsoleCP(1251);

  8. SetConsoleOutputCP(1251);

  9. char alf, a, b;

  10. FILE *fp, *fl;

  11. fp=fopen("file_1.txt", "r");

  12. fl = fopen("file_2.txt", "w");

  13. printf("Введите символы, которые хотите поменять местами: ");

  14. scanf("%c %c", &a, &b);

  15. while(!feof(fp))

  16. {

  17. alf=fgetc(fp);

  18. if(alf==a)

  19. fprintf(fl, "%c", b);

  20. else if(alf==b)

  21. fprintf(fl, "%c", a);

  22. else

  23. fprintf(fl, "%c", alf);

  24. }

  25. fclose(fp);

  26. fclose(fl);

  27. return 0;

  28. }

Листинг 2.1 – Редактор текста

Язык программирования – C;

Используемый компилятор – C-Free 5;

Требования к входным данным - нет;

Формат выходных данных - строка;

  1. #include <stdio.h>

  2. #include <Windows.h>

  3. #include <locale.h>

  4. int main()

  5. {

  6. setlocale(LC_ALL, "Rus");

  7. SetConsoleCP(1251);

  8. SetConsoleOutputCP(1251);

  9. char in[256], out[256];

  10. char alf[] = {'а', 'б', 'в', 'г', 'д', 'е', 'ё', 'ж', 'з', 'и', 'й', 'к', 'л', 'м', 'н', 'о', 'п', 'р', 'с', 'т', 'у', 'ф', 'х', 'ц', 'ч', 'ш', 'щ', 'ъ', 'ы', 'ь', 'э', 'ю', 'я'};

  11. char Alf[] = {'А', 'Б', 'В', 'Г', 'Д', 'Е', 'Ё', 'Ж', 'З', 'И', 'Й', 'К', 'Л', 'М', 'Н', 'О', 'П', 'Р', 'С', 'Т', 'У', 'Ф', 'Х', 'Ц', 'Ч', 'Ш', 'Щ', 'Ъ', 'Ы', 'Ь', 'Э', 'Ю', 'Я'};

  12. char mark[] = {',', '.', '"', '?', '!', '-', '(', ')', ';', ':', '…', '«', '»'};

  13. int i, j, n;

  14. printf("Введите текст: ");

  15. fgets(in, 256, stdin);

  16. for(i=0;i<256;i++)

  17. {

  18. for(j=0;j<33;j++)

  19. {

  20. if(in[i]==Alf[j])

  21. in[i]=alf[j];

  22. }

  23. }

  24. for(i=0;i<256;i++)

  25. {

  26. for(j=0;j<13;j++)

  27. {

  28. if(in[i]==mark[j])

  29. in[i]=' ';

  30. }

  31. }

  32. for(i=0, n=0;i<256;i++, n++)

  33. {

  34. if(in[i]==' ')

  35. n--;

  36. else

  37. out[n]=in[i];

  38. }

  39. printf("%s\n", out);

  40. return 0;

  41. }

Листинг 2.2 – Шифратор Виженера

Язык программирования – C;

Используемый компилятор – C-Free 5;

Требования к входным данным - буквы русского алфавита;

Формат выходных данных - строка;

  1. #include <stdio.h>

  2. #include <Windows.h>

  3. #include <locale.h>

  4. #include <stdlib.h>

  5. #include <string.h>

  6. void code(int size_text, int size_key, char alf[], char text[], int numt[], int numk[])

  7. {

  8. int ind, key_ind, f, code_num;

  9. char code[256];

  10. for(ind=0, key_ind=0, f=0; ind<size_text; ind++, key_ind++, f++)

  11. {

  12. if (key_ind == size_key)

  13. key_ind=0;

  14. if(text[ind]>=alf[0] && text[ind]<=alf[32])

  15. {

  16. code_num = (numt[f]+numk[key_ind])%33;

  17. code[ind] = alf[code_num];

  18. }

  19. else

  20. {

  21. code[ind]=text[ind];

  22. key_ind--;

  23. f--;

  24. }

  25. }

  26. code[size_text]='\0';

  27. printf("Encrypted record: %s\n", code);

  28. }

  29. void decode(int size_text, int size_key, char alf[], char text[], int numt[], int numk[])

  30. {

  31. int ind, key_ind, f, decode_num;

  32. char decode[256];

  33. for(ind=0, key_ind=0, f=0; ind<size_text; ind++, key_ind++, f++)

  34. {

  35. if (key_ind == size_key)

  36. key_ind=0;

  37. if(text[ind]>=alf[0] && text[ind]<=alf[32])

  38. {

  39. decode_num = (numt[f]-numk[key_ind]+33)%33;

  40. decode[ind] = alf[decode_num];

  41. }

  42. else

  43. {

  44. decode[ind]=text[ind];

  45. key_ind--;

  46. f--;

  47. }

  48. }

  49. decode[size_text]='\0';

  50. printf("Decrypted record: %s\n", decode);

  51. }

  52. int main()

  53. {

  54. setlocale(LC_ALL, "Rus");

  55. SetConsoleCP(1251);

  56. SetConsoleOutputCP(1251);

  57. int size_text, size_key, i, j, k, t, choose, numt[256], numk[256];

  58. char text[256], key[256];

  59. char alf[] = {'а', 'б', 'в', 'г', 'д', 'е', 'ё', 'ж', 'з', 'и', 'й', 'к', 'л', 'м','н', 'о', 'п', 'р', 'с', 'т', 'у', 'ф', 'х', 'ц', 'ч', 'ш', 'щ', 'ъ', 'ы', 'ь', 'э', 'ю', 'я'};

  60. printf("Введите сообщение: ");

  61. fgets(text, 256, stdin);

  62. printf("Введите ключ: ");

  63. fgets(key, 256, stdin);

  64. size_text = strlen(text);

  65. size_key = strlen(key);

  66. text[size_text--]='\0';

  67. key[size_key--]='\0';

  68. t=0;k=0;

  69. for(i=0; i<size_text; i++)

  70. {

  71. for(j = 0; j < 33; j++)

  72. {

  73. if(text[i]==alf[j])

  74. {

  75. numt[k]= j;

  76. k++;

  77. }

  78. if(key[i]==alf[j])

  79. {

  80. numk[t]=j;

  81. t++;

  82. }

  83. }

  84. }

  85. printf("Что делать? 1. Зашифровать 2.Расшифровать\n");

  86. scanf("%d", &choose);

  87. if(choose==1)

  88. code(size_text, size_key, alf, text, numt, numk);

  89. else if(choose==2)

  90. decode(size_text, size_key, alf, text, numt, numk);

  91. Else

  92. printf("Введено некорректное значение\n");

  93. return 0;

  94. }

Листинг 2.3 – Поиск групп символов

Язык программирования – C;

Используемый компилятор – C-Free 5;

Требования к входным данным - буквы русского алфавита;

Формат выходных данных - строки;

  1. #include <stdio.h>

  2. #include <locale.h>

  3. #include <Windows.h>

  4. int main()

  5. {

  6. setlocale(LC_ALL, "Rus");

  7. SetConsoleCP(1251);

  8. SetConsoleOutputCP(1251);

  9. int i, a, j;

  10. char c;

  11. a=0;

  12. char str[10063];

  13. FILE *fp;

  14. fp = fopen("file.txt", "r");

  15. fgets(str,10063,fp);

  16. printf("Введите букву: ");

  17. scanf("%c", &c);

  18. for(i=0;i<10060;i++)

  19. {

  20. if(str[i]==c){

  21. printf("%c%c%c%c%c ", str[i],str[i+1],str[i+2],str[i+3],str[i+4]);

  22. for(j=0;j<10060;j++)

  23. {

  24. 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])

  25. {

  26. printf("j=%d ", j);

  27. a++;

  28. }

  29. }

  30. printf("Всего индексов: %d\n", a);

  31. a=0;

  32. }

  33. }

  34. fclose(fp);

  35. return 0;

  36. }

Листинг 2.4 – Поиск каждой седьмой буквы

Язык программирования – C;

Используемый компилятор – C-Free 5;

Требования к входным данным - буквы русского алфавита;

Формат выходных данных - строки;

  1. #include <stdio.h>

  2. #include <locale.h>

  3. #include <Windows.h>

  4. int main()

  5. {

  6. setlocale(LC_ALL, "Rus");

  7. SetConsoleCP(1251);

  8. SetConsoleOutputCP(1251);

  9. int i,j, alf, p;

  10. p=0;

  11. FILE *fp;

  12. fp = fopen("file.txt", "r");

  13. while(!feof(fp))

  14. {

  15. alf=fgetc(fp);

  16. if(p%7==0)

  17. printf("%c", alf);

  18. p++;

  19. }

  20. printf("\n");

  21. fclose(fp);

  22. return 0;

  23. }

Листинг 2.5 – Шифратор Виженера (без «Ё»)

Язык программирования – C;

Используемый компилятор – C-Free 5;

Требования к входным данным – все буквы русского алфавита, кроме «Ё»;

Формат выходных данных - строки;

  1. #include <stdio.h>

  2. #include <Windows.h>

  3. #include <locale.h>

  4. #include <stdlib.h>

  5. #include <string.h>

  6. void code(int size_text, int size_key, char alf[], char text[], int numt[], int numk[])

  7. {

  8. int ind, key_ind, f, code_num;

  9. char code[10062];

  10. for(ind=0, key_ind=0, f=0; ind<size_text; ind++, key_ind++, f++)

  11. {

  12. if (key_ind == size_key)

  13. key_ind=0;

  14. if(text[ind]>=alf[0] && text[ind]<=alf[31])

  15. {

  16. code_num = (numt[f]+numk[key_ind])%32;

  17. code[ind] = alf[code_num];

  18. }

  19. else

  20. {

  21. code[ind]=text[ind];

  22. key_ind--;

  23. f--;

  24. }

  25. }

  26. code[size_text]='\0';

  27. printf("Encrypted record: %s\n", code);

  28. void decode(int size_text, int size_key, char alf[], char text[], int numt[], int numk[])

  29. {

  30. int ind, key_ind, f, decode_num;

  31. char decode[10062];

  32. for(ind=0, key_ind=0, f=0; ind<size_text; ind++, key_ind++, f++)

  33. {

  34. if (key_ind == size_key)

  35. key_ind=0;

  36. if(text[ind]>=alf[0] && text[ind]<=alf[31])

  37. {

  38. decode_num = (numt[f]-numk[key_ind]+32)%32;

  39. decode[ind] = alf[decode_num];

  40. }

  41. else

  42. {

  43. decode[ind]=text[ind];

  44. key_ind--;

  45. f--;

  46. }

  47. }

  48. decode[size_text]='\0';

  49. printf("Decrypted record: %s\n", decode);

  50. }

  51. int main()

  52. {

  53. setlocale(LC_ALL, "Rus");

  54. SetConsoleCP(1251);

  55. SetConsoleOutputCP(1251);

  56. FILE *fp;

  57. fp = fopen("file.txt", "r");

  58. int size_text, size_key, i, j, k, t, choose, numt[10062], numk[10062];

  59. char text[10062], key[256];

  60. char alf[] = {'а', 'б', 'в', 'г', 'д', 'е', 'ж', 'з', 'и', 'й', 'к', 'л', 'м','н', 'о', 'п', 'р', 'с', 'т', 'у', 'ф', 'х', 'ц', 'ч', 'ш', 'щ', 'ъ', 'ы', 'ь', 'э', 'ю', 'я'};

  61. fgets(text, 10063, fp);

  62. printf("Введите ключ: ");

  63. fgets(key, 10063, stdin);

  64. size_text = strlen(text);

  65. size_key = strlen(key);

  66. text[size_text--]='\0';

  67. key[size_key--]='\0';

  68. t=0;k=0;

  69. for(i=0; i<size_text; i++)

  70. {

  71. for(j = 0; j < 32; j++)

  72. {

  73. if(text[i]==alf[j])

  74. {

  75. numt[k]= j;

  76. k++;

  77. }

  78. if(key[i]==alf[j])

  79. {

  80. numk[t]=j;

  81. t++;

  82. }

  83. }

  84. }

  85. printf("Что делать? 1. Зашифровать 2.Расшифровать\n");

  86. scanf("%d", &choose);

  87. if(choose==1)

  88. code(size_text, size_key, alf, text, numt, numk);

  89. else if(choose==2)

  90. decode(size_text, size_key, alf, text, numt, numk);

  91. dlse

  92. printf("Введено некорректное значение\n");

  93. return 0;

  94. }

Соседние файлы в папке реферат