Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Румбешт_Уч.пос._для печати.doc
Скачиваний:
0
Добавлен:
01.04.2025
Размер:
11.86 Mб
Скачать

Общая постановка задачи

В лабораторной работе требуется:

1. Изучить разделы 2.3.1, 2.3.2 и теоретическую часть к данной лабораторной работе.

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

  • задание в командной строке режима работы (шифрование/расшифрование), имени входного файла, имени результирующего файла;

  • ввод ключа шифрования/расшифрования с клавиатуры;

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

3. Зашифровать и расшифровать файл, с использованием разработанной программы.

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

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

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

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

№ варианта

Задание

1

Осуществить программную реализацию шифра скитала

2

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

3

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

4

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

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

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

№ варианта

Задание

5

Осуществить программную реализацию шифра Цезаря

6

Осуществить программную реализацию аффинного шифра Цезаря

7

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

8

Осуществить программную реализацию шифра Трисемуса

9

Осуществить программную реализацию шифра Вижинера

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

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

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

#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. Результат расшифрования.

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