1

私は総当たりアルゴリズムを持っていますが、完全には理解していません。起こっていることのいくつかはぼんやりと把握していますが、何が起こっているのかを正確に追おうとするたびに、迷子になります (たとえば、index変数は少し混乱します)。アルゴリズムをより効率的にする方法に関する提案も大歓迎です。

- アルゴリズムは既にあり、コンパイルして動作します。私が悪意を持ってこれを使用しようとしていると非難しないでください。そのような目的で使用したことはありません。それがどのように機能するか知りたいだけです。

public class BruteForceTest
{
    public String username = new String();
    public static String password = "ZZZZZ";
    public static char[] charset = "ABCDEFGHIJKLMNOPQRSTUVWXYZ".toCharArray();
    private static char[] currentGuess = new char[1];

public static void bruteForce()
    {
        String attempt = new String();
        Date start = new Date();
        while (true)
        {
            if (attempt.equals(password))
            {
                Date end = new Date();
                System.out.println("Password: " + attempt + "\nTotal time to crack: " + ((end.getTime() - start.getTime()) / 1000) + " seconds." + "\n");
                break;
            }
            attempt = in.toString();
            // System.out.println("Tried: " + attempt);
            in.increment();
        }
    }

    public BruteForceTest()
    {
        Arrays.fill(currentGuess, charset[0]);
    }

    public void increment()
    {
        int index = currentGuess.length - 1;
        while (index >= 0)
        {
            if (currentGuess[index] == charset[charset.length - 1])
            {
                if (index == 0)
                {
                    currentGuess = new char[currentGuess.length + 1];
                    Arrays.fill(currentGuess, charset[0]);
                    break;
                }
                else
                {
                    currentGuess[index] = charset[0];
                    index--;
                }
            }
            else
            {
                currentGuess[index] = charset[Arrays.binarySearch(charset, currentGuess[index]) + 1];
                break;
            }
        }
    }

    public String toString()
    {
        return String.valueOf(currentGuess);
    }
}
4

1 に答える 1

10

ブルートフォーシングはヒューリスティックな手法です。つまり、基本的に、コンピューターが人間の脳よりもはるかに高速であることを利用して、考えられるすべてのシナリオを分析しようとします。たとえば、チェスゲームでパスワードや次善の策を演繹的に理解しようとしているのではありません。考えられるすべての状況をテストし、適切な状況を使用します(または、ブルートフォースアルゴリズムの目的に応じて、いくつかのメトリックに応じて最適な状況を使用します)。

コードは、パスワードに対して保持できる可能性のあるすべての値を調べて、パスワードが見つかったかどうかを確認します。そうでない場合は、そうなるまで次の可能な組み合わせに進みます。

これは、最悪のシナリオのデモンストレーションでもあります。これは、として定義されているパスワードがZZZZZ、アルゴリズムが解決策として最後に試行するものになるためです(パスワードの最大長が5文字として定義されていると仮定します)。

また、悪意のある目的でこのアルゴリズムを使用していると人々が思っているのではないかと心配している限り、私はそれほど心配していません。実際にこの種の攻撃に対して脆弱なコンピュータシステムはほとんどなく、実際にパスワードが発生するずっと前にロックアウトされます。

于 2012-12-30T21:37:43.647 に答える