1

Тема: Створення простого Brute force

Добрий день

Хочу написати простий брут форс
Але виникла проблемка
Не можу реалізувати перебір елементів
Наприклад якщо пароль з 3 цифр то перебір виконується наступним чином:

const int COUNT = 10;
const char el[COUNT+1] = "ABCDIFGQWE";  // перелік можливих символів масивва
char pas[] = "qwe";
char* pas2 = new char[3];

for(int i = 0; i < COUNT; i++){
   pas2[0] = el[i];
   for(int j = 0; j < COUNT; j++){
      pas2[1] = el[j];
      for(int k = 0; k < COUNT; k++){
          pas2[2] = el[k];
          if(strcmp(pas, pas2) == 0){   // Перевірка чи масиви однакові
             cout<<"Password = "<<pas2<<endl;
          }
     }
   }
}

На три елемента зрозуміло
але як зробити наприклад на 5 чи 6 елементів тобто на таку кількість яку ми завчасно не знаємо?
Алгоритм мені зрозумілий але реалізувати ніяк не виходить?
Пробував за допомогою рекурсії яле так і нічого не вийшло?

Можете допомогти порадою у вирішенні даної пробеми.

2

Re: Створення простого Brute force

А ви погляньте на алготим перетворення чисел у їхню стрічкову форму і навпаки.

3

Re: Створення простого Brute force

Ви маєте на увазі перетвоення числа напр: int в char*?

4

Re: Створення простого Brute force

так, почитайте про системи числення, бо фактично в вас таке ж завдання

5 Востаннє редагувалося Master_Sergius (20.02.2015 19:10:57)

Re: Створення простого Brute force

А можна зробити таким чином:
"збільшувати" на один символ від кінця до тих пір, поки стартовий рядок не буде збігатися з кінцевим.

Ось Я таке наговнокодив за 10 хв на пайтоні:

# initial values, just change only them
AVAIL_SYMBOLS = 'abcd'
STRING_LEN = 5

# solution
start = AVAIL_SYMBOLS[0] * STRING_LEN
end = AVAIL_SYMBOLS[-1] * STRING_LEN

def get_next_symbol(symbol, AVAIL_SYMBOLS):
    index =  AVAIL_SYMBOLS.index(symbol)
    if index == len(AVAIL_SYMBOLS) - 1:
        return True, AVAIL_SYMBOLS[0]
    return False, AVAIL_SYMBOLS[index + 1]

result_list = []
while (start != end):
    result_list.append(start)
    next_index = False
    index = len(start) - 1
    while True:
        value = start[index]
        next_index, symbol = get_next_symbol(value, AVAIL_SYMBOLS)
        start = start[:index] + symbol + start[index+1:]
        if not next_index:
            break
        index -= 1
        if index == -1:
            break

result_list.append(end)

print result_list

тобто, в списку ми отримаємо:

Прихований текст

