5099

Шифрование методом Поросячья латынь

Курсовая

Информатика, кибернетика и программирование

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

Русский

2012-12-03

239.16 KB

22 чел.

 Шифрование методом Поросячья латынь

Введение

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

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

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

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

Один из самых известных методов шифрования является метод Цезаря, который римский император если и не изобрел, то, по крайней мере, активно им пользовался. Не имея доверия к своим посыльным, он шифровал письма элементарной заменой А на D, В на Е и так далее по латинскому алфавиту. К примеру, при таком кодировании последовательность ABC была бы записана как DEF.

Спустя пол века шифрование стало использоваться уже повсеместно при составлении текстов религиозного содержания, молитв и важных государственных документов.

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

Шифрование - процесс преобразования исходного текста (который носит также название открытого текста) в зашифрованный.

Дешифрование - обратный шифрованию процесс. На основе ключа зашифрованный текст преобразуется в исходный.

Ключ - информация, необходимая для беспрепятственного шифрования и дешифрования текстов.

Криптографическая система представляет собой семейство T преобразований открытого текста. Составные этого семейства индексируются, или обозначаются символом k; параметр k является ключом. Пространство ключей K - это набор возможных значений ключа. Обычно ключ представляет собой последовательный ряд букв алфавита.

Криптографические системы делят на симметричные и ассиметричные(шифрование с открытым ключом) .

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

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

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

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

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

  1.  общее количество всех возможных ключей;
  2.  среднее время, необходимое для дешифрования сообщения.

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

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

  Для современных криптографических систем информационной безопасности определены следующие общие требования:

  1.  зашифрованное сообщение должно быть возможно расшифровать только при наличии ключа;
  2.  количество операций, необходимых для определения использованного ключа шифрования по фрагменту шифрованного сообщения и соответствующего ему открытого текста должно быть не меньше общего числа возможных ключей;
  3.  количество операций, требуемых для дешифрования сообщения путем перебора всех возможных ключей должно иметь строго определенную нижнюю оценку и выходить за черту возможностей современных компьютеров (с учетом возможности использования сетевых вычислений);
  4.  знание примененного алгоритма шифрования не должно влиять на надежность защиты;
  5.  незначительное изменение ключа должно приводить к значительному изменению вида зашифрованного сообщения;
  6.  элементы структуры алгоритма шифрования должны оставаться неизменными;
  7.  дополнительные биты, вводимые в сообщение в процессе шифрования, должен быть полностью и надежно скрыты в шифрованном тексте;
  8.  длина зашифрованного текста должна равняться длине исходного сообщения;
  9.  недопустимо использование очевидных и легко устанавливаемых зависимостей между ключами, последовательно используемыми в процессе шифрования текста;
  10.  каждый ключ из множества возможных должен обеспечивать надежную защиту информации;
  11.  алгоритм шифрования должен допускать как программную, так и аппаратную реализацию, а изменение длины ключа не должно приводить к понижению криптостойкости алгоритма.

Разработка проекта программы

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

Язык программирования, используемый для написания программы: С++. Среда разработки: CodeBlocks 10.05.

Считывание шифруемой строки осуществляется с клавиатуры.

Вывод зашифрованного сообщения осуществляется на экран.

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

После запуска программного средства, управление передается на клавиатуру.

Разработка алгоритмов работы программного средства

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

На рисунках 1-7 приведены структурные схемы работы программного средства.

На рисунках 4 – 7 представлена структурная схема работы модуля «Шифрование»

Рис. 1 Структурная схема управляющей программы

Рис.2 Структурная схема работы модуля «Ввод строки»

Рис. 3 Структурная схема работы модуля «Вывод строки»

Рис.4 Структурная схема работы модуля «Шифрование»

Рис.5 Структурная схема работы модуля «Шифрование»

Рис.6 Структурная схема работы модуля «Шифрование»

Рис.7 Структурная схема работы модуля «Шифрование»

Результаты отладки и тестирования программного средства

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

 На рисунках 8-11 представлены результаты работы программного средства.

Рис.8 Зашифрованная фраза «Это сообщение будет зашифровано!»

Рис.9 Зашифрованное сообщение «Чернышов Кирилл Алексеевич»

Рис.10 Ошибка выбора действия

Рис.11 Сообщение о необходимости первоначального ввода строки

Код программного средства

#include <iostream>

#include <fstream>

#include <conio.h>

#include <io.h>

#include <iomanip>

#include <stdio.h>

#include <string.h>

#include <stdlib.h>

using namespace std;

int main()

