蛮力解密问题

时间:2014-04-04 06:56:04

标签: java encryption brute-force

好的,昨天,我提交了this关于我正在进行的额外信用分配问题的问题。从那时起,我认为我已经取得了一些进展,但现在我遇到了一些我可以使用的新问题。

正如我在上一篇文章中提到的,我的任务是解密加密文件。该文件使用PBEWithSHA1AndDESede算法加密,我们没有密码。密码是一个没有特殊字符或数字的字典单词。此外,该文件使用未经修改的Crypt类加密,链接如下。

我试图处理它的方式是通过测试从字典中随机抽取的数千个单词来蛮力。

这是我的新代码:

import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Random;
import java.util.Scanner;

public class WordGuess {

    public static void main(String[] args) {
        ArrayList<String> words = new ArrayList();

        String curWord = "";

        try {
            File aFile = new File("english.txt");
            Scanner reader = new Scanner(aFile);

            while (reader.hasNext()) {
                curWord = reader.next();

                if (curWord.length() == 5) {
                    words.add(curWord);
                }
            }
        }

        catch (FileNotFoundException e) {
            System.out.println("Error: " + e);
        }

        Random numGen = new Random();
        int count = 0;
        int maxTries = 10000;
        int tries = 0;
        File extraIn = new File("extracredit.enc");
        File extraOut = new File("extra_out.txt");
        while (true) {
            try {
                Crypt c = new Crypt(randomGenerator(words, numGen));
                System.out.println(randomGenerator(words, numGen));
                byte[] bytes = FileIO.read(extraIn);
                System.out.println("Attempt number: " + tries++);
                FileIO.write(extraOut, c.decrypt(bytes));
                System.out.println("Success!");
            }

            catch (IOException e) {
                System.out.println("Could not read/write file");
            } catch (Exception e) {
                if (++count == maxTries) {
                    try {
                        throw e;
                    } catch (Exception e1) {
                        System.out.println("Encryption error.");
                        System.exit(0);
                    }
                }
            }
        }
    }

    public static String randomGenerator(ArrayList<String> w, Random i) {
        return w.get(Math.abs(i.nextInt(w.size())));
    }
}

代码似乎按预期运行,但当我回过头来查看控制台中的一些结果时,我会看到随机的&#34;成功!&#34;密码尝试不正确后的消息。我的问题是为什么代码能够在System.out.println之后继续运行(&#34;成功!&#34;);线是否可以运行?我的印象是,如果密码被正确猜测并且&#34;成功,那么代码将终止!&#34;显示的消息是因为它不会抛出异常。

此外,代码仍然在密码猜测失败时写出文本文件。关于为什么会这样的任何想法都是受欢迎的!

再次,非常感谢任何有用的信息!对于那些对自己运行代码感兴趣的人来说,这里是Crypt类。

2 个答案:

答案 0 :(得分:0)

  

我的问题是为什么代码能够继续运行   的System.out.println(&#34;成功&#34;!); line能够运行吗?

如果打印"Success!",则表示您在try循环中到达while(true)块的末尾,没有任何异常。 因为它是while(true),所以它一直在继续。

如果您希望它停在那里,您可以在System.exit(0);之后添加return;println

其他评论

算法

你在这里尝试使用暴力,但是使用随机词。这可能会在很长一段时间内结束,并且不保证会尝试所有单词(除非在等待无限的时间之后)。

做一些更自然的事情,比如逐个(按顺序)尝试所有单词而不是随机单词,这就是强力。

在System.out上打印错误

作为一般规则,您应该在错误流而不是stdout上打印错误。使用System.err.println()代替System.out.println()

但是我同意,这里解密错误并不是真正意义上的错误,所以stdout很好,但是这些代码片段可能不应该在catch子句中。

尝试一次投掷

这是毫无意义的,因为总是抛出异常。

try {
      throw e;
} catch (Exception e1) {
    System.out.println("Encryption error.");
    System.exit(0);
}

您可以用捕获的内容替换while try-catch,这会产生相同的效果:

System.out.println("Encryption error.");
System.exit(0);

答案 1 :(得分:0)

打印成功消息后,程序将继续循环(while(true))。

为什么每次尝试解密都会引发错误?