Методы криптографии.Подстановки

Автор: Пользователь скрыл имя, 07 Мая 2012 в 18:54, лабораторная работа

Описание работы

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

Работа содержит 1 файл

Крипто1.docx

— 116.31 Кб (Скачать)

Министерство образования и  науки РФ

Государственное образовательное  учреждение

высшего профессионального образования

Тульский государственный университет

 

 

КАФЕДРА ЭЛЕКТРОННЫХ ВЫЧИСЛИТЕЛЬНЫХ МАШИН

 

 

 

ЗАЩИТА ИНФОРМАЦИИ И ИНФОРМАЦИОННАЯ БЕЗОПАСНОСТЬ

 

 

 

 

 

 

 

 

 

 

Лабораторная работа  №  1

 

«МЕТОДЫ КРИПТОГРАФИИ. ПОДСТАНОВКИ»

 

 

 

 

 

 

 

 

 

 

 

Выполнили

студенты гр. 230281:

Жуков А. А.

Корешков А. В.

 

Проверил:

 Новиков А. В.

 

 

Тула 2012

  1. Цель работы

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

  1. Задание на работу

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

В интегрированной среде  программирования разработать программное  обеспечение для автоматизированной дешифрации (взлома) зашифрованного текста, при условии, что способ шифрования известен, а ключ – нет.

Вариант №4. G-контурная многоалфавитная подстановка.

  1. Ход выполнения работы

    1. Разработка ПО для автоматизированной шифрации текста

Исходные данные:

Input.txt – файл, содержащий исходный текст сообщения;

Setup.txt – файл, содержащий словарь с множеством алфавитов;

Выходные данные:

Output.txt – файл, содержащий полученный шифрованный текст;

Листинг программы:

#include <stdio.h>

 

int main(int argc, char** argv)

{

  //Открываем файл со словарем

  FILE* inp = fopen(argv[3], "r");

  int count_alphabits, length_alphabit, *Ts;

  char** alphabits;

  //Записываем словарь в память

  fscanf(inp, "%d %d\n", &count_alphabits, &length_alphabit);

  Ts = new int[count_alphabits];

  alphabits = new char*[length_alphabit+1];

  for(int i = 0; i < count_alphabits; i++)

    alphabits[i] = new char[length_alphabit];

  for(int i = 0; i < count_alphabits; i++)

  {

    fscanf(inp, "%d ", &(Ts[i]));

    for(int j = 0; j < length_alphabit; j++)

      alphabits[i][j] = fgetc(inp);

    alphabits[i][length_alphabit] = '\0';

  }

  fclose(inp);

  //Шифруем сообщение и записываем  шифро-текст в файл

  int i = 0, j = 0;

  inp = fopen(argv[1], "r");

  FILE* out = fopen(argv[2], "w+");

  bool sign = false;

  while(true)

  {

    int c = fgetc(inp);

    if(feof(inp)) break;

    int p = c;

    if(argc == 5) printf("%c(%d)", (char)p, p);

    for(int i = 0; i < count_alphabits; i++)

    {

      if(sign)

      {

        p += alphabits[i][j % Ts[i]];

        if(argc == 5) printf("+%c(%d)", alphabits[i][j % Ts[i]], (int)(alphabits[i][j % Ts[i]]));

      }

      else

      {

        p -= alphabits[i][j % Ts[i]];

        if(argc == 5) printf("-%c(%d)", alphabits[i][j % Ts[i]], (int)(alphabits[i][j % Ts[i]]));

      }

      sign = !sign;

    }

    p += 100;

    if(argc == 5) printf("+(100)=%c(%d)\n", (char)p, p);

    j++;

    fputc(p, out);

  }

  fclose(inp);

  fclose(out);

  return 0;

}

 

Результат работы программы:

Словарь:

 

8 35

15 QWERTYUIOP{}ASDFGHJKL:"ZXCVBNM<>?!

