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