Всем привет, в этой теме мы напишем и разберем с вами код на С++, с помощю которого сможем шифровать и дешифровать наши .txt файли на компьютеры Что ж, начнем с импорта библиотек: #include <iostream> #include <cstring> #include <fstream> #include <sstream> #include <cstdint> C #include <iostream> #include <cstring> #include <fstream> #include <sstream> #include <cstdint> iostream для ввода и вывода данных. cstring для работы с C-строками. fstream для работы с файлами. sstream для работы с потоками строк. cstdint для использования фиксированных целочисленных типов. Константы и глобальные переменные const char* all_english_letters_and_numbers = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890"; const int length = strlen(all_english_letters_and_numbers); 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. Функция чтения файла 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; } 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. Функция обработки текста 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; } 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. Функция обработки текста (шифрование/дешифрование) 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; } 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 позиций (вперед для шифрования и назад для дешифрования). Если символ не найден, он остается неизменным. Возвращается указатель на обработанный текст. Функция записи в файл 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; } 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. Главная функция 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; } 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; } Не забудьте скомпилировать ваш файл Для использования, вводим в консоль данную команду(windows): ./compiled_file.exe text.txt key_number --encrypt/decrypt Мой GitHub: https://github.com/yerkovlad Исходники: https://github.com/yerkovlad/file_encryption/tree/main