我有一个蛮力算法,但从未完全理解它。我对某些事情有一个模糊的把握,但是每当我试着追踪完全发生的事情时,我就迷失了(例如,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);
}
}
答案 0 :(得分:9)
Brute forcing是一种启发式技术,实质上意味着您将尝试通过利用计算机比人脑更快的速度来分析每种可能的情况。例如,你不是试图在国际象棋游戏中演绎密码或下一个最佳动作;你只是测试每一种可能的情况,并使用正确的情况(或根据一些指标,最好的情况,取决于蛮力算法的目的)。
您的代码只会查看可能为密码保留的所有可能值,并检查是否找到了密码。如果没有,它将继续进行下一个可能的组合,直到它完成。
这也是worst-case scenario的演示,因为密码被定义为ZZZZZ
,将是算法尝试作为解决方案的最后一件事(假设最大密码长度定义为五个字符) 。)
另外,如果您担心人们认为您将此算法用于恶意目的,我不会太担心。几乎没有任何计算机系统真的容易受到这种攻击,并且在您真正发生密码之前很久就会被锁定。