Загрузка данных
cout << "Зашифрованный текст: " << txt << endl;
ENDL;
system("pause");
return 0;
}
int Decryption_byte(int len, unsigned char& ch, char* txt) {
system("cls");
info();
unsigned char* p = (unsigned char*)txt;
ch = p[len - 1] & 0x01;
for (int i = len - 1; i >= 0; i--) {
p[i] &= 0xFE;
p[i] >>= 1;
if (i > 0) {
p[i] |= (p[i - 1] & 0x01) << 7;
}
}
p[0] |= ch << 7;
cout << "Расшифрованный текст: " << txt << endl;
ENDL;
system("pause");
return 0;
}
int Dynamic_Encrypt(int len, unsigned char ch, char* txt) {
system("cls");
info();
unsigned char* p = (unsigned char*)txt;
for (int i = 0; i < len; i++) {
p[i] = (p[i] + i) % 256;
}
cout << "Зашифрованный текст: " << txt << endl;
ENDL;
system("pause");
return 0;
}
int Dynamic_Decrypt(int len, unsigned char ch, char* txt) {
system("cls");
info();
unsigned char* p = (unsigned char*)txt;
for (int i = 0; i < len; i++) {
p[i] = (p[i] - i + 256) % 256;
}
cout << "Расшифрованный текст: " << txt << endl;
ENDL;
system("pause");
return 0;
}
int Caesar_Encrypt(int len, unsigned char ch, char* txt, int N) {
system("cls");
info();
const char* en_up = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
const char* en_lo = "abcdefghijklmnopqrstuvwxyz";
const char* ru_up = "\xC0\xC1\xC2\xC3\xC4\xC5\xA8\xC6\xC7\xC8\xC9\xCA\xCB\xCC\xCD\xCE\xCF\xD0\xD1\xD2\xD3\xD4\xD5\xD6\xD7\xD8\xD9\xDA\xDB\xDC\xDD\xDE\xDF";
const char* ru_lo = "\xE0\xE1\xE2\xE3\xE4\xE5\xB8\xE6\xE7\xE8\xE9\xEA\xEB\xEC\xED\xEE\xEF\xF0\xF1\xF2\xF3\xF4\xF5\xF6\xF7\xF8\xF9\xFA\xFB\xFC\xFD\xFE\xFF";
for (int i = 0; i < len; i++) {
unsigned char c = txt[i];
const char* alpha = nullptr;
int size = 0;
const char* pos = nullptr;
if ((pos = strchr(en_up, c))) { alpha = en_up; size = 26; }
else if ((pos = strchr(en_lo, c))) { alpha = en_lo; size = 26; }
else if ((pos = strchr(ru_up, c))) { alpha = ru_up; size = 33; }
else if ((pos = strchr(ru_lo, c))) { alpha = ru_lo; size = 33; }
else continue;
int idx = (int)(pos - alpha);
int normN = ((N % size) + size) % size;
txt[i] = alpha[(idx + normN) % size];
}
cout << "Зашифрованный текст (Цезарь): " << txt << endl;
ENDL;
system("pause");
return 0;
}
int Caesar_Decrypt(int len, unsigned char ch, char* txt, int N) {
system("cls");
info();
const char* en_up = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
const char* en_lo = "abcdefghijklmnopqrstuvwxyz";
const char* ru_up = "\xC0\xC1\xC2\xC3\xC4\xC5\xA8\xC6\xC7\xC8\xC9\xCA\xCB\xCC\xCD\xCE\xCF\xD0\xD1\xD2\xD3\xD4\xD5\xD6\xD7\xD8\xD9\xDA\xDB\xDC\xDD\xDE\xDF";
const char* ru_lo = "\xE0\xE1\xE2\xE3\xE4\xE5\xB8\xE6\xE7\xE8\xE9\xEA\xEB\xEC\xED\xEE\xEF\xF0\xF1\xF2\xF3\xF4\xF5\xF6\xF7\xF8\xF9\xFA\xFB\xFC\xFD\xFE\xFF";
for (int i = 0; i < len; i++) {
unsigned char c = txt[i];
const char* alpha = nullptr;
int size = 0;
const char* pos = nullptr;
if ((pos = strchr(en_up, c))) { alpha = en_up; size = 26; }
else if ((pos = strchr(en_lo, c))) { alpha = en_lo; size = 26; }
else if ((pos = strchr(ru_up, c))) { alpha = ru_up; size = 33; }
else if ((pos = strchr(ru_lo, c))) { alpha = ru_lo; size = 33; }
else continue;
int idx = (int)(pos - alpha);
int normN = ((N % size) + size) % size;
txt[i] = alpha[(idx - normN + size) % size];
}
cout << "Расшифрованный текст (Цезарь): " << txt << endl;
ENDL;
system("pause");
return 0;
}
int CIPHER() {
system("cls");
info();
cout << "В данном задании представлена реализация разных методов шифрования на введенном тексте (текст не больше 24 символов)" << endl;
ENDL;
string input;
if (!ReadStringWithESC(input)) return 0;
int len = (int)input.length();
char* txt = new char[len + 1];
memcpy(txt, input.c_str(), len + 1);
if (len == 0) {
cout << "Текст пуст!" << endl;
system("pause");
delete[] txt;
return 1;
}
unsigned char ch, ch1;
int N = 0;
do {
system("cls");
for (int i = 0; i < len; i++) {
cout << bitset<8>((unsigned char)txt[i]) << "'";
}
ENDL;
ch = (unsigned char)txt[0] & 0x80;
cout << "Текущее состояние текста: " << txt << endl;
cout << "Выберите нужный метод шифровки или расшифровки:\n";
cout << "0 - расшифровка методом битового сдвига\n";
cout << "1 - шифровка методом битового сдвига\n";
cout << "2 - расшифровка методом Цезаря\n";
cout << "3 - шифровка методом Цезаря\n";
cout << "4 - расшифровка динамическим сдвигом\n";
cout << "5 - шифровка динамическим сдвигом\n";
cout << "ESC для выхода\n";
while (!_kbhit()) Sleep(10);
ch1 = _getch();
if (ch1 == 27) break;
switch (ch1) {
case '0': Decryption_byte(len, ch, txt); break;
case '1': Incryption_byte(len, ch, txt); break;
case '2': { int N_c; cout << "\nВведите ключ (N): "; if (ReadIntWithESC(N_c)) Caesar_Decrypt(len, ch, txt, N_c); break; }
case '3': { int N_c; cout << "\nВведите ключ (N): "; if (ReadIntWithESC(N_c)) Caesar_Encrypt(len, ch, txt, N_c); break; }
case '4': Dynamic_Decrypt(len, ch, txt); break;
case '5': Dynamic_Encrypt(len, ch, txt); break;
}
} while (ch1 != 27);
delete[] txt;
return 0;
}
// ========== ГЛАВНАЯ ФУНКЦИЯ ==========
int main() {
SetConsoleTitle(L"Лабораторная работа");
setlocale(LC_ALL, "Russian");
system("chcp 1251 > nul");
srand((unsigned)time(NULL));
unsigned char ch = 0;
do {
system("cls");
info();
cout << "===========================================================\n";
cout << " МЕНЮ ПРОГРАММЫ \n";
cout << "===========================================================\n";
cout << " 1 - Лабораторная работа 1 (статический массив, 15 эл.)\n";
cout << " 2 - Лабораторная работа 2 (динамический массив)\n";
cout << " 3 - Лабораторная работа 3 (файл, поиск отрицательных)\n";
cout << " 4 - Лабиринт\n";
cout << " 5 - Маска (случайные числа от 600 до 3000)\n";
cout << " 6 - Макросы Hi, Lo, Swap\n";
cout << " 7 - Шифрование (3 метода)\n";
cout << " ESC - выход из программы\n";
cout << "===========================================================\n";
cout << "Выберите пункт: ";
ch = _getch();
cout << ch << endl;
switch (ch) {
case '1': Lab1(); break;
case '2': Lab2(); break;
case '3': Lab3(); break;
case '4': Labyrinth(); break;
case '5': MASKA(); break;
case '6': Macros(); break;
case '7': CIPHER(); break;
case 27: break;
default:
SetColor(CL_RED, CL_BLACK);
cout << "Неверный выбор! Нажмите любую клавишу...\n";
SetColor(CL_WHITE, CL_BLACK);
_getch();
break;
}
} while (ch != 27);
return 0;
}