['aaaaa', 'aaaab', 'aaaac', 'aaaad', 'aaaba', 'aaabb', 'aaabc', 'aaabd', 'aaaca', 'aaacb', 'aaacc', 'aaacd', 'aaada', 'aaadb', 'aaadc', 'aaadd', 'aabaa', 'aabab', 'aabac', 'aabad', 'aabba', 'aabbb', 'aabbc', 'aabbd', 'aabca', 'aabcb', 'aabcc', 'aabcd', 'aabda', 'aabdb', 'aabdc', 'aabdd', 'aacaa', 'aacab', 'aacac', 'aacad', 'aacba', 'aacbb', 'aacbc', 'aacbd', 'aacca', 'aaccb', 'aaccc', 'aaccd', 'aacda', 'aacdb', 'aacdc', 'aacdd', 'aadaa', 'aadab', 'aadac', 'aadad', 'aadba', 'aadbb', 'aadbc', 'aadbd', 'aadca', 'aadcb', 'aadcc', 'aadcd', 'aadda', 'aaddb', 'aaddc', 'aaddd', 'abaaa', 'abaab', 'abaac', 'abaad', 'ababa', 'ababb', 'ababc', 'ababd', 'abaca', 'abacb', 'abacc', 'abacd', 'abada', 'abadb', 'abadc', 'abadd', 'abbaa', 'abbab', 'abbac', 'abbad', 'abbba', 'abbbb', 'abbbc', 'abbbd', 'abbca', 'abbcb', 'abbcc', 'abbcd', 'abbda', 'abbdb', 'abbdc', 'abbdd', 'abcaa', 'abcab', 'abcac', 'abcad', 'abcba', 'abcbb', 'abcbc', 'abcbd', 'abcca', 'abccb', 'abccc', 'abccd', 'abcda', 'abcdb', 'abcdc', 'abcdd', 'abdaa', 'abdab', 'abdac', 'abdad', 'abdba', 'abdbb', 'abdbc', 'abdbd', 'abdca', 'abdcb', 'abdcc', 'abdcd', 'abdda', 'abddb', 'abddc', 'abddd', 'acaaa', 'acaab', 'acaac', 'acaad', 'acaba', 'acabb', 'acabc', 'acabd', 'acaca', 'acacb', 'acacc', 'acacd', 'acada', 'acadb', 'acadc', 'acadd', 'acbaa', 'acbab', 'acbac', 'acbad', 'acbba', 'acbbb', 'acbbc', 'acbbd', 'acbca', 'acbcb', 'acbcc', 'acbcd', 'acbda', 'acbdb', 'acbdc', 'acbdd', 'accaa', 'accab', 'accac', 'accad', 'accba', 'accbb', 'accbc', 'accbd', 'accca', 'acccb', 'acccc', 'acccd', 'accda', 'accdb', 'accdc', 'accdd', 'acdaa', 'acdab', 'acdac', 'acdad', 'acdba', 'acdbb', 'acdbc', 'acdbd', 'acdca', 'acdcb', 'acdcc', 'acdcd', 'acdda', 'acddb', 'acddc', 'acddd', 'adaaa', 'adaab', 'adaac', 'adaad', 'adaba', 'adabb', 'adabc', 'adabd', 'adaca', 'adacb', 'adacc', 'adacd', 'adada', 'adadb', 'adadc', 'adadd', 'adbaa', 'adbab', 'adbac', 'adbad', 'adbba', 'adbbb', 'adbbc', 'adbbd', 'adbca', 'adbcb', 'adbcc', 'adbcd', 'adbda', 'adbdb', 'adbdc', 'adbdd', 'adcaa', 'adcab', 'adcac', 'adcad', 'adcba', 'adcbb', 'adcbc', 'adcbd', 'adcca', 'adccb', 'adccc', 'adccd', 'adcda', 'adcdb', 'adcdc', 'adcdd', 'addaa', 'addab', 'addac', 'addad', 'addba', 'addbb', 'addbc', 'addbd', 'addca', 'addcb', 'addcc', 'addcd', 'addda', 'adddb', 'adddc', 'adddd', 'baaaa', 'baaab', 'baaac', 'baaad', 'baaba', 'baabb', 'baabc', 'baabd', 'baaca', 'baacb', 'baacc', 'baacd', 'baada', 'baadb', 'baadc', 'baadd', 'babaa', 'babab', 'babac', 'babad', 'babba', 'babbb', 'babbc', 'babbd', 'babca', 'babcb', 'babcc', 'babcd', 'babda', 'babdb', 'babdc', 'babdd', 'bacaa', 'bacab', 'bacac', 'bacad', 'bacba', 'bacbb', 'bacbc', 'bacbd', 'bacca', 'baccb', 'baccc', 'baccd', 'bacda', 'bacdb', 'bacdc', 'bacdd', 'badaa', 'badab', 'badac', 'badad', 'badba', 'badbb', 'badbc', 'badbd', 'badca', 'badcb', 'badcc', 'badcd', 'badda', 'baddb', 'baddc', 'baddd', 'bbaaa', 'bbaab', 'bbaac', 'bbaad', 'bbaba', 'bbabb', 'bbabc', 'bbabd', 'bbaca', 'bbacb', 'bbacc', 'bbacd', 'bbada', 'bbadb', 'bbadc', 'bbadd', 'bbbaa', 'bbbab', 'bbbac', 'bbbad', 'bbbba', 'bbbbb', 'bbbbc', 'bbbbd', 'bbbca', 'bbbcb', 'bbbcc', 'bbbcd', 'bbbda', 'bbbdb', 'bbbdc', 'bbbdd', 'bbcaa', 'bbcab', 'bbcac', 'bbcad', 'bbcba', 'bbcbb', 'bbcbc', 'bbcbd', 'bbcca', 'bbccb', 'bbccc', 'bbccd', 'bbcda', 'bbcdb', 'bbcdc', 'bbcdd', 'bbdaa', 'bbdab', 'bbdac', 'bbdad', 'bbdba', 'bbdbb', 'bbdbc', 'bbdbd', 'bbdca', 'bbdcb', 'bbdcc', 'bbdcd', 'bbdda', 'bbddb', 'bbddc', 'bbddd', 'bcaaa', 'bcaab', 'bcaac', 'bcaad', 'bcaba', 'bcabb', 'bcabc', 'bcabd', 'bcaca', 'bcacb', 'bcacc', 'bcacd', 'bcada', 'bcadb', 'bcadc', 'bcadd', 'bcbaa', 'bcbab', 'bcbac', 'bcbad', 'bcbba', 'bcbbb', 'bcbbc', 'bcbbd', 'bcbca', 'bcbcb', 'bcbcc', 'bcbcd', 'bcbda', 'bcbdb', 'bcbdc', 'bcbdd', 'bccaa', 'bccab', 'bccac', 'bccad', 'bccba', 'bccbb', 'bccbc', 'bccbd', 'bccca', 'bcccb', 'bcccc', 'bcccd', 'bccda', 'bccdb', 'bccdc', 'bccdd', 'bcdaa', 'bcdab', 'bcdac', 'bcdad', 'bcdba', 'bcdbb', 'bcdbc', 'bcdbd', 'bcdca', 'bcdcb', 'bcdcc', 'bcdcd', 'bcdda', 'bcddb', 'bcddc', 'bcddd', 'bdaaa', 'bdaab', 'bdaac', 'bdaad', 'bdaba', 'bdabb', 'bdabc', 'bdabd', 'bdaca', 'bdacb', 'bdacc', 'bdacd', 'bdada', 'bdadb', 'bdadc', 'bdadd', 'bdbaa', 'bdbab', 'bdbac', 'bdbad', 'bdbba', 'bdbbb', 'bdbbc', 'bdbbd', 'bdbca', 'bdbcb', 'bdbcc', 'bdbcd', 'bdbda', 'bdbdb', 'bdbdc', 'bdbdd', 'bdcaa', 'bdcab', 'bdcac', 'bdcad', 'bdcba', 'bdcbb', 'bdcbc', 'bdcbd', 'bdcca', 'bdccb', 'bdccc', 'bdccd', 'bdcda', 'bdcdb', 'bdcdc', 'bdcdd', 'bddaa', 'bddab', 'bddac', 'bddad', 'bddba', 'bddbb', 'bddbc', 'bddbd', 'bddca', 'bddcb', 'bddcc', 'bddcd', 'bddda', 'bdddb', 'bdddc', 'bdddd', 'caaaa', 'caaab', 'caaac', 'caaad', 'caaba', 'caabb', 'caabc', 'caabd', 'caaca', 'caacb', 'caacc', 'caacd', 'caada', 'caadb', 'caadc', 'caadd', 'cabaa', 'cabab', 'cabac', 'cabad', 'cabba', 'cabbb', 'cabbc', 'cabbd', 'cabca', 'cabcb', 'cabcc', 'cabcd', 'cabda', 'cabdb', 'cabdc', 'cabdd', 'cacaa', 'cacab', 'cacac', 'cacad', 'cacba', 'cacbb', 'cacbc', 'cacbd', 'cacca', 'caccb', 'caccc', 'caccd', 'cacda', 'cacdb', 'cacdc', 'cacdd', 'cadaa', 'cadab', 'cadac', 'cadad', 'cadba', 'cadbb', 'cadbc', 'cadbd', 'cadca', 'cadcb', 'cadcc', 'cadcd', 'cadda', 'caddb', 'caddc', 'caddd', 'cbaaa', 'cbaab', 'cbaac', 'cbaad', 'cbaba', 'cbabb', 'cbabc', 'cbabd', 'cbaca', 'cbacb', 'cbacc', 'cbacd', 'cbada', 'cbadb', 'cbadc', 'cbadd', 'cbbaa', 'cbbab', 'cbbac', 'cbbad', 'cbbba', 'cbbbb', 'cbbbc', 'cbbbd', 'cbbca', 'cbbcb', 'cbbcc', 'cbbcd', 'cbbda', 'cbbdb', 'cbbdc', 'cbbdd', 'cbcaa', 'cbcab', 'cbcac', 'cbcad', 'cbcba', 'cbcbb', 'cbcbc', 'cbcbd', 'cbcca', 'cbccb', 'cbccc', 'cbccd', 'cbcda', 'cbcdb', 'cbcdc', 'cbcdd', 'cbdaa', 'cbdab', 'cbdac', 'cbdad', 'cbdba', 'cbdbb', 'cbdbc', 'cbdbd', 'cbdca', 'cbdcb', 'cbdcc', 'cbdcd', 'cbdda', 'cbddb', 'cbddc', 'cbddd', 'ccaaa', 'ccaab', 'ccaac', 'ccaad', 'ccaba', 'ccabb', 'ccabc', 'ccabd', 'ccaca', 'ccacb', 'ccacc', 'ccacd', 'ccada', 'ccadb', 'ccadc', 'ccadd', 'ccbaa', 'ccbab', 'ccbac', 'ccbad', 'ccbba', 'ccbbb', 'ccbbc', 'ccbbd', 'ccbca', 'ccbcb', 'ccbcc', 'ccbcd', 'ccbda', 'ccbdb', 'ccbdc', 'ccbdd', 'cccaa', 'cccab', 'cccac', 'cccad', 'cccba', 'cccbb', 'cccbc', 'cccbd', 'cccca', 'ccccb', 'ccccc', 'ccccd', 'cccda', 'cccdb', 'cccdc', 'cccdd', 'ccdaa', 'ccdab', 'ccdac', 'ccdad', 'ccdba', 'ccdbb', 'ccdbc', 'ccdbd', 'ccdca', 'ccdcb', 'ccdcc', 'ccdcd', 'ccdda', 'ccddb', 'ccddc', 'ccddd', 'cdaaa', 'cdaab', 'cdaac', 'cdaad', 'cdaba', 'cdabb', 'cdabc', 'cdabd', 'cdaca', 'cdacb', 'cdacc', 'cdacd', 'cdada', 'cdadb', 'cdadc', 'cdadd', 'cdbaa', 'cdbab', 'cdbac', 'cdbad', 'cdbba', 'cdbbb', 'cdbbc', 'cdbbd', 'cdbca', 'cdbcb', 'cdbcc', 'cdbcd', 'cdbda', 'cdbdb', 'cdbdc', 'cdbdd', 'cdcaa', 'cdcab', 'cdcac', 'cdcad', 'cdcba', 'cdcbb', 'cdcbc', 'cdcbd', 'cdcca', 'cdccb', 'cdccc', 'cdccd', 'cdcda', 'cdcdb', 'cdcdc', 'cdcdd', 'cddaa', 'cddab', 'cddac', 'cddad', 'cddba', 'cddbb', 'cddbc', 'cddbd', 'cddca', 'cddcb', 'cddcc', 'cddcd', 'cddda', 'cdddb', 'cdddc', 'cdddd', 'daaaa', 'daaab', 'daaac', 'daaad', 'daaba', 'daabb', 'daabc', 'daabd', 'daaca', 'daacb', 'daacc', 'daacd', 'daada', 'daadb', 'daadc', 'daadd', 'dabaa', 'dabab', 'dabac', 'dabad', 'dabba', 'dabbb', 'dabbc', 'dabbd', 'dabca', 'dabcb', 'dabcc', 'dabcd', 'dabda', 'dabdb', 'dabdc', 'dabdd', 'dacaa', 'dacab', 'dacac', 'dacad', 'dacba', 'dacbb', 'dacbc', 'dacbd', 'dacca', 'daccb', 'daccc', 'daccd', 'dacda', 'dacdb', 'dacdc', 'dacdd', 'dadaa', 'dadab', 'dadac', 'dadad', 'dadba', 'dadbb', 'dadbc', 'dadbd', 'dadca', 'dadcb', 'dadcc', 'dadcd', 'dadda', 'daddb', 'daddc', 'daddd', 'dbaaa', 'dbaab', 'dbaac', 'dbaad', 'dbaba', 'dbabb', 'dbabc', 'dbabd', 'dbaca', 'dbacb', 'dbacc', 'dbacd', 'dbada', 'dbadb', 'dbadc', 'dbadd', 'dbbaa', 'dbbab', 'dbbac', 'dbbad', 'dbbba', 'dbbbb', 'dbbbc', 'dbbbd', 'dbbca', 'dbbcb', 'dbbcc', 'dbbcd', 'dbbda', 'dbbdb', 'dbbdc', 'dbbdd', 'dbcaa', 'dbcab', 'dbcac', 'dbcad', 'dbcba', 'dbcbb', 'dbcbc', 'dbcbd', 'dbcca', 'dbccb', 'dbccc', 'dbccd', 'dbcda', 'dbcdb', 'dbcdc', 'dbcdd', 'dbdaa', 'dbdab', 'dbdac', 'dbdad', 'dbdba', 'dbdbb', 'dbdbc', 'dbdbd', 'dbdca', 'dbdcb', 'dbdcc', 'dbdcd', 'dbdda', 'dbddb', 'dbddc', 'dbddd', 'dcaaa', 'dcaab', 'dcaac', 'dcaad', 'dcaba', 'dcabb', 'dcabc', 'dcabd', 'dcaca', 'dcacb', 'dcacc', 'dcacd', 'dcada', 'dcadb', 'dcadc', 'dcadd', 'dcbaa', 'dcbab', 'dcbac', 'dcbad', 'dcbba', 'dcbbb', 'dcbbc', 'dcbbd', 'dcbca', 'dcbcb', 'dcbcc', 'dcbcd', 'dcbda', 'dcbdb', 'dcbdc', 'dcbdd', 'dccaa', 'dccab', 'dccac', 'dccad', 'dccba', 'dccbb', 'dccbc', 'dccbd', 'dccca', 'dcccb', 'dcccc', 'dcccd', 'dccda', 'dccdb', 'dccdc', 'dccdd', 'dcdaa', 'dcdab', 'dcdac', 'dcdad', 'dcdba', 'dcdbb', 'dcdbc', 'dcdbd', 'dcdca', 'dcdcb', 'dcdcc', 'dcdcd', 'dcdda', 'dcddb', 'dcddc', 'dcddd', 'ddaaa', 'ddaab', 'ddaac', 'ddaad', 'ddaba', 'ddabb', 'ddabc', 'ddabd', 'ddaca', 'ddacb', 'ddacc', 'ddacd', 'ddada', 'ddadb', 'ddadc', 'ddadd', 'ddbaa', 'ddbab', 'ddbac', 'ddbad', 'ddbba', 'ddbbb', 'ddbbc', 'ddbbd', 'ddbca', 'ddbcb', 'ddbcc', 'ddbcd', 'ddbda', 'ddbdb', 'ddbdc', 'ddbdd', 'ddcaa', 'ddcab', 'ddcac', 'ddcad', 'ddcba', 'ddcbb', 'ddcbc', 'ddcbd', 'ddcca', 'ddccb', 'ddccc', 'ddccd', 'ddcda', 'ddcdb', 'ddcdc', 'ddcdd', 'dddaa', 'dddab', 'dddac', 'dddad', 'dddba', 'dddbb', 'dddbc', 'dddbd', 'dddca', 'dddcb', 'dddcc', 'dddcd', 'dddda', 'ddddb', 'ddddc', 'ddddd']

