Данные для выполнения лабораторной работы сведены в табл.Л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. Охарактеризуйте шифр Вижиненера. Приведите примеры шифрования/расшифрования.
Способ оценки результатов
При оценке результатов выполнения лабораторной работы оценивается:
· знание программного материала;
· грамотность и аккуратность оформления отчета по лабораторной работе;
· глубина и полнота ответов на контрольные вопросы.
Отметка "отлично" выставляется студенту, глубоко и прочно усвоившему программный материал, исчерпывающе, последовательно, грамотно и логически стройно его излагающему, ответившему на все контрольные вопросы, грамотно и аккуратно оформившему лабораторную работу.
Отметка "хорошо" выставляется студенту, твердо знающему программный материал, грамотно и по существу его излагающему, имеющему представление о решении дополнительных заданий, ответившему на все контрольные вопросы, грамотно и аккуратно оформившему лабораторную работу.
Отметка "удовлетворительно" выставляется студенту, который знает только основной материал, но не усвоил его деталей, допускает в ответе неточности, имеющему расплывчатое представление о решении некоторых дополнительных заданий, ответившему на все контрольные вопросы, оформившему лабораторную работу с нарушением некоторых несущественных требований.
Отметка "неудовлетворительно" выставляется студенту, который не знает значительной части программного материала, допускает существенные ошибки, не имеет представление о решении ряда дополнительных заданий, не ответившему на контрольные вопросы, оформившему лабораторную работу с существенными нарушениями.