2012-12-30 111 views
0

我有一个蛮力算法,但从来没有完全理解它。我对某些事情有一种模糊的把握,但每次我尝试关注发生的事情时,我都会迷路(例如,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); 
    } 
} 
+2

蛮力不是具体算法的名称。你应该说明你使用这种算法的用途。 – Headshota

+0

@Headshota其实,它是。蛮力是枚举所有有效密码并逐一尝试它们的算法。 –

+3

这是一段简单的Java代码。如果你不明白,我建议你先购买一本好的Java编程教科书。如果你有一个具体的问题,也许我们可以回答。但是“请解释这个”并不具有建设性...... –

回答

6

​​是一种启发式技术,这意味着,从本质上讲,你要尝试采取的计算机快了多少比人脑的优势,分析每一个可能的场景。例如,你不是试图在棋盘游戏中演绎出密码或下一个最佳棋步;你只是测试每种可能的情况,并使用正确的(或者根据某种度量标准来选择最好的一种,具体取决于蛮力算法的意图)。

您的代码只是通过可能为密码持有的所有可能值并检查是否已找到它。如果没有,它会转到下一个可能的组合,直到它结束。

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

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