Якщо алгоритм не зрозумілий, можу пояснити детальніше, але на плюсах писати влом )

6 Востаннє редагувалося olmovc (02.03.2015 16:42:16)

Re: Створення простого Brute force

я такий алгоритм шукав в 2011 році
знайшов приклад на C#

в цьому листі реалізував як зміг на jscript
http://replace.org.ua/post/51033/#p51033
думаю що маючи приклади на C# і jscript Ви створете код на С/С++
спробую перекласти із мови оригіналу
Mikle

Все дуже просто. Уяви собі, що твій АЛФАВІТ - це придумана тобю система числения.Тоді розв'язок зводиться до того, щоб перевести число в цю систему числения.

// потрібний алфавіт
const string literals = "абвгдеёжз"; // люба послідовність символів, неважливо

static string ConvertFrom(int num)
{
    // розмір буфера можна вирахувати за логарифмом
    // довжина literals - це основа твоєї системи числення
    char[] buffer = new char[num == 0 ? 1 : (int)(Math.Truncate(Math.Log(num, literals.Length)) + 1)];

    // далі, звичайний спосіб перетворення, комментувати не потрбноо я думаю
    int i = buffer.Length - 1;
    do
    {
        buffer[i--] = literals[num % literals.Length];
        num /= literals.Length;
    }
    while (num > 0);

    return new string(buffer);
}