{

   bool nabrano=false,nachalo=false;

   char str[100],temp[100],tmpchr;

   int i,i2,i3,i4,j,k,l,z,len=0;

  //меню

   m1: system("cls");

   //Вывод шапки-приглашения/////////////////////////////////////////////////////////////////////////////////////

   cout << "            \xC9\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xBB"<<endl;

   cout << "            \xBA Choose The Option \xBA"<<endl;

   cout << "            \xC8\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xBC"<<endl;

   //Вывод вариантов//////////////////////////////////////////////////////////////////////////////////////////////

   cout << "\xC9\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD";

   cout << "\xCB\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCB";

   cout << "\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xBB"<<endl;

   cout <<"\xBA 1-Enter String \xBA 2-Show String \xBA 3-Encode \xBA"<<endl;

   cout << "\xC8\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCA";

   cout << "\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCA";

   cout << "\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xBC"<<endl;

   //Действия/////////////////////////////////////////////////////////////////////////////////////////////////////

   k=_getch();

   switch (k)

   {

       case 49:

           puts ("Your String:");

           gets(str);

           nabrano=true;

       break;

       ///////////////////////////////////////////////////////////////////////////////////////////////////////////////

       ///////////////////////////////////////////////////////////////////////////////////////////////////////////////

       case 50:

           if (nabrano)

           {

               puts ("Your String:");

               puts (str);

               cin.get();

           }

           else

           {

               cout << "            \xC9\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xBB"<<endl;

               cout << "            \xBA At First, Enter String \xBA"<<endl;

               cout << "            \xC8\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xBC"<<endl;

               cin.get();

           }

       break;

       ///////////////////////////////////////////////////////////////////////////////////////////////////////////////

       ///////////////////////////////////////////////////////////////////////////////////////////////////////////////

       case 51: if(nabrano)

       {

               strcpy(temp,str);

               cout<<"Your String: "<<endl<<temp<<endl<<endl<<endl;

               //Кодируем первое слово////////////////////////////////////////////////////////////////////////////

               k=0;

               l=0;

               len=strlen(str);

               for (i=0;i<len;i++) if ((temp[i]==' ')&&(l==0))

               {

                   l=i;

                   break;

               }

               if (temp[l-1]==',') l=i-1;

               if(l>3)

               {   int j=i/2;

                   for (int i1=1;i1<j;i1++)

                   {

                       tmpchr=temp[i1];

                       temp[i1]=temp[l-i1-1];

                       temp[l-i1-1]=tmpchr;

                   }

               }

               l=i;

               ///////////////////////////////////////////////////////////////////////////////////////////////////

               //последующие слова////////////////////////////////////////////////////////////////////////////////

               k=l;

               for (i2=k+1;i2<len;i2++)

               {

                   if(temp[i2]==' ')

                   {

                       l=i2;

                       if (temp[l-1]==',')l=i2-1;

                       j=l-k-1;

                       if(j==4)

                       {

                           tmpchr=temp[l-2];

                           temp[l-2]=temp[k+2];

                           temp[k+2]=tmpchr;

                       }

                       if(j>4)

                       {

                           for (i3=2;i3<=j/2;i3++)

                           {

                               tmpchr=temp[l-i3];

                               temp[l-i3]=temp[k+i3];

                               temp[k+i3]=tmpchr;

                           }

                       }

                       l=i2;

                       //cout <<"k="<<k<<" l="<<l<<endl;

                       k=l;

                   }

               }

               ///////////////////////////////////////////////////////////////////////////////////////////////////

               //последнее слово//////////////////////////////////////////////////////////////////////////////////

               k=l;

               for (i2=k+1;i2<=len;i2++)

               {

                   if(str[i2]=='\0')

                   {

                       l=i2;

                       if ((temp[l-1]=='.')||(temp[l-1]=='!')||(temp[l-1]=='?')) l=i2-1;

                       j=l-k-1;

                       if(j==4)

                       {

                           tmpchr=temp[l-2];

                           temp[l-2]=temp[k+2];

                           temp[k+2]=tmpchr;

                       }

                       if(j>4)

                       {

                           for (i3=2;i3<=j/2;i3++)

                           {

                               tmpchr=temp[l-i3];

                               temp[l-i3]=temp[k+i3];

                               temp[k+i3]=tmpchr;

                           }

                       }

                       l=i2;

                       //cout <<"k="<<k<<" l="<<l<<endl;

                       k=l;

                   }

               }

               ////////////////////////////////////////////////////////////////////////////////////////////////////

               //если строка состоит только из одного слова/////////////////////////////////////////////////////////

               k=0; l=0;z=0;len=strlen(temp);

               for (i=0;i<len;i++)

               if ((temp[i]==' ')&&(l==0))

               {

                   l=i;

                   break;

               }

               if ((str[i]=='\0')&&(k==0))

               {

                   for( i2=1;i2<=len/2;i2++)

                   {

                       tmpchr=temp[i2];

                       temp[i2]=temp[len-1-i2];

                       temp[len-1-i2]=tmpchr;

                   }

               }

               //////////////////////////////////////////////////////////////////////////////////////////////////////

               //если строка состоит только из одного слова, которое состоит из четырех букв

               if ((str[i]=='\0')&&(k==0)&&(len>3))

               {

                   {

                       tmpchr=temp[1];

                       temp[1]=temp[2];

                       temp[2]=tmpchr;

                   }

               }

               ///////////////////////////////////////////////////////////////////////////////////////////////////////

              // cout <<"Dlina stroki:"<<len<<endl;

               cout <<"Encoded string: "<<endl<<temp<<endl;

               cin.get();

       }   else

           {

               cout << "            \xC9\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xBB"<<endl;

               cout << "            \xBA At First, Enter String \xBA"<<endl;

               cout << "            \xC8\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xBC"<<endl;

               cin.get();

           }

       break;

       ///////////////////////////////////////////////////////////////////////////////////////////////////////////////

       ///////////////////////////////////////////////////////////////////////////////////////////////////////////////

       case 27:

           return 1;

       break;

       default:

       {

           cout << "            \xC9\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xBB"<<endl;

           cout << "            \xBA Incorrect Choise \xBA"<<endl;

           cout << "            \xC8\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xBC"<<endl;

           cin.get();

       }

   }

   goto m1;

}

