1. ホーム
  2. java

[解決済み] ブルートフォースアルゴリズムの説明 [終了しました]。

2022-02-13 08:59:25

質問内容

ブルートフォースアルゴリズムを持っているが、完全に理解したことがない。 いくつかのことは漠然と把握しているのですが、何が起こっているのかを正確に追おうとすると、毎回迷ってしまいます(例えば 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);
    }
}

解決方法は?

ブルートフォース というのは、基本的に、コンピュータが人間の脳よりも速いことを利用して、あらゆる可能なシナリオを分析しようとするヒューリスティックな手法のことです。 例えば、チェスのゲームでパスワードや次の最善手を演繹的に解明しようとするのではなく、あらゆる可能な状況をテストして、正しいもの(あるいはブルートフォース・アルゴリズムの目的によっては、何らかの指標に基づく最善のもの)を使用するだけなのです。

コードは単純に、パスワードとして考えられるすべての値を調べ、それを見つけたかどうかをチェックします。 見つからなければ、見つかるまでの間、次の可能な組み合わせに進みます。

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

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