Ось і все. Цей код поверне "а" для параметра 0, "б" для 2, "бз" для параметра 17.
Доповнюючи код ось таким методом:
Код

static IEnumerable<string> Generate(int length)
{
    // вирахуємо максимальне число
    int max = (int)Math.Pow(literals.Length, length);

    // і вертаємо строку вирівнявши її по правому краю з використанням 
    // самого першого (найменьшого) символа в алфавіті
    for (int i = 0; i < max; i++)
        yield return ConvertFrom(i).PadLeft(length, literals[0]);
}

отримаємо потрібну нам реалізацію.
Визивати можно наприклад так:

static void Main(string[] args)
{
    // Виведемо на екран послідовно всі комбинації довжиною 4 символа
    foreach (var item in Generate(4))
        Console.WriteLine(item);
    Console.ReadLine();
}

Вмісто послідовного числа, природньо, можна передавати в метод ConvertFrom випадкове, отримуючи випадкову послідовність.

Подякували: leofun011

7 Востаннє редагувалося olmovc (06.03.2015 14:20:49)

Re: Створення простого Brute force

Приблизно так

#include <iostream>
#include <string>
#include <vector>
#include <cmath>
//using namespace std;

std::string ConvertFrom(unsigned long int num);
void Generate(unsigned length);

