Список индивидуальных данных

Данные для выполнения лабораторной работы сведены в табл.Л1.2.

Таблица Л1.2 (начало)

Варианты заданий к лабораторной работе №1

№ варианта Задание
Осуществить программную реализацию шифра скитала
Осуществить программную реализацию простой шифрующей таблицы перестановки
Осуществить программную реализацию одиночной перестановки по ключу
Осуществить программную реализацию двойной перестановки по ключу

Таблица Л1.2 (окончание)

Варианты заданий к лабораторной работе №1

№ варианта Задание
Осуществить программную реализацию шифра Цезаря
Осуществить программную реализацию аффинного шифра Цезаря
Осуществить программную реализацию шифра Цезаря с ключевым словом
Осуществить программную реализацию шифра Трисемуса
Осуществить программную реализацию шифра Вижинера

Пример выполнения работы

Пусть требуется осуществить программную реализацию шифра Цезаря. Напишем следующую программу.

//----------------------------------------------------------------------------

#include <iostream.h> // Потоковый ввод/вывод

#include <conio.h> // getch

#include <windows.h> // CharToOem

#define SIZE_BUF 1024 // Размер буфера ввода/вывода

//-----------------------------------------------------------------------------

// Функция перекодировки для вывода сообщений на русском языке

char strdos[256];

char* dos(char* strw){

CharToOem(strw,strdos);

return strdos;

}

//------------------------------------------------------------------------------

// Функция поиска элемента x в массиве buf длиной n

// Возвращает индекс элемента, если он найден,

// и –1 в противном случае

int Search(char* buf,int n,char x){

int i;

for(i=0;buf[i]!=x && i<n;i++);

return (i!=n ? i : -1);

}

//------------------------------------------------------------------------------

// Программа шифрования данных

// argc=4

// argv[1] – режим работы (e – шифрование, d – расшифрование)

// argv[2] – имя входного файла

// argv[3] – имя выходного файла

int main(int argc, char* argv[])

{

char abc[]="абвгдежзийклмнопрстуфхцчшщьыъэюя";// Алвавит

char Buf[SIZE_BUF]; // Буфер чтения/записи

int key; // Ключ

cout<<dos("Шифр Цезаря для русского алфавита\n");

if(argc==4 && (*argv[1]=='e' || *argv[1]=='d')){

FILE* In=fopen(argv[2],"rb");

if(In==NULL){

cout<<dos("Ошибка открытия файла...\n");

getch(); return 1;

}

FILE* Out=fopen(argv[3],"wb");

if(Out==NULL){

fclose(In);

cout<<dos("Ошибка открытия файла...\n");

getch(); return 1;

}

clearerr(In); clearerr(Out);

cout<<dos("Введите ключ (целое число от 0 до 31: ");

cin>>key;

if(key < 0 || key > 31){

cout<<dos("Не верный ключ...\n");

fclose(In); fclose(Out);

getch(); return 1;

}

while(!feof(In)){ // Пока не конец входного файла

int LenBuf=fread(Buf,1,SIZE_BUF,In); // Читаем в буфер

if(ferror(In)){

fclose(In); fclose(Out);

cout<<dos("Ошибка чтения...\n");

getch(); return 1;

}

for(int i=0;i<LenBuf;i++){ // Для всех символов в буфере

int code=Search(abc,32,Buf[i]);

if(code!=-1){ // Если символ подлежит преобразованию

if(*argv[1]=='e')

code=(code+key)%32; // Код шифрования

else code=(code-key+32)%32; // Код расшифрования

Buf[i]=abc[code]; // Шифрование/Расшифрование

}

}

fwrite(Buf,1,LenBuf,Out); // Пишем в выходной файл

if(ferror(Out)){

fclose(In); fclose(Out);

cout<<dos("Ошибка записи...\n");

getch(); return 1;

}

}

fclose(In); fclose(Out);

cout<<dos("Файл ")<<argv[2];

cout<<dos(*argv[1]=='e' ? " зашифрован":" расшифрован")<<endl;

cout<<dos("Результат в ")<<argv[3]<<endl;

}

else{

cout<<dos("Формат командной строки: ");

cout<<"Cesar e/d infile outfile\n";

cout<<dos("e - шифрование, d - расшифрование,\n");

cout<<dos("infile - имя входного файла,\n");

cout<<dos("outfile - имя выходного файла.\n");

}

getch();

return 0;

}

//-----------------------------------------------------------------------------------

Эта программа осуществляет шифрование/расшифрование Цезаря для русскоязычных текстов, содержащих строчные буквы. Алфавитом является:

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

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

Подготовим файл для шифрования (пусть это будет file1.txt). Запустим нашу программу на выполнение: cesar e file1.txt file2.txt. На рис. Л1.6 приведена экранная форма программы.

 

Рис. Л1.6. Экранная форма программы шифрования.

 

Содержание исходного и зашифрованного файлов представлено на рис. Л1.7.

 

 
Рис. Л1.7. Результат шифрования.

 

Запустим теперь нашу программу на выполнение в режиме расшифрования: cesar d file2.txt file3.txt. На рис. Л1.8 приведена экранная форма программы.

 

Рис. Л1.8. Экранная форма программы расшифрования.

 

Содержание зашифрованного и расшифрованного файлов представлено на рис. Л1.9.

 

 
Рис. Л1.9. Результат расшифрования.

 

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

Контрольные вопросы к защите

1. В чем заключается принцип шифрования перестановкой?

2. Охарактеризуйте шифр скитала. Приведите примеры шифрования/расшифрования.

3. Охарактеризуйте способ шифрования с помощью простой шифрующей таблицы перестановки. Приведите примеры шифрования/расшифрования.

4. Опишите шифрование одиночной перестановкой по ключу. Приведите примеры шифрования/расшифрования.

5. Опишите шифрование двойной перестановкой по ключу. Приведите примеры шифрования/расшифрования.

6. В чем заключается принцип шифрования заменой?

7. В чем разница между шифрами простой и шифрами сложной замены?

8. Охарактеризуйте шифр Цезаря. Приведите примеры шифрования/расшифрования.

9. Охарактеризуйте аффинный шифр Цезаря. Приведите примеры шифрования/расшифрования.

10. Охарактеризуйте шифр Цезаря с ключевым словом. Приведите примеры шифрования/расшифрования.

11. Охарактеризуйте шифр Трисемуса. Приведите примеры шифрования/расшифрования.

12. Охарактеризуйте шифр Вижиненера. Приведите примеры шифрования/расшифрования.

Способ оценки результатов

При оценке результатов выполнения лабораторной работы оценивается:

· знание программного материала;

· грамотность и аккуратность оформления отчета по лабораторной работе;

· глубина и полнота ответов на контрольные вопросы.

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

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

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

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