【发布时间】: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