Генерация символов грубой силы в C ++ - PullRequest
0 голосов
/ 26 февраля 2011

Так что я пытаюсь сделать генератор строк грубой силы, чтобы сопоставлять и сравнивать строки в CUDA. Прежде чем я попытаюсь возиться с языком, я не знаю, хотел ли я заставить его работать на C ++. У меня сейчас есть этот код.

#include <iostream>
#include <string>
#include <cstdlib>

using namespace std;


int sLength = 0;
int count = 0;
int charReset = 0;
int stop = 0;
int maxValue = 0;
string inString = "";
static const char charSet[] = //define character set to draw from
"0123456789"
"!@#$%^&*"
"abcdefghijklmnopqrstuvwxyz"
"ABCDEFGHIJKLMNOPQRSTUVWXYZ";
int stringLength = sizeof(charSet) - 1;


char genChars()
{
        return charSet[count]; //Get character and send to genChars()
}

int main()
{
    cout << "Length of string to match?" << endl;
    cin >> sLength;
    cout << "What string do you want to match?" << endl;
    cin >> inString;
    string sMatch(sLength, ' ');
    while(true)
    {
        for (int y = 0; y < sLength; y++)
        {
            sMatch[y] = genChars(); //get the characters
            cout << sMatch[y];

            if (count == 74)
            {
                charReset + 1;
                count = 0;
            }
            if (count == 2147000000)
            {
                count == 0;
                maxValue++;
            }
        }
        count++;
        if (sMatch == inString) //check for string match
        {
            cout << endl;
            cout << "It took " << count + (charReset * 74) + (maxValue*2147000000) << " randomly generated characters to match the strings." << endl;
            cin >> stop;
        }
        cout << endl;
    }
}

Теперь этот код запускается и компилируется, но он точно не выполняет то, что я хочу. Это будет делать 4 одинакового персонажа, EX. аааа или 1111 и затем переходите к следующему без приращения как аааб или 1112. Я пытался возиться с такими вещами как

for (int x = 0; x < sLength; x++)
{
    return charSet[count-sLength+x];
}

Что, на мой взгляд, должно работать, но безрезультатно.

1 Ответ

3 голосов
/ 26 февраля 2011

Вам просто нужно увеличить счетчик, а затем преобразовать число в базу (размер массива символов)

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

http://www.daniweb.com/code/snippet217243.html

Вы должны быть в состоянии заменить

   char NUMS[] = "0123456789ABCDEF";

с вашим набором символов и выясните это оттуда. Это может не сгенерировать достаточно большую строку, используя uint, но вы сможете разбить ее на куски оттуда.

Представьте, что ваш массив символов был "BAR", поэтому вам нужно преобразовать в число 3 основание, используя ваши собственные символы вместо 0 1 и 2.

Для этого нужно выполнить модуль для определения персонажа, а затем разделить на основание, пока число не станет равным нулю. Вместо этого вы должны повторять «B» до тех пор, пока не достигнете длины строки, вместо того, чтобы остановиться, когда вы достигнете нуля.

Например: строка из четырех символов, сгенерированная из числа 13:

  • 14% 3 = 2, поэтому он будет выдвигать charSet [2] в начало пустой строки, "R";
  • Затем он делится на 3, что с использованием целочисленного математического выражения = 4. 4% 3 снова равно 1, поэтому «А».
  • Он снова разделится на 3, (1) 1% 3 равно 1, поэтому «А».
  • Он снова разделится на 3, (0) - Пример на этом остановится, но, поскольку мы генерируем строку, мы продолжаем нажимать 0 "B", пока не достигнем 4 наших 4 символов.

Конечный выход: BAAR

Для подхода, который может генерировать намного большие строки, вы можете использовать массив целых чисел размером с вашу строку (назовите его positions), инициализировать все целые числа равными нулю и делать что-то подобное на каждой итерации: 1032 *

   i = 0;
   positions[i]++;
   while (positions[i] == base)
   {
     positions[i] = 0;
     positions[++i]++;
   }

Затем вы должны пройти через весь массив и построить строку, используя charSet [позиции [i]], чтобы определить, что представляет собой каждый символ.

...