const std::string literals = "abcdefgh";
int sizeLiterals = literals.size(); 

int main()
{   
    /*for(int i = 0;i< 25;i++)    {
        std::cout<<"["<<i<<"]"<<ConvertFrom(i)<<"\n";
    }    */
    //
    Generate(2);
    //Generate(3);
    std::cin.get();
}

void Generate(unsigned length)
{
    int max = (int)exp( (double)length * log((double)sizeLiterals)  );
    std::cout<<"max="<<max<<"\n";
    std::string s = "";
    for(int i = 0; i < max; i++)
    {
        s = ConvertFrom(i);
        if(length > s.size())
            s.insert(0, length - s.size(), literals[0]);
        std::cout<<s<<"\n";
    }
}

std::string ConvertFrom(unsigned long int num)
{
    std::string retString("");
    int lenbuf = (num == 0 ? 1 : (int)(log((double)num)/log((double)sizeLiterals)+1));
    std::vector<char> buffer(lenbuf);     
    int i = lenbuf - 1;
    do
    {
        buffer[i--] = literals[num % sizeLiterals];
        num /= sizeLiterals;
    }
    while(num > 0);
    std::vector<char>::size_type sz = buffer.size();
    for(unsigned u=0;u<sz;u++)
        retString+=buffer[u];
    return retString;
}