close

Вход

Забыли?

вход по аккаунту

?

Laboratornaya rabota 2

код для вставкиСкачать

Название
Разработка программы шифрования/дешифрирования текста с использованием подстановочного шифра.
Лабораторное задание
Разработать программу, выполняющую шифрование/дешифрирование текстового файла с использованием одного из типов подстановочного шифра. Тип шифра устанавливается в соответствии с номером варианта. В программе должна быть предусмотрена возможность генерации алфавита и сохранение его в отдельном файле, который следует использовать при шифровании/дешифрировании.
Вариант задания
Вариант: 4
Однозвучный подстановочный шифр
(4 двухзначных числа для каждого символа исходного алфавита, при шифровании вариант замены выбирается последовательным перебором вариантов подстановки).
Листинг
Файл Main_class.h
#pragma once
#define MIN_SIZE 10240
#include <stdio.h>
#include <conio.h>
#include <cstdio>
#include <iostream>
#include <fstream>
#include <string>
#include <stdlib.h>
#include <list>
#include <locale.h>
#include <time.h>
using namespace std;
class Main_class
{
public:
Main_class(void);
~Main_class(void);
void OpenFileInp(bool);
void OpenFileOut();
void GenAlph();
void Encoding();
void Decoding();
char Poisk(int);
private:
string fileName;
int counter;
list< char* > data;
int **alph;
int viborka[32];
char choise;
ifstream data_in;
ofstream data_out;
int size_block;
};
Файл Main_class.cpp
#include "Main_class.h"
Main_class::Main_class(void)
{
bool control = false;
alph = new int* [32];
for(int i = 0; i < 32; i++)
{
alph[i] = new int[4];
}
size_block = 48;
cout << "Программа шифрации и дешифрации информации с помощью однозвучного подстановочного шифра!!!" << endl;
system("PAUSE");
system("cls");
while(!control)
{
do{
cout << "Выберите соответствующую функцию:" << endl << "1.Генерация алфавита" << endl << "2.Шифрация" << endl << "3.Дешифрация" << endl << "4.Выход" << endl;
cin.get(choise);
}while((choise != '1') && (choise != '2') && (choise != '3') && (choise != '4'));
system("cls");
switch(choise) {
case '1':
{
GenAlph();
system("cls");
break;
}
case '2':
{
Encoding();
system("cls");
break;
}
case '3':
{
Decoding();
system("cls");
break;
}
case '4':
{
control = true;
}
}
}
}
void Main_class::GenAlph()
{
int numb = -63;
int index = 0;
int promej = 0;
int* genstr = new int [128];
for(int i = 0; i < 128; i++)
{
genstr[i] = (numb++);
if(numb == -9)
{
numb = numb + 20;
}
}
srand(time(NULL));
for(int i = 0; i < 64; i++)
{
index = rand() % 127;
promej = genstr[i];
genstr[i] = genstr[index];
genstr[index] = promej;
}
index = 0;
for(int i = 0; i < 32; i++)
{
for(int j = 0; j < 4; j++)
{
alph[i][j] = genstr[index];
index++;
}
}
cout << "Введите путь и имя файла для сохранения алфавита:" << endl;
OpenFileOut();
for(int i = 0; i < 32; i++)
{
for(int j = 0; j < 4; j++)
{
data_out << alph[i][j];
if(j != 3)
data_out << " ";
}
if(i != 31)
data_out << endl;
}
data_out.close();
cout << "Алфавит успешно сгенерирован" << endl;
}
void Main_class::Encoding()
{
memset(viborka,0,sizeof(viborka));
char ch = 0;
int index = 0;
int i = 0;
int j = 0;
cout << "Введите путь и название файла с алфавитом:" << endl;
OpenFileInp(true);
while(data_in)
{
data_in >> alph[i][j]; j++;
if(j > 3)
{
j = 0;
i++;
}
}
data_in.close();
cout << "Введите путь и название файла с исходным текстом:" << endl;
OpenFileInp(false);
cout << "Введите путь и название файла, куда будет записан зашифрованный текст:" << endl;
OpenFileOut();
while(data_in)
{
data_in.get(ch);
if(data_in)
{
if((ch >= -64)&&(ch <= -1))
{
if((ch >= -64)&&(ch <= -33))
{
ch = ch + 32;
}
index = 32 + ch;
data_out << alph[index][(viborka[index])];
viborka[index] = viborka[index] + 1;
if(viborka[index] > 3)
{
viborka[index] = 0;
}
}
else
{
data_out << ch;
}
}
}
data_in.close();
data_out.close();
}
void Main_class::Decoding()
{
char ch_mass [3];
char ch = 0;
int el = 0;
int i = 0;
int j = 0;
int pred = 0;
cout << "Введите путь и название файла с алфавитом:" << endl;
OpenFileInp(true);
while(data_in)
{
data_in >> alph[i][j];
j++;
if(j > 3)
{
j = 0;
i++;
}
}
data_in.close();
i = 0;
cout << "Введите путь и название файла с зашифрованным текстом:" << endl;
OpenFileInp(false);
cout << "Введите путь и название файла, куда будет записан расшифрованный текст:" << endl;
OpenFileOut();
while(data_in)
{
ch = data_in.get();
if((ch != ' ') && (ch != ',') && (ch != '.'))
{
if(ch == '-')
{
pred = 2;
}
ch_mass[i] = ch;
i++;
}
else
{
data_out << ch;
i = 0;
}
if(i > pred)
{
el = atoi(ch_mass);
data_out << (Poisk(el));
memset(ch_mass,0,sizeof(ch_mass));
i = 0;
pred = 1;
}
}
data_in.close();
data_out.close();
}
char Main_class::Poisk(int number)
{
for(char i = 0; i < 32; i++)
{
for(char j = 0; j < 4; j++)
{
if(alph[i][j] == number)
return (i - 32);
}
}
}
void Main_class::OpenFileInp(bool mode)
{
do{
cout << "\t\tОткрытие файла на чтение" << endl;
cout << "Введите имя файла и путь к нему:" << endl;
cin.ignore(cin.rdbuf()->in_avail());
getline(cin, fileName);
if(mode)
data_in.open(fileName.c_str(), ios::in);
else
data_in.open(fileName.c_str(), ios::in | ios::binary);
if(!data_in.is_open())
{
cout << "Ошибка при работе с файлом" << endl;
getch();
}
system("cls");
}while(!data_in.is_open());
}
void Main_class::OpenFileOut()
{
do{
cout << "\t\tОткрытие файла на запись" << endl;
cout << "Введите имя файла и путь к нему:" << endl;
cin.ignore(cin.rdbuf()->in_avail());
getline(cin, fileName);
data_out.open(fileName.c_str(), ios::out);
if(!data_out.is_open())
{
cout << "Ошибка при работе с файлом" << endl;
getch();
}
system("cls");
}while(!data_out.is_open());
}
Main_class::~Main_class(void)
{
}
Файл main.cpp
#include "Main_class.h"
void main()
{
setlocale(LC_ALL, "Russian");
Main_class object;
}
Результаты работы программы На рисунке №1 представлено содержимое алфавита:
Рисунок 1 - содержимое алфавита
На рисунке №2 представлено содержимое файла до шифрования: Рисунок 2 - содержимое файла до шифрования
На рисунке №3 представлено содержимое файла после дешифрования:
Рисунок 3 - содержимое файла после дешифрования
Вывод
Мы получили полезные навыки шифрования и дешифрования текстового файла с использованием языка С++.
Документ
Категория
Рефераты
Просмотров
4
Размер файла
128 Кб
Теги
rabota, laboratornaya
1/--страниц
Пожаловаться на содержимое документа