Java 暴力解密问题

Java 暴力解密问题,java,encryption,brute-force,Java,Encryption,Brute Force,好的,昨天我提交了一个关于我正在处理的额外学分分配问题的问题。从那时起,我想我已经取得了一些进展,但现在我遇到了一些新问题,我需要一些帮助 正如我在上一篇文章中提到的,我的任务是解密一个加密文件。该文件是用PBEWithSHA1和DESEDE算法加密的,我们没有密码。密码是字典中没有特殊字符或数字的单词。此外,该文件使用未修改版本的Crypt类进行加密,链接如下 我试图通过测试从字典中随机抽取的数千个单词来处理它 这是我的新代码: import java.io.File; import java

好的,昨天我提交了一个关于我正在处理的额外学分分配问题的问题。从那时起,我想我已经取得了一些进展,但现在我遇到了一些新问题,我需要一些帮助

正如我在上一篇文章中提到的,我的任务是解密一个加密文件。该文件是用PBEWithSHA1和DESEDE算法加密的,我们没有密码。密码是字典中没有特殊字符或数字的单词。此外,该文件使用未修改版本的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.printlnsucture!之后继续运行!;线路能运行吗?我的印象是,如果密码猜对了,代码就会终止,成功了!显示消息是因为它不会引发异常

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

再次感谢您提供任何有用的信息!这是为那些对自己运行代码感兴趣的人准备的课程

我的问题是,为什么代码能够在 系统。输出。打印成功!;线路能运行吗

如果成功!是打印的,则表示您在whiletrue循环中毫无例外地到达了try块的末尾。因为这是一个短暂的过程,它一直在继续

您可以添加一个System.exit0;或返回;在那次打印之后,如果你想让它停在那里

其他意见 算法 你在尝试暴力,但用的是随机词。这可能会在很长时间内结束,除非等待无限长的时间,否则不能保证尝试所有的单词

做一些更自然的事情,比如一个接一个地尝试所有单词,而不是随机的单词,这就是暴力

System.out上的打印错误 一般来说,您可能应该在错误流而不是标准输出上打印错误。使用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);

在打印成功消息后,程序将继续循环


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

请缩进代码好吗?现在很难读懂…嗯。。仍然没有正确缩进,我就这样做;谢谢,我对任何类型的编程都很陌生,所以我还在学习如何很好地格式化东西。您可能正在使用IDE编写代码Eclipse?。IDE总是提供自动缩进功能。在eclipse中,使用Ctrl+Maj+F。我一直在发送垃圾邮件:d您能发布Crypt类吗?c.decrypt是否在失败时引发异常?有什么例外?你可能应该抓住这个异常,而不是一般的异常。我试过了,但基本上还是有相同的问题。包括系统exit0;在println刚刚结束程序后,第一个错误的猜测允许成功!要显示的消息。我似乎不明白为什么代码允许成功!在随机错误猜测后显示的消息。请查看continue语句,而不是在此处使用异常进行解密。这将帮助你实现你的目标。它基本上跳过了这一圈的其余代码,直接进入下一圈。