【问题标题】:Brute Force Decryption issue蛮力解密问题
【发布时间】:2014-04-04 06:56:04
【问题描述】:

好的,所以昨天,我提交了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())));
    }
}

代码似乎按预期运行,但是当我返回并查看控制台中的一些结果时,我看到随机的“成功!”错误密码尝试后的消息。我的问题是为什么代码能够在 System.out.println("Success!"); 之后继续运行?线能跑吗?我的印象是,如果密码被正确猜到并且“成功!”,代码将终止。显示消息是因为它不会引发异常。

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

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

【问题讨论】:

  • 您能缩进您的代码吗?现在很难阅读...
  • mmmh.. 仍然没有正确缩进,我会这样做;)
  • 谢谢,我对任何类型的编程都很陌生,所以我还在学习如何很好地格式化。
  • 您可能正在使用 IDE 编写代码(Eclipse?)。 IDE 总是提供自动缩进功能。在 Eclipse 中,使用 Ctrl+Maj+F。我一直在发送垃圾邮件:D
  • 你能发布Crypt类吗? c.decrypt() 是否在失败时抛出异常?这是什么例外?您可能应该抓住这个例外,而不是非常笼统的Exception

标签: java encryption brute-force


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    我的问题是为什么代码在 System.out.println("成功!");线能跑吗?

    如果打印了"Success!",则意味着您在while(true) 循环中毫无例外地到达了try 块的末尾。 因为它是while(true),所以它一直在继续。

    如果你想让它停在那里,你可以在println之后添加System.exit(0);return;

    其他说明

    算法

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

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

    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 替换为您在 catch 中放入的内容,这将具有相同的效果:

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

    【讨论】:

    • 我试过了,但我仍然遇到同样的问题。在println 之后包含System.exit(0); 只是在允许显示"Success!" 消息的第一个错误猜测之后结束程序。我似乎无法弄清楚为什么代码允许在随机错误猜测后显示 "Success!" 消息。
    • 看一下continue语句,这里不要使用异常来解密。这应该可以帮助您实现目标。它基本上跳过了这个循环转弯的其余代码,直接进入下一圈。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-04
    • 2016-04-05
    • 1970-01-01
    相关资源
    最近更新 更多