Загрузка данных


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;
}