20 []poiua/.,mnbvcxz! ytrewq';lkjhgfds

11 aqzxswedcvfrjm,kiol./;p[']!tgbnhyu

12 ]'/.;[pl,mkrdxzseawq!oijnbhuygvcft

12 q]w[eprotiyua's;dlmbn! fkgjhz/x.c,v

11 /'][poiuytrew;lkjhgfds! qazxcvbnm,.

13 QAZXCDSWERFVBNHGTYUJ:P{"}! M<KIOL>?

12 QZAXWSCED:"{}! VRFBTGNYHMUJ<IK>OL?P

 

Текст входного сообщения:

 

Hello world! Anton hello! Evm forever! Hello world! Anton hello! Evm forever! Hello world! Anton hello!

 

Полученный шифро-текст:

 

ph}ЈП’Щµ‚/fV~ЊНГ­`цnЭ‡ЫhC2ЄѓcъжЁўnсХ(і¦Єжъ/ }Ц”v@/°фЮ€>A=К¬ВЌ‚ѕґUк„’дФнҐа‹*/ТW»ГЬп°lЈX/‚ђ§Шў7ёsH­AЋ‚

    1. Разработка ПО для автоматизированной дешифрации зашифрованного текста

Исходные данные:

Input.txt – файл, содержащий шифрованный текст;

Setup.txt – файл, содержащий словарь с множеством алфавитов;

Выходные данные:

Output.txt – файл, содержащий полученный исходный текст сообщения;

Листинг программы:

#include <stdio.h>

 

int main(int argc, char** argv)

{

  //Открываем файл со словарем

  FILE* inp = fopen(argv[3], "r");

  int count_alphabits, length_alphabit, *Ts;

  char** alphabits;

  //Записываем словарь в память

  fscanf(inp, "%d %d\n", &count_alphabits, &length_alphabit);

  Ts = new int[count_alphabits];

  alphabits = new char*[length_alphabit+1];

  for(int i = 0; i < count_alphabits; i++)

    alphabits[i] = new char[length_alphabit];

  for(int i = 0; i < count_alphabits; i++)

  {

    fscanf(inp, "%d ", &(Ts[i]));

    for(int j = 0; j < length_alphabit; j++)

      alphabits[i][j] = fgetc(inp);

    alphabits[i][length_alphabit] = '\0';

  }

  fclose(inp);

  //Шифруем сообщение и записываем  шифро-текст в файл

  int i = 0, j = 0;

  inp = fopen(argv[1], "r");

  FILE* out = fopen(argv[2], "w+");

  bool sign = true;

  while(true)

  {

    int c = fgetc(inp);

    if(feof(inp))

      break;

   

    int p = c;

    if(argc == 5) printf("%c(%d)", (char)p, p);

    for(int i = count_alphabits-1; i >= 0; i--)

    {

      if(sign)

      {

        p -= alphabits[i][j % Ts[i]];

        if(argc == 5) printf("-%c(%d)", alphabits[i][j % Ts[i]], (int)(alphabits[i][j % Ts[i]]));

      }

      else

      {

        p += alphabits[i][j % Ts[i]];

        if(argc == 5) printf("+%c(%d)", alphabits[i][j % Ts[i]], (int)(alphabits[i][j % Ts[i]]));

      }

      sign = !sign;

    }

    p -= 100;

    if(argc == 5) printf("-(100)=%c(%d)\n", (char)p, p);

    j++;

    fputc(p, out);

  }

  fclose(inp);

  fclose(out);

  return 0;

}

 

Результат работы программы:

Словарь:

 

8 35

15 QWERTYUIOP{}ASDFGHJKL:"ZXCVBNM<>?!

20 []poiua/.,mnbvcxz! ytrewq';lkjhgfds

11 aqzxswedcvfrjm,kiol./;p[']!tgbnhyu

12 ]'/.;[pl,mkrdxzseawq!oijnbhuygvcft

12 q]w[eprotiyua's;dlmbn! fkgjhz/x.c,v

11 /'][poiuytrew;lkjhgfds! qazxcvbnm,.

13 QAZXCDSWERFVBNHGTYUJ:P{"}! M<KIOL>?

12 QZAXWSCED:"{}! VRFBTGNYHMUJ<IK>OL?P

 

Шифро-текст входного сообщения:

 

ph}ЈП’Щµ‚/fV~ЊНГ­`цnЭ‡ЫhC2ЄѓcъжЁўnсХ(і¦Єжъ/ }Ц”v@/°фЮ€>A=К¬ВЌ‚ѕґUк„’дФнҐа‹*/ТW»ГЬп°lЈX/‚ђ§Шў7ёsH­AЋ‚

 

Полученный исходный текст:

 

Hello world! Anton hello! Evm forever! Hello world! Anton hello! Evm forever! Hello world! Anton hello!

    1. Разработка ПО для автоматизированного взлома зашифрованного текста

Исходные данные:

Input.txt – файл, содержащий шифрованный текст;

Выходные данные:

Output.txt – файл, содержащий полученный исходный текст сообщения;

Листинг программы:

#include <stdio.h>

#include <windows.h>

 

int main(int argc, char** argv)

{

  FILE* inp, *out;

  //Путь к программе шифрования

  char encrypt[256];

  strcpy(encrypt,argv[1]);

  strcat(encrypt,"\\");

  strcat(encrypt,argv[2]);

  //Путь к шифро-тексту

  char true_output[256];

  strcpy(true_output,argv[1]);

  strcat(true_output,"\\");

  strcat(true_output,argv[3]);

  //Путь к востановленному тексту

  char open_input[256];

  strcpy(open_input,argv[1]);

  strcat(open_input,"\\");

  strcat(open_input,argv[4]);

  //Для работы с командной  строкой

  char cmd_cd[256];

  strcpy(cmd_cd, argv[1]);

  strcat(cmd_cd, "\\");

  strcat(cmd_cd, argv[2]);

  strcat(cmd_cd, " ");

  strcat(cmd_cd, argv[1]);

  strcat(cmd_cd, "\\");

  strcat(cmd_cd, argv[4]);

  strcat(cmd_cd, " ");

  strcat(cmd_cd, argv[1]);

  strcat(cmd_cd, "\\");

  strcat(cmd_cd, argv[3]);

  strcat(cmd_cd, " ");

  strcat(cmd_cd, argv[1]);

  strcat(cmd_cd, "\\");

  strcat(cmd_cd, argv[5]);

  //Копируем исходный шифротекст и считаем его длинну

  int count_char = 0;

  inp = fopen(true_output, "r+");

  out = fopen("true_output.txt", "w+");

  while(true)

  {

    int c = fgetc(inp);

    if(feof(inp)) break;

    fputc(c, out);

    count_char++;

  }

  fclose(inp);

  fclose(out);

  //Выделим память под востановленный текст

  char* true_input = new char[count_char+1];

  for(int i = 0; i <= count_char; i++)

    true_input[i] = '\0';

  for(int c = -127; c < 128; c++)

  {

    printf("Brute-force attack %d%%\n", ((c+127)*100)/254);

    //Генерируем текст из последовательности одного и того же символа

    out = fopen(open_input, "w+");

    for(int i = 0; i < count_char; i++)

      fputc(c, out);

    fclose(out);

    //Запускаем программу шифрования

    system(cmd_cd);

    inp = fopen(true_output, "r");

    FILE* inp2 = fopen("true_output.txt", "r");

    //Если символ полученного шифро-текста совпадает с символом исходного шифро-текста, то сохраняем его

    for(int i = 0; i < count_char; i++)

      if(fgetc(inp) == fgetc(inp2)) true_input[i] = c;

    fclose(inp2);

    fclose(inp);

  }

  //Записываем восстановленный  исходный текст в файл

  out = fopen("open_input.txt", "w+");

  for(int i = 0; i < count_char; i++)

    fputc(true_input[i], out);

  fclose(out);

  //Восстанавливаем файл исходного шифро-текста

  inp = fopen("true_output.txt", "r");

  out = fopen(true_output, "w+");

  for(int i = 0; i < count_char; i++)

    fputc(fgetc(inp), out);

  fclose(out);

  fclose(inp);

}

 

Результат работы программы:

Шифро-текст входного сообщения:

 

ph}ЈП’Щµ‚/fV~ЊНГ­`цnЭ‡ЫhC2ЄѓcъжЁўnсХ(і¦Єжъ/ }Ц”v@/°фЮ€>A=К¬ВЌ‚ѕґUк„’дФнҐа‹*/ТW»ГЬп°lЈX/‚ђ§Шў7ёsH­AЋ‚

 

Полученный исходный текст:

 

Hello world! Anton hello! Evm forever! Hello world! Anton hello! Evm forever! Hello world! Anton hello!

    1. Разработка автоматизированного сценария для демонстрации работы ПО (Шифрование-дешифрование)

Листинг автоматизированного сценария:

@echo off

del input.txt

del output.txt

del setup.txt

copy restore\input.txt input.txt

copy restore\setup.txt setup.txt

cls

echo Исходные параметры приложения:

echo input.txt - Файл, содержащий текст

echo setup.txt - Словарь, содержащий N алфавитов по M букв в каждом

echo ==============================================================

pause

echo Получим шифро-текст при помощи разработанного ПО (encoder.exe)

echo output.txt - Файл, содержащий шифро-текст

encoder.exe input.txt output.txt setup.txt

echo ==============================================================

pause

echo Удалим файл input.txt, содержащий исходный текст

del input.txt

echo ==============================================================

pause

echo Переименуем файл output.txt в input.txt

rename output.txt input.txt

echo ==============================================================

pause

echo Восстановим текст при помощи разработанного ПО (decoder.exe)

echo output.txt - Файл, содержащий текст

decoder.exe input.txt output.txt setup.txt

echo ==============================================================

pause

del input.txt

del output.txt

del setup.txt

 

Результат работы автоматизированного  сценария:

Рис. 1. Результат выполнения автоматизированного  сценария

Рис. 2. Входной файл, содержащий шифро-текст

Рис. 3. Выходной файл, содержащий исходный текст

    1. Разработка автоматизированного сценария для демонстрации работы ПО (Шифрование-дешифрование)

Листинг автоматизированного сценария:

@echo off

del encoder\input.txt

del encoder\output.txt

del encoder\setup.txt

del true_output.txt

del open_input.txt

copy restore\input.txt encoder\input.txt

copy restore\setup.txt encoder\setup.txt

cls

echo Исходные параметры приложения:

echo input.txt - Файл, содержащий текст

echo setup.txt - Словарь, содержащий N алфавитов по M букв в каждом

echo ==============================================================

pause

echo Получим шифро-текст при помощи разработанного ПО (encoder.exe)

echo output.txt - Файл, содержащий шифро-текст

encoder\encoder.exe encoder\input.txt encoder\output.txt encoder\setup.txt

echo ==============================================================

pause

echo Удалим файл input.txt, содержащий исходный текст

del encoder\input.txt

echo ==============================================================

pause

echo Восстановим текст при помощи разработанного ПО (brute-force.exe)

pause

brute-force.exe encoder encoder.exe output.txt input.txt setup.txt

echo ==============================================================

pause

del encoder\input.txt

del encoder\output.txt

del encoder\setup.txt

del true_output.txt

 

Результат работы автоматизированного  сценария:

Рис. 4. Результат выполнения автоматизированного  сценария

Рис. 5. Входной файл, содержащий шифро-текст

Рис. 6. Выходной файл, содержащий исходный текст

  1. Краткие выводы по работе

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


Информация о работе Методы криптографии.Подстановки