Брутфорс

Уровень сложности:

Требуется написать свой Bruteforce т. е. пользователь вводит какой-то пароль и программа методом перебора всех возможных вариантов находит этот пароль. Предполагается, что программа не может отработать и не найти пароль. Ограничение перебора осуществляется пользователем, т.е  будут ли включены в перебор цифры, заглавные буквы, символы и т. д.

Рекомендую ограничить длину вводимого пароля до 4-х символов, больше не надо, иначе программа долго будет работать. Еще лучше, если на этапе разработки программы, длина пароля будет 2 — 3 символа. Кроме того, задайте в программе множество допустимых символов пароля. Например, в пароле могут использоваться только цифры и/или буквы, это заметно поможет ускорить процесс отладки программы-брутфорса.

Автор — NaikoN.

К сожалению, решения данной задачи пока нет. Если Вы решили эту задачу, сообщите нам, и мы выложим её на сайте.

E-mail : admin@cppstudio.com

Следующие статьи помогут вам в решении данной задачи:
Автор: Marienko L.
Дата: 07.01.2014
Поделиться:

Комментарии

  1. art_h4rd

    art_h4rd

    Если правильно понял задачку, то вот:

    int main()
    {
    	const int size_str = 10;
    	char pass[size_str];
    	cout << "Type ur password: ";
    	gets_s(pass, size_str);
    	char res[size_str]{};
    	int k = strlen(pass);
    	int j(0);
    	while (k--)
    	{
    		for (int i = 48; i <= 122; i++) // ascii table
    		{
    			if (char(i) == pass[j])
    			{
    				res[j] = char(i);
    				break;
    			}
    		}
    		j++;
    	}
    	res[size_str - 1] = 0x00;
    	cout << "Ur pass: " << res << endl;
    }
  2. Lee Amstrong

    Вот так получилось. Я не программист, так что сильно не ругайтеся ^_^

    Вывод в консоле: http://dl3.joxi.net/drive/2017/06/12/0004/1779/300787/87/dd69e3bc9d.png

    main.cpp

    #include <iostream>
    #include <chrono> //замерить время перебора
    #include "brutforce.h"
    
    using namespace std;
    
    
    int main(int argc, char const *argv[]) {
      //setlocale( LC_ALL,"Russian" ) //Если ваша консоль не поддерживает кирилицу
      int alphabet         = BRUT_NUMBERS|BRUT_ENG_LOWERCASE|BRUT_ENG_UPPERCASE;
      cout << '\t' << "Йоба брутфорсер"  << endl;
    
      while (true) {
        cout << "__________________________________" << endl;
        cout << "__________________________________" << endl;
        cout << endl;
        cout << "1) Перебрать пароль" << endl;
        cout << "2) Установить набор символов" << endl;
        cout << "3) Выход" << endl;
        cout << endl;
    
        int menu_item = 0;
        cout << "Пункт меню: ";
        cin >> menu_item;
    
        switch (menu_item) {
          case 1:
          {
            set_alphabet(alphabet);
            string real_password;
            cout << "Пароль: ";
            cin >> real_password;
            if (real_password.empty()) {
              cout << "Ваш пароль: у вас нет пароля ^_^";
              break;
            } else if (!is_valid_pass(real_password)) {
              cout << "Пароль содержит недопустимые знаки. Настройте набор символов." << endl;
              break;
            } else {
              if (real_password.size() > 4) { //Если длина пароля больше 4 то выводим предупреждение
                cout << "ВАШ ПАРОЛЬ БОЛЬШОЙ. ПЕРЕБОРКА МОЖЕТ ЗАНЯТЬ ОЧЕНЬ МНОГО ВРЕМЕНИ!!!" << endl;
              }
              //Начинаем перебирать пароль каждый раз увеличивая его длину на 1
              int brutedpass_size = 0;
              auto begin = chrono::high_resolution_clock::now();
              while (true) {
                brutedpass_size++;
                string brutedpass = brutforce_password(real_password, brutedpass_size);
                //Если получили пустую строку, то это значит что бароль не найден. Увеличиваем длину поиска
                if (!brutedpass.empty()) {
                  //оп, пароль найден, выводим
                  auto end = chrono::high_resolution_clock::now();
                  cout << "Ваш пароль: " << brutedpass << endl;
                  cout << "Перебор занял ";
                  cout << chrono::duration_cast<chrono::seconds>(end-begin).count()<<" секунд(ы)"<< endl;
                  return 0;
                }
              }
            }
            break;
          }
          case 2:
          {
            cout << "Текущий набор символов: " << get_alphabet(alphabet) << endl;
            cout << "Использовать: " << endl;
            cout << '\t' << "1) Только цифры"                                 << endl;
            cout << '\t' << "2) Строчные английские буквы"                    << endl;
            cout << '\t' << "3) Строчные английские буквы и цифры"            << endl;
            cout << '\t' << "4) Заглавные английские буквы"                   << endl;
            cout << '\t' << "5) Заглавные английские буквы и цифры"           << endl;
            cout << '\t' << "6) Заглавные, строчные английские буквы и цифры" << endl;
    
            int new_charset = 0;
            cout << "Пункт меню: ";
            cin  >> new_charset;
            if (!new_charset || (new_charset < 0)) {
              cout << "Невозможно установить данный набор" << endl;
              break;
            }
            switch (new_charset) {
              case 1:{alphabet = BRUT_NUMBERS;                                       break;}
              case 2:{alphabet = BRUT_ENG_LOWERCASE;                                 break;}
              case 3:{alphabet = BRUT_NUMBERS|BRUT_ENG_LOWERCASE;                    break;}
              case 4:{alphabet = BRUT_ENG_UPPERCASE;                                 break;}
              case 5:{alphabet = BRUT_NUMBERS|BRUT_ENG_UPPERCASE;                    break;}
              case 6:{alphabet = BRUT_NUMBERS|BRUT_ENG_LOWERCASE|BRUT_ENG_UPPERCASE; break;}
            }
            cout << "Установлен набор символов: " << get_alphabet(alphabet) << endl;
            break;
          }
          case 3:
          {
            return 0;
          }
        }
        cin.clear();
        cin.get();
      }
    
      return 0;
    }

     
    bruteforce.h

    #ifndef BRUTFORCE_H
    #define BRUTFORCE_H
    
    #include <string>
    
    #define BRUT_NUMBERS       (1<<0)
    #define BRUT_ENG_LOWERCASE (1<<1)
    #define BRUT_ENG_UPPERCASE (1<<2)
    //#define BRUT_RUS_LOWERCASE (1<<3)
    //#define BRUT_RUS_UPPERCASE (1<<4)
    
    bool is_valid_pass(std::string pass);
    /*
      Проверяет пароль на соответствие заданному алфавиту
    */
    
    std::string get_alphabet(int letter_set);
    
    void set_alphabet(int letter_set);
    /*
      Устанавливает алфавит, по которому будет вестись подбор пароля.
      BRUT_NUMBERS       - числа
      BRUT_ENG_LOWERCASE - английские маленькие символы
      BRUT_ENG_UPPERCASE - английские большые символы
    */
    
    std::string brutforce_password(std::string real_password, int brutforce_size);
    /*
      Подбирает пароль
      real_password  - реальный пароль
      brutforce_size - сколько символов в пароле
    */
    
    #endif

     
    bruteforce.cpp

    #include <string>
    #include <vector>
    #include "brutforce.h"
    
    using namespace std;
    
    vector<char> alphabet;
    
    bool is_valid_char(char ch){
      for (size_t i = 0; i < alphabet.size(); i++) {
        if (alphabet[i] == ch) {
          return true;
        }
      }
      return false;
    }
    
    bool is_valid_pass(string pass){
      for (size_t i = 0; i < pass.size(); i++) {
        if (!is_valid_char(pass[i])) {
          return false;
        }
      }
      return true;
    }
    
    string get_alphabet(int letter_set){
      string letters = "";
    
      if (letter_set & BRUT_NUMBERS)       {letters += "0123456789";}
      if (letter_set & BRUT_ENG_LOWERCASE) {letters += "abcdefghijklmnopqrstuvwxyz";}
      if (letter_set & BRUT_ENG_UPPERCASE) {letters += "ABCDEFGHIJKLMNOPQRSTUVWXYZ";}
    
      return letters;
    }
    
    void set_alphabet(int letter_set){
      string letters = "";
    
      if (letter_set & BRUT_NUMBERS)       {letters += "0123456789";}
      if (letter_set & BRUT_ENG_LOWERCASE) {letters += "abcdefghijklmnopqrstuvwxyz";}
      if (letter_set & BRUT_ENG_UPPERCASE) {letters += "ABCDEFGHIJKLMNOPQRSTUVWXYZ";}
    
      for (size_t i = 0; i < letters.size(); i++) {
        alphabet.push_back(letters[i]);
      }
    }
    
    
    string brutforce_password(string real_password, int brutforce_size){
      vector<int> password(brutforce_size); //Вектор в котором элементы - это позиция символа в алфавите (vector<char> alphabet)
      //На всякий случай присваеваем элементам вектора нули явно
      for (size_t i = 0; i < password.size(); i++) {
        password[i] = 0;
      }
      //Строка после которой перебор будет идти по новой. Если получим эту строку в цикле перебора, то разорвем его
      string last_aviable_pass = string(password.size(), alphabet.back());
    
      bool need_break_loop = false;
      while (!need_break_loop) {
        for (size_t letter = 0; letter < alphabet.size(); letter++) {
          password[0] = letter;
          string pass = string();
          for (size_t i = 0; i < password.size(); i++) {
            pass.push_back(alphabet[password[i]]);
          }
          if (pass == real_password) {
            return pass;
          } else if (pass == last_aviable_pass) {
            need_break_loop = true;
          }
        }
        for (size_t i = 1; i < password.size(); i++) {
          password[i]++;
          if (password[i] == alphabet.size()) {
            password[i] = 0;
          } else {
            break;
          }
        }
      }
      return string(); //Возвращаем пустую строку, если пароль не был найден
    }

     

     

     

     

     

     

  3. biggy

    Как-то так (на C):

    /*
     *	by Biggy 
     *
     *	Bruteforce 
     */ 
    
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    void yyy(void);
    void nyy(void);
    void nny(void);
    void yny(void);
    void yyn(void);
    
    int main (void)
    {
    
    	char y1 = 0, y2 = 0, y3 = 0;
    
    	printf("Will you use characters (y/n) ?");
    	scanf(" %c", &y1);
    	printf("Will you use big characters (y/n) ?");
    	scanf(" %c", &y2);
    	printf("Will you use numbers (y/n) ?");
    	scanf(" %c", &y3);
    
    	
    	if(y1 == 'y' && y2 == 'y' && y3 == 'y') yyy();
    	else if(y1 == 'n' && y2 == 'y' && y3 == 'y') nyy();
    	else if(y1 == 'n' && y2 == 'n' && y3 == 'y') nny();
    	else if(y1 == 'y' && y2 == 'n' && y3 == 'y') yny();
    	else if(y1 == 'y' && y2 == 'y' && y3 == 'n') yyn();
    
    	printf("done.");
    
    	return EXIT_SUCCESS;
    }
    
    void yyy(void)
    {
    	char buffer[5] = {0};
    	char buffer2[5] = {0};
    
    	printf("Enter your password ?");
    	scanf("%4s", buffer);
    
    	for(char i = '0'; i != '}'; ++i)
    	{
    		for(char j = '0'; j != '}'; ++j)
    		{
    			for(char u = '0'; u != '}'; ++u)
    			{
    				for(char z = '0'; z != '}'; ++z)
    				{
    					if(i == ':') i = 'a';
    					else if(i  == '{') i = 'A';
    
    					if(j == ':') j = 'a';
    					else if(j  == '{') j = 'A';
    
    					if(u == ':') u = 'a';
    					else if(u  == '{') u = 'A';
    
    					if(z == ':') z = 'a';
    					else if(z  == '{') z = 'A';
    
    					buffer2[0] = i;
    					buffer2[1] = j;
    					buffer2[2] = u;
    					buffer2[3] = z;
    
    					//printf("%s\r\n", buffer2);
    					if(strcmp(buffer, buffer2) == 0)
    						printf("Your password: \t%s\r\n", buffer2);
    
    					if(z == 'Z') break;
    				}
    			if(u == 'Z') break;
    			}
    		if(j == 'Z') break;
    		}
    	if(i == 'Z') break;
    	}
    
    	return;
    }
    
    void nyy(void)
    {
    	char buffer[5] = {0};
    	char buffer2[5] = {0};
    
    	printf("Enter your password ?");
    	scanf("%4s", buffer);
    
    	for(char i = '0'; i != '}'; ++i)
    	{
    		for(char j = '0'; j != '}'; ++j)
    		{
    			for(char u = '0'; u != '}'; ++u)
    			{
    				for(char z = '0'; z != '}'; ++z)
    				{
    					if(i  == ':') i = 'A';
    
    					else if(j  == ':') j = 'A';
    
    					else if(u  == ':') u = 'A';
    
    					else if(z  == ':') z = 'A';
    
    					buffer2[0] = i; buffer2[1] = j;
    					buffer2[2] = u;
    					buffer2[3] = z;
    
    					//printf("%s\r\n", buffer2);
    					if(strcmp(buffer, buffer2) == 0)
    						printf("Your password: \t%s\r\n", buffer2);
    
    					if(z == 'Z') break;
    				}
    			if(u == 'Z') break;
    			}
    		if(j == 'Z') break;
    		}
    	if(i == 'Z') break;
    	}
    
    	return;
    }
    
    void nny(void)
    {
    	char buffer[5] = {0};
    	char buffer2[5] = {0};
    
    	printf("Enter your password ?");
    	scanf("%4s", buffer);
    
    	for(int i = 48; i < 58; ++i)
    	{
    		for(int j = 48; j < 58; ++j)
    		{
    			for(int u = 48; u < 58; ++u)
    			{
    				for(int z = 48; z < 58; ++z)
    				{
    					buffer2[0] = i;
    					buffer2[1] = j;
    					buffer2[2] = u;
    					buffer2[3] = z;
    
    					//printf("%s\r\n", buffer2);
    					if(strcmp(buffer, buffer2) == 0)
    						printf("Your password: \t%s\r\n", buffer2);
    				}
    			}
    		}
    	}
    
    	return;
    }
    
    void yny(void)
    {
    	char buffer[5] = {0};
    	char buffer2[5] = {0};
    
    	printf("Enter your password ?");
    	scanf("%4s", buffer);
    
    	for(char i = '0'; i != '}'; ++i)
    	{
    		for(char j = '0'; j != '}'; ++j)
    		{
    			for(char u = '0'; u != '}'; ++u)
    			{
    				for(char z = '0'; z != '}'; ++z)
    				{
    					if(i  == ':') i = 'a';
    
    					else if(j  == ':') j = 'a';
    
    					else if(u  == ':') u = 'a';
    
    					else if(z  == ':') z = 'a';
    
    					buffer2[0] = i; 
    					buffer2[1] = j;
    					buffer2[2] = u;
    					buffer2[3] = z;
    
    					//printf("%s\r\n", buffer2);
    					if(strcmp(buffer, buffer2) == 0)
    						printf("Your password: \t%s\r\n", buffer2);
    
    					if(z == 'z') break;
    				}
    			if(u == 'z') break;
    			}
    		if(j == 'z') break;
    		}
    	if(i == 'z') break;
    	}
    
    	return;
    }
    
    void yyn(void)
    {
    	char buffer[5] = {0};
    	char buffer2[5] = {0};
    
    	printf("Enter your password ?");
    	scanf("%4s", buffer);
    
    	for(char i = 'a'; i != '}'; ++i)
    	{
    		for(char j = 'a'; j != '}'; ++j)
    		{
    			for(char u = 'a'; u != '}'; ++u)
    			{
    				for(char z = 'a'; z != '}'; ++z)
    				{
    					if(i  == 'z') i = 'A';
    
    					else if(j  == 'z') j = 'A';
    
    					else if(u  == 'z') u = 'A';
    
    					else if(z  == 'z') z = 'A';
    
    					buffer2[0] = i; 
    					buffer2[1] = j;
    					buffer2[2] = u;
    					buffer2[3] = z;
    
    					printf("%s\r\n", buffer2);
    					/*
    					if(strcmp(buffer, buffer2) == 0)
    						printf("Your password: \t%s\r\n", buffer2);
    					*/
    					if(z == 'Z') break;
    				}
    			if(u == 'Z') break;
    			}
    		if(j == 'Z') break;
    		}
    	if(i == 'Z') break;
    	}
    
    	return;
    }
  4. Артем Коршенко

    Вот такой вариант. Алгоритм, к сожалению не мой, переписал с С# на С++, нашел на каком-то читерском сайте.
    Код: pastebin.com/ETUNPfaW

Оставить комментарий

Вы должны войти, чтобы оставить комментарий.