В общем, написал относительно простую программу, которая шифрует текстовые ********* и сохраняет их в другой файл, зашифрованные с расширением .lolz, просьба оценить. Ну или если есть какие-то предложения, предлагайте =) Dropmefiles VT (VT почему-то 3 детектят, но я сам писал хз, может, из-за маленького размера) В любом случае, для тех кто не хотят скачивать есть исходный код: КОД #include <windows.h> #include <string> #include <iostream> #include <fstream> #include <conio.h> #include <ctime> using namespace std; string fastGetD() { DWORD nBuffer = MAX_PATH; char buffer[MAX_PATH] = {}; GetCurrentDirectoryA(nBuffer, buffer); return buffer; } string encrypt(string, int); string decrypt(string, int); string toFileName(); string getFunc(); int getKey(string); int main() { SetConsoleTitle(L"CRYPT 1.0 by @WhalesNik"); setlocale(LC_ALL, "Russian"); string argv = ""; char ch = '\n'; while (ch != 'X' && ch != 'x') { argv = getFunc(); srand(time(0)); ifstream in; ofstream out; if (argv == "-d" || argv == "-e") { int key; if (argv == "-e") { key = rand() % 10 + 1; string userFile = ""; cout << "\tВВЕДИТЕ ПОЛНЫЙ ПУТЬ К ФАЙЛУ ИЛИ ПЕРЕТАЩИТЕ ЕГО В ОКНО ПРОГРАММЫ: "; cin >> userFile; if (userFile[0] == '\"') { userFile.erase(userFile.begin()); userFile.erase(userFile.end()); } string filename = "userInputFile" + toFileName() + ".lolz"; out.open(filename.c_str()); out.close(); in.open(filename.c_str()); if (in.is_open()) cout << "\t\tСОЗДАН ЗАШИФРОВАННЫЙ ФАЙЛ: " << filename << endl; else { cout << "\t\tОШИБКА СОЗДАНИЯ ФАЙЛА" << endl; in.close(); return 0; } in.close(); out.open(filename.c_str()); in.open(userFile.c_str()); out << key << endl; string str = ""; bool first = 1; while (getline(in, str)) { cout << "READING: " << str << endl; out << (first ? "" : "\n") << encrypt(str, key); first = 0; } in.close(); out.close(); cout << "\n\tCOMPLETE!\n"; } else if (argv == "-d") { string userFile = ""; cout << "\tВВЕДИТЕ ПОЛНЫЙ ПУТЬ К ФАЙЛУ ИЛИ ПЕРЕТАЩИТЕ ЕГО В ОКНО ПРОГРАММЫ: "; cin >> userFile; if (userFile[0] == '\"') { userFile.erase(userFile.begin()); userFile.erase(userFile.end()); } string filename = "userInputFile" + toFileName() + ".txt"; out.open(filename.c_str()); out.close(); in.open(filename.c_str()); if (in.is_open()) cout << "\t\tСОЗДАН РАСШИФРОВАННЫЙ ФАЙЛ: " << filename << endl; else { cout << "\t\tОШИБКА СОЗДАНИЯ ФАЙЛА" << endl; in.close(); return 0; } in.close(); key = getKey(userFile); out.open(filename.c_str()); in.open(userFile.c_str()); string str = ""; bool first = 1; getline(in, str); while (getline(in, str)) { out << (first ? "" : "\n") << decrypt(str, key); first = 0; } in.close(); out.close(); cout << "\n\tCOMPLETE!\n"; } } else { cout << "\t\tНЕИЗВЕСТНОЕ ЗНАЧЕНИЕ!\nПЕРЕЗАПУСТИТЕ ПРОГРАММУ!\n"; } ch = _getch(); system("cls"); } return 0; } string encrypt(string str, int key) { for (int i = 0; i < (int)str.size(); i++) { if (str[i] >= 'a' && str[i] <= 'z') { str[i] = str[i] + key; if (str[i] > 'z') { str[i] = str[i] - 'z' + 'a' - 1; } } else if (str[i] >= 'A' && str[i] <= 'Z') { str[i] = str[i] + key; if (str[i] > 'Z') { str[i] = str[i] - 'Z' + 'A' - 1; } } } return str; } string decrypt(string str, int key) { for (int i = 0; i < (int)str.size(); i++) { if (str[i] >= 'a' && str[i] <= 'z') { str[i] = str[i] - key; if (str[i] < 'a') { str[i] = str[i] + 'z' - 'a' + 1; } } else if (str[i] >= 'A' && str[i] <= 'Z') { str[i] = str[i] - key; if (str[i] < 'A') { str[i] = str[i] + 'Z' - 'A' + 1; } } } return str; } string toFileName() { char buffer[80]; time_t seconds = time(NULL); tm* timeinfo = localtime(&seconds); const char* format = "%d_%m_%Y_%H_%M_%S"; strftime(buffer, 80, format, timeinfo); return buffer; } int getKey(string filename) { ifstream in; in.open(filename.c_str()); int key; in >> key; in.close(); return key; } string getFunc() { int ch = 0; bool choose = 0; while (ch != 13) { cout << "\t@Whales_Nik\n"; cout << "\n\n\tЗАШИФРОВАТЬ ФАЙЛ" << (choose ? "\n" : "\t<-\n"); cout << "\tРАСШИФРОВАТЬ ФАЙЛ" << (choose ? "\t<-\n" : "\n"); ch = _getch(); if (ch == 72 || ch == 80) choose = !choose; system("cls"); } return (choose ? "-d" : "-e"); } C #include <windows.h> #include <string> #include <iostream> #include <fstream> #include <conio.h> #include <ctime> using namespace std; string fastGetD() { DWORD nBuffer = MAX_PATH; char buffer[MAX_PATH] = {}; GetCurrentDirectoryA(nBuffer, buffer); return buffer; } string encrypt(string, int); string decrypt(string, int); string toFileName(); string getFunc(); int getKey(string); int main() { SetConsoleTitle(L"CRYPT 1.0 by @WhalesNik"); setlocale(LC_ALL, "Russian"); string argv = ""; char ch = '\n'; while (ch != 'X' && ch != 'x') { argv = getFunc(); srand(time(0)); ifstream in; ofstream out; if (argv == "-d" || argv == "-e") { int key; if (argv == "-e") { key = rand() % 10 + 1; string userFile = ""; cout << "\tВВЕДИТЕ ПОЛНЫЙ ПУТЬ К ФАЙЛУ ИЛИ ПЕРЕТАЩИТЕ ЕГО В ОКНО ПРОГРАММЫ: "; cin >> userFile; if (userFile[0] == '\"') { userFile.erase(userFile.begin()); userFile.erase(userFile.end()); } string filename = "userInputFile" + toFileName() + ".lolz"; out.open(filename.c_str()); out.close(); in.open(filename.c_str()); if (in.is_open()) cout << "\t\tСОЗДАН ЗАШИФРОВАННЫЙ ФАЙЛ: " << filename << endl; else { cout << "\t\tОШИБКА СОЗДАНИЯ ФАЙЛА" << endl; in.close(); return 0; } in.close(); out.open(filename.c_str()); in.open(userFile.c_str()); out << key << endl; string str = ""; bool first = 1; while (getline(in, str)) { cout << "READING: " << str << endl; out << (first ? "" : "\n") << encrypt(str, key); first = 0; } in.close(); out.close(); cout << "\n\tCOMPLETE!\n"; } else if (argv == "-d") { string userFile = ""; cout << "\tВВЕДИТЕ ПОЛНЫЙ ПУТЬ К ФАЙЛУ ИЛИ ПЕРЕТАЩИТЕ ЕГО В ОКНО ПРОГРАММЫ: "; cin >> userFile; if (userFile[0] == '\"') { userFile.erase(userFile.begin()); userFile.erase(userFile.end()); } string filename = "userInputFile" + toFileName() + ".txt"; out.open(filename.c_str()); out.close(); in.open(filename.c_str()); if (in.is_open()) cout << "\t\tСОЗДАН РАСШИФРОВАННЫЙ ФАЙЛ: " << filename << endl; else { cout << "\t\tОШИБКА СОЗДАНИЯ ФАЙЛА" << endl; in.close(); return 0; } in.close(); key = getKey(userFile); out.open(filename.c_str()); in.open(userFile.c_str()); string str = ""; bool first = 1; getline(in, str); while (getline(in, str)) { out << (first ? "" : "\n") << decrypt(str, key); first = 0; } in.close(); out.close(); cout << "\n\tCOMPLETE!\n"; } } else { cout << "\t\tНЕИЗВЕСТНОЕ ЗНАЧЕНИЕ!\nПЕРЕЗАПУСТИТЕ ПРОГРАММУ!\n"; } ch = _getch(); system("cls"); } return 0; } string encrypt(string str, int key) { for (int i = 0; i < (int)str.size(); i++) { if (str[i] >= 'a' && str[i] <= 'z') { str[i] = str[i] + key; if (str[i] > 'z') { str[i] = str[i] - 'z' + 'a' - 1; } } else if (str[i] >= 'A' && str[i] <= 'Z') { str[i] = str[i] + key; if (str[i] > 'Z') { str[i] = str[i] - 'Z' + 'A' - 1; } } } return str; } string decrypt(string str, int key) { for (int i = 0; i < (int)str.size(); i++) { if (str[i] >= 'a' && str[i] <= 'z') { str[i] = str[i] - key; if (str[i] < 'a') { str[i] = str[i] + 'z' - 'a' + 1; } } else if (str[i] >= 'A' && str[i] <= 'Z') { str[i] = str[i] - key; if (str[i] < 'A') { str[i] = str[i] + 'Z' - 'A' + 1; } } } return str; } string toFileName() { char buffer[80]; time_t seconds = time(NULL); tm* timeinfo = localtime(&seconds); const char* format = "%d_%m_%Y_%H_%M_%S"; strftime(buffer, 80, format, timeinfo); return buffer; } int getKey(string filename) { ifstream in; in.open(filename.c_str()); int key; in >> key; in.close(); return key; } string getFunc() { int ch = 0; bool choose = 0; while (ch != 13) { cout << "\t@Whales_Nik\n"; cout << "\n\n\tЗАШИФРОВАТЬ ФАЙЛ" << (choose ? "\n" : "\t<-\n"); cout << "\tРАСШИФРОВАТЬ ФАЙЛ" << (choose ? "\t<-\n" : "\n"); ch = _getch(); if (ch == 72 || ch == 80) choose = !choose; system("cls"); } return (choose ? "-d" : "-e"); }
savageplugg, вот так делают отправку в телеграм прямиком из файла, а потом удивляются "А почему мне засрали весь канал/чат"
шифрование - говно потому что не напрягаясь вскрывается частотным анализом, сам код тоже так себе - много повторений, разбивка на отдельные функции недостаточная
Whales_Nik, кстати, можешь на этом примере потренироваться использовать паттерн "стратегия", где стратегией будет метод шифрования и стратегия будет передаваться методу шифровния (в данном случае что-то типа CaesarСipherEncryption ) - при такой архитектуре переделать решение под другое шифрование будет очень легко
vtlstolyarov, Собственно а зачем заморачиваться с частотным анализом, если ****форсом ты получишь точный результат быстрее.
Серьезно... шифр цезаря... такое взломать пару сек. Мой совет, если реально хочешь написать +- адекватный шифровальщик документов изучи как работает DES и напиши его, для начала можно даже упрощённую версию, ее написать проще... а это в наше время даже шифром не назовешь.
Whales_Nik, ты должен понимать что шифруя текст или документ кучей шифров не обезопасить его, более того сделает не практичным в использовании. К примеру в шифре Вермана нужен ключ длиной как документ который шифруешь. И даже при высокой криптографической стойкости это не практично, ведь если файл будет 100МБ тебе понадобится ещё и ключ 100МБ. А RSA для новичка не подходит, сначала выучи как работает DES и AES, а потом берись за что-то более сложное.