Грубая сила символов в текстовое поле в C # - PullRequest
1 голос
/ 06 апреля 2010

Я хочу создать программу, которая "проверяет пароли", чтобы увидеть, сколько времени они потратят, чтобы взломать базовую атаку грубой силой. Итак, я сделал 2 текстовых поля. (textbox1 и textbox2) и написал программу так, чтобы, если бы в текстовых полях был ввод, появилась бы метка «правильный пароль», но я хочу написать программу так, чтобы textbox2 запускал алгоритм перебора это, и когда он сталкивается с правильным паролем, он остановится. Я ДЕЙСТВИТЕЛЬНО нуждаюсь в помощи, и если бы вы могли просто опубликовать мой прикрепленный код с правильными добавками, это было бы здорово. Программа до сих пор очень проста, но я новичок в этом, так что.

private void textBox2_TextChanged(object sender, EventArgs e)
{

}

private void button1_Click(object sender, EventArgs e)
{


    if (textBox2.Text == textBox1.Text)
    {
        label1.Text = "Password Correct";
    }
    else
    {
        label1.Text = "Password Wrong";

    }

}


private void label1_Click(object sender, EventArgs e)
{

}

Ответы [ 2 ]

5 голосов
/ 07 апреля 2010

Используйте этот простой класс грубой силы, чтобы взломать ваш пароль. Я установил здесь максимальный размер 3 , поэтому мне не пришлось долго ждать. Увеличьте это, если у вас есть весь день!

private class BrutePasswordGuesser
{
    private const int MaxAscii = 126;
    private const int MaxSize = 3;
    private const int MinAscii = 33;

    private int _currentLength;

    public BrutePasswordGuesser()
    {
        //Init the length, and current guess array.
        _currentLength = 0;
        CurrentGuess = new char[MaxSize];
        CurrentGuess[0] = (char) MinAscii;
    }

    public char[] CurrentGuess { get; private set; }

    public bool NextGuess()
    {
        if (_currentLength >= MaxSize)
        {
            return false;
        }

        //Increment the previous digit (Uses recursion!)
        IncrementDigit(_currentLength);

        return true;
    }

    /// <summary>
    /// Increment the character at the index by one. If the character is at the maximum 
    /// ASCII value, set it back to the minimum, and increment the previous character.
    /// Use recursion to do this, so that the proggy will step all the way back as needed.
    /// If the very bottom of the string is reached, add another character to the guess.
    /// </summary>
    /// <param name="digitIndex"></param>
    private void IncrementDigit(int digitIndex)
    {
        //Don't fall out the bottom of the array.
        //If we're at the bottom of the array, add another character
        if (digitIndex < 0)
        {
            AddCharacter();
        }
        else
        {
            //If the current character is max ASCII, set to min ASCII, and increment the previous char.
            if (CurrentGuess[digitIndex] == (char) MaxAscii)
            {
                CurrentGuess[digitIndex] = (char) MinAscii;
                IncrementDigit(digitIndex - 1);
            }
            else
            {
                CurrentGuess[digitIndex]++;
            }
        }
    }

    private void AddCharacter()
    {
        _currentLength++;
        //If we've reached our maximum guess size, leave now and don't come back.
        if (_currentLength >= MaxSize)
        {
            return;
        }
        //Initialis as min ASCII.
        CurrentGuess[_currentLength] = (char) (MinAscii);
    }
}

В приведенном выше примере используйте класс следующим образом:

private void button1_Click(object sender, EventArgs e)
{
    var guesser = new BrutePasswordGuesser();

    var guess = new String(guesser.CurrentGuess);
    while (textBox1.Text != guess)
    {
        textBox2.Text = guess;
        if (!guesser.NextGuess())
        {
            label1.Text = "Maximum guess size reached.";
            break;
        }
        guess = new String(guesser.CurrentGuess);
    }

    if (textBox1.Text == textBox2.Text)
    {
        Label1.Text = "Password Correct";
    }
}
0 голосов
/ 06 апреля 2010

Требуется больше информации; вы угадываете пароли наугад? Словарная атака? Вы угадываете пароли последовательно? Какие другие ограничения на длину / кодировку, используемые в пароле, существуют?

Я предполагаю, что ваша программа автоматически вызывает эти попытки, а не вы как пользователь, в пользовательском интерфейсе. Если это так, я бы отказался от стратегии пользовательского интерфейса и пошел бы к консольной реализации.

Причина, по которой вопрос о «случайном» угадывании важен, заключается в том, что, если вы будете угадывать последовательно, продолжительность времени напрямую зависит от выбранного пароля. Я не уверен, какой результат вы ищете.

...