java - 解释暴力算法

标签 java algorithm

<分区>

我有一个蛮力算法,但从未完全理解它。我对正在发生的一些事情有一个模糊的理解,但每次我试图准确理解发生的事情时,我都迷路了(例如,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);
    }
}

最佳答案

Brute forcing是一种启发式技术,从本质上讲,您将尝试通过利用计算机比人脑快得多的优势来分析每种可能的情况。例如,您并不是要通过演绎法找出国际象棋游戏中的密码或下一个最佳着法;您只需测试每一种可能的情况并使用正确的情况(或根据某些指标使用最佳情况,具体取决于蛮力算法的目的)。

您的代码只是遍历所有可能的密码值,并检查是否找到它。如果没有,它会继续下一个可能的组合,直到它出现为止。

这也是一个 worst-case scenario 的演示,因为密码被定义为 ZZZZZ,将是算法作为解决方案尝试的最后一件事(假设最大密码长度定义为五个字符。)

此外,就您担心人们认为您将此算法用于恶意目的而言,我不会太担心。几乎没有任何计算机系统实际上会容易受到这种攻击,并且在您真正偶然发现密码之前很久就会被锁定。

关于java - 解释暴力算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14094864/

相关文章:

java - 使用 File#length() 两个字节太多

java - 如何通过键合并两个PCollection KV<>?

algorithm - 结构光 - 投影仪分辨率低于图案怎么办?

algorithm - 删除导致无向图中循环的边

java - 发生不可恢复的堆栈溢出

java - 允许 JFileChooser 仅选择特定的文件名格式

algorithm - 算法的最坏情况时间复杂度

python - for循环中的自定义排序

java - 给定一个旋转排序数组,如何找到该数组中的最大值?

java - BigDecimal 使用 ROUND_HALF_UP 舍入不好