Міністерство освіти і науки
Національний університет „Львівська політехніка”
Кафедра EОМ
Звіт
з лабораторної роботи № 1
з дисципліни: “ Захист інформації в комп’ютерних системах ”
Шифр моноалфавітної заміни (шифр Цезаря)
Варіант 16
2018
Тема: Шифр моноалфавітної заміни (шифр Цезаря)
Мета: Ознайомитись з основами класичної техніки шифрування – шифрами моноалфавітної заміни, та типовим прикладом шифрів даного виду – шифром Цезаря.
Завдання:
Розробити програму, що реалізує шифрування вихідного повідомлення за допомогою шифру Цезаря. Повідомлення, що необхідно зашифрувати, має бути задано українською мовою.
В якості ключа шифрування обирається номер студента у списку групи.
Оформити та захистити звіт.
Хід роботи:
Код реалізації алгоритму
#include <iostream>
#include <fstream>
#include <locale>
#include <vector>
using namespace std;
void encrypt (const vector<char> &alphabet, int n, const char *source, const char *target);
void decipher (const vector<char> &alphabet, int n, const char *source, const char *target);
int main(int argc, char** argv) {
string source;
string target;
string pick;
int key = 3;
setlocale(LC_ALL,"Russian_Russia.1251");
vector<char> alphabet = {
'а' , 'б' , 'в' , 'г' , 'ґ' , 'д' , 'е' , 'є' , 'ж' , 'з' , 'и' ,
'і' , 'ї' , 'й' , 'к' , 'л' , 'м' , 'н' , 'о' , 'п' , 'р' , 'с' ,
'т' , 'у' , 'ф' , 'х' , 'ц' , 'ч' , 'ш' , 'щ' , 'ь' , 'ю' , 'я'
};
if(argc == 4){
source = argv[1];
target = argv[2];
pick = argv[3];
} else if (argc == 5){
source = argv[1];
target = argv[2];
pick = argv[3];
key = static_cast<int >(*argv[4]);
} else {
std::cout << "How to use: <source> <target> <coding/decoding> <key>" << std::endl;
return 0;
}
if(pick == "coding") {
encrypt(alphabet, key, source.c_str(), target.c_str());
return 0;
} else if ( pick == "decoding"){
decipher(alphabet, key, source.c_str(), target.c_str());
return 0;
} else {
std::cout << "How to use: <source> <target> <coding/decoding> <key>" << std::endl;
return 0;
}
}
void encrypt (const vector<char> &alphabet, int n, const char *source, const char *target)
{
ifstream from(source);
ofstream to(target);
from >> std::noskipws;
bool flag;
bool upperflag;
char c;
while (from >> c)
{
flag = false;
if(isupper(c)){
c = static_cast<char>(tolower(c));
upperflag = true;
}
else upperflag = false;
vector<char>::size_type i = 0;
while(i != alphabet.size() && alphabet[i] != c) i++;
if (i != alphabet.size())
{
c = alphabet[(i + n) % alphabet.size()];
if(upperflag) c = static_cast<char>(toupper(c));
to << c;
flag = true;
}
if (!flag) to << c;
}
}
void decipher (const vector<char> &alphabet, int n, const char *source, const char *target)
{
ifstream from(source);
ofstream to(target);
from >> std::noskipws;
bool flag;
bool upperflag;
char c;
while (from >> c)
{
flag = false;
if(isupper(c)){
c = static_cast<char>(tolower(c));
upperflag = true;
}
else upperflag = false;
vector<char>::size_type i = 0;
while(i != alphabet.size() && alphabet[i] != c) i++;
if (i != alphabet.size())
{
c = alphabet[(alphabet.size() + (i - n)) % alphabet.size()];
if(upperflag) c = static_cast<char>(toupper(c));
to << c;
flag = true;
}
if (!flag) to << c;
}
}
/
Рис. 1. Зразок тексту для кодування
/
Рис. 2. Текст після кодування
Висновок
На даній лабораторній роботі я ознайомився з основами класичної техніки шифрування – шифрами моноалфавітної заміни, та типовим прикладом шифрів даного виду – шифром Цезаря, також я розробив програмну реалізацію даного шифру.