Загрузка...

Шифрование .txt файлов шифром Цезаря на С++

Тема в разделе C/C++ создана пользователем yevlad 14 июл 2024. 340 просмотров

Загрузка...
  1. yevlad
    yevlad Автор темы 14 июл 2024 лучшая разработка - https://lolz.live/threads/7816037 244 19 май 2023
    Всем привет, в этой теме мы напишем и разберем с вами код на С++, с помощю которого сможем шифровать и дешифровать наши .txt файли на компьютеры

    Что ж, начнем с импорта библиотек:
    C
    #include <iostream>
    #include <cstring>
    #include <fstream>
    #include <sstream>
    #include <cstdint>
    • iostream для ввода и вывода данных.
    • cstring для работы с C-строками.
    • fstream для работы с файлами.
    • sstream для работы с потоками строк.
    • cstdint для использования фиксированных целочисленных типов.

    Константы и глобальные переменные
    C
    const char* all_english_letters_and_numbers = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890";
    const int length = strlen(all_english_letters_and_numbers);
    • all_english_letters_and_numbers — строка, содержащая все английские буквы и цифры.
    • length — длина этой строки, используемая для циклического шифрования.
    Что означает const? Слово const указывает, что значение переменной является константой и сообщает компилятору, чтобы предотвратить его изменение программистом.
    Что означает char*? В С++ char, это тип данных/предоставленния символов, * в этом примере означает, что тип данных динамичный, типе данных char в С++, один символ = 1 байт, тоесть строка all_english_letters_and_numbers занимает 62 байта.
    В С++ также можно указывать так: ⁡char str_name[20]; ⁡ в этом примере строка str_name, даже если пустая, в нашей памяти выделила и будет занимать 20 байт, если в такой строке записать больше чем 20 символов, компилятор не сможет скомпилировать и это приведет к ошибкам.
    Что такое int? int - числовой 32-битный тип данных, это означает что максимальное число этого типа это 2,147,483,647.
    strlen() - это функция для вычисления длины нашей с вами строки all_english_letters_and_numbers.

    Функция чтения файла
    C

    char* readFile(const char* file_name) {
    std::ifstream ifs(file_name, std::ios::in);
    if (!ifs) {
    std::cerr << "Error: Incorrect file name: " << file_name << std::endl;
    return nullptr;
    }

    std::string file_content;
    std::string line;
    while (std::getline(ifs, line)) {
    file_content += line + "\n";
    }

    char* result = new char[file_content.size() + 1];
    std::strcpy(result, file_content.c_str());

    return result;
    }
    Функция чтение файлов понадобиться нам для того чтобы считивать текст/информацию с нашых .txt файлов, для дальнейшей шифрации.

    • Открывается файл с именем file_name для чтения.
    • Если файл не может быть открыт, выводится ошибка, и функция возвращает nullptr.
    • Читается содержимое файла построчно и сохраняется в file_content.
    • Создается динамический массив result, в который копируется содержимое file_content.
    • Возвращается указатель на result.
    Функция обработки текста
    C
    char* processText(const char* text, int64_t key, bool encrypt) {
    int text_length = strlen(text);
    char* processed_text = new char[text_length + 1];
    int actual_key = key % length;

    for (int i = 0; i < text_length; ++i) {
    bool found = false;
    for (int j = 0; j < length; ++j) {
    if (text[i] == all_english_letters_and_numbers[j]) {
    if (encrypt) {
    processed_text[i] = all_english_letters_and_numbers[(j + actual_key) % length];
    } else {
    processed_text[i] = all_english_letters_and_numbers[(j - actual_key + length) % length];
    }
    found = true;
    break;
    }
    }
    if (!found) {
    processed_text[i] = text[i];
    }
    }

    processed_text[text_length] = '\0';
    return processed_text;
    }
    • Открывается файл с именем file_name для чтения.
    • Если файл не может быть открыт, выводится ошибка, и функция возвращает nullptr.
    • Читается содержимое файла построчно и сохраняется в file_content.
    • Создается динамический массив result, в который копируется содержимое file_content.
    • Возвращается указатель на result.
    Функция обработки текста (шифрование/дешифрование)
    C
    char* processText(const char* text, int64_t key, bool encrypt) {
    int text_length = strlen(text);
    char* processed_text = new char[text_length + 1];
    int actual_key = key % length;

    for (int i = 0; i < text_length; ++i) {
    bool found = false;
    for (int j = 0; j < length; ++j) {
    if (text[i] == all_english_letters_and_numbers[j]) {
    if (encrypt) {
    processed_text[i] = all_english_letters_and_numbers[(j + actual_key) % length];
    } else {
    processed_text[i] = all_english_letters_and_numbers[(j - actual_key + length) % length];
    }
    found = true;
    break;
    }
    }
    if (!found) {
    processed_text[i] = text[i];
    }
    }

    processed_text[text_length] = '\0';
    return processed_text;
    }
    • text — текст для обработки (шифрования/дешифрования).
    • key — ключ для шифрования/дешифрования.
    • encrypt — флаг, указывающий, шифровать ли текст.
    • actual_key — ключ, уменьшенный по модулю длины строки all_english_letters_and_numbers.
    • Цикл проходит по каждому символу текста. Если символ найден в all_english_letters_and_numbers, он сдвигается на actual_key позиций (вперед для шифрования и назад для дешифрования). Если символ не найден, он остается неизменным.
    • Возвращается указатель на обработанный текст.
    Функция записи в файл
    C
    bool writeToFile(const char* file_name, const char* text) {
    std::ofstream ofs(file_name, std::ios::out | std::ios::trunc);
    if (!ofs) {
    std::cerr << "Error: Could not open the file " << file_name << " for writing." << std::endl;
    return false;
    }

    ofs << text;

    if (!ofs) {
    std::cerr << "Error: Writing to the file " << file_name << " failed." << std::endl;
    return false;
    }

    ofs.close();
    return true;
    }
    • Открывается файл с именем file_name для записи.
    • Если файл не может быть открыт, выводится ошибка и возвращается false.
    • Записывается текст text в файл.
    • Проверяется успешность записи, если нет — выводится ошибка и возвращается false.
    • Закрывается файл и возвращается true.
    Главная функция
    C
    int main(int argc, char** argv) {
    if (argc != 4) {
    std::cerr << "Error: Incorrect number of arguments. Usage: <program> <file_name.txt> <key> <--encrypt|--decrypt>" << std::endl;
    return 1;
    }

    const char* file_name = argv[1];
    int64_t key = 0;
    const char* type = argv[3];

    if (strstr(file_name, ".txt") == nullptr) {
    std::cerr << "Error: The file name must end with .txt" << std::endl;
    return 1;
    }

    if (!isNumber(argv[2])) {
    std::cerr << "Error: The key is not a number" << std::endl;
    return 1;
    } else {
    key = std::stoll(argv[2]);
    }

    if (strcmp(type, "--encrypt") != 0 && strcmp(type, "--decrypt") != 0) {
    std::cerr << "Error: You have not written the correct type(--encrypt or --decrypt)" << std::endl;
    return 1;
    }

    char* file_content = readFile(file_name);
    if (!file_content) {
    return 1;
    }

    char* result = nullptr;
    if (strcmp(type, "--encrypt") == 0) {
    result = processText(file_content, key, true);
    } else {
    result = processText(file_content, key, false);
    }

    if (result) {
    if (!writeToFile(file_name, result)) {
    std::cerr << "Error: Writing to file failed." << std::endl;
    }
    delete[] result;
    }

    delete[] file_content;

    return 0;
    }
    :smile_stop: Не забудьте скомпилировать ваш файл

    Для использования, вводим в консоль данную команду(windows): ⁡./compiled_file.exe text.txt key_number --encrypt/decrypt ⁡

    Мой GitHub: https://github.com/yerkovlad
    Исходники: https://github.com/yerkovlad/file_encryption/tree/main
     
    14 июл 2024 Изменено
  2. Арбузим
    Арбузим 18 июл 2024 Ух биля какой арбуз https://lolz.live/threads/8642846/ 810 22 авг 2022
    вместо #include <cstring> можно же обычный string, так быстрее и лучше будет
     
    1. yevlad Автор темы
      Арбузим, спасибо за совет, и вправду нужно было сделать именно так
Top