Руководство пользователя

Для запуска программы необходимо сделать двойной клик мышью на файле coder.exe.

Выбор действия осуществляется нажатием соответствующей цифровой клавиши. 1 - ввод сообщения. 2 - вывод введенной строки на экран. 3 - шифровка строки с последующим выводом на экран зашифрованного сообщения. Esc – выход из программного средства.


Заключение

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


 

А также другие работы, которые могут Вас заинтересовать

4857. Программирование на языке ассемблера 337.5 KB
  Введение Язык ассемблера — это символическое представление машинного языка. Все процессы в персональном компьютере (ПК) на самом низком, аппаратном уровне приводятся в действие только командами (инструкциями) машинного языка. По-настоящему реши...
4858. Основы микропрограммирования на языке Ассемблера. Лабораторные работы 322.5 KB
  Создание первой программы на языке Ассемблера Программирование арифметических операций Работа со строками Написание собственного обработчика прерывания Связь подпрограмм на Ассемблере с программами на языке высокого уровня Лабораторная работа №1 Со...
4859. Спектральный анализ кусочно-линейных функций с разрывами 183.5 KB
  Спектральный анализ кусочно-линейных функций с разрывами Цель работы Разработать приложение Спектральный анализ кусочно-линейных функций с разрывами. Разработать собственный компонент и использовать его в разработанном приложении. Задание к ла...
4860. Развитие языков программирования. Роль С++ в контексте современного программирования 49.5 KB
  Развитие языков программирования. Роль С++ в контексте современного программирования. Под программой будем понимать набор данных и инструкций, выполняемых вычислительным устройством с целью преобразования данных в рамках некоторой задачи, решае...
4861. Общая схема работы компилятора С++. Назначение и функционирование редактора связей. Загрузчик 52 KB
  Общая схема работы компилятора С++. Назначение и функционирование редактора связей. Загрузчик. Для оптимизации процесса перевода программы с С++ на машинный язык процесс трансляции разбивают на два этапа: промежуточная трансляция в набор объектных м...
4862. Среда разработки. Работа с проектами. Компиляция программы. Запуск программы 719 KB
  Среда разработки. Работа с проектами. Компиляция программы. Запуск программы. В принципе, для создания работающей программы на языке С++ достаточно написать исходный код в любом текстовом редакторе, передать все модули с исходным кодом программы ком...
4863. Структура программы C++. Служебные слова. Комментарии. Базовые типы данных и операции над ними 75.5 KB
  Структура программы C++. Служебные слова. Комментарии. Базовые типы данных и операции над ними. Логические операции. Побитовые операции. Преобразование типов. Базовый ввод, вывод. Служебные слова. Язык С++ имеет набор зарезервированных служебных сло...
4864. Условные операторы и операторы цикла 40.5 KB
  Условные операторы и операторы цикла. Условные операторы. Язык С++ располагает несколькими условными операторами, позволяющими организовать ветвление в программе. Оператор if реализует простое ветвление, относительно выполнения условия: if ( условие...
4865. Системы счисления. Двоичная система счисления. Перевод чисел из одной системы счисления в другую. Машинное представление базовых типов С++ 67.5 KB
  Системы счисления. Двоичная система счисления. Перевод чисел из одной системы счисления в другую. Перевод целой части. Перевод дробной части. Машинное представление базовых типов С++. Системы счисления. Под числом понимают некоторую абстрактную меру...