Итак, вчера, я представил этот вопрос о проблеме с дополнительным кредитным заданием, над которым я работаю. С тех пор, я думаю, я немного продвинулся, но теперь у меня возникают проблемы, с которыми я мог бы воспользоваться.
Как я упоминал в своем последнем посте, мое назначение - расшифровать зашифрованный файл. Файл был зашифрован с помощью алгоритма 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("Успех!"); линия может работать? У меня создалось впечатление, что код закончится, если пароль будет правильно угадан, и "Успех!" было отображено сообщение, потому что оно не выбрало бы исключение.
Кроме того, код все еще записывает текстовый файл при неудачных ошибках пароля. Любые идеи о том, почему это возможно, приветствуются!
Опять же, любая полезная информация вообще очень ценится! И здесь класс Crypt для тех из вас, кто заинтересован в запуске кода самостоятельно.
Мой вопрос в том, почему код может продолжать работать после System.out.println("Успех!"); линия может работать?
Если "Success!"
, то это означает, что вы достигли конца блока try
в своем цикле while(true)
без каких-либо исключений. Поскольку это while(true)
, оно продолжает двигаться.
Вы можете добавить System.exit(0);
или return;
после этого println
, если вы хотите, чтобы он остановился там.
Здесь вы пытаетесь использовать bruteforce, но используете случайные слова. Это может закончиться очень долгое время, и не гарантируется попытка использовать все слова (если только не ждать бесконечного количества времени).
Сделайте что-то более естественное, например, попробуйте все слова один за другим (в порядке) вместо случайных слов, это грубо.
Как правило, вы, вероятно, должны печатать свои ошибки в потоке ошибок вместо stdout
. Сделайте это с помощью System.err.println()
вместо System.out.println()
.
Но я согласен, что ошибки дешифрования на самом деле не являются ошибками в правильном смысле, поэтому stdout - это хорошо, но тогда эти фрагменты кода, вероятно, не должны быть в предложении catch
.
Это бессмысленно, потому что исключение всегда выбрасывается.
try {
throw e;
} catch (Exception e1) {
System.out.println("Encryption error.");
System.exit(0);
}
Вы можете заменить try-catch
на то, что вы положили в catch, это будет иметь тот же эффект:
System.out.println("Encryption error.");
System.exit(0);
System.exit(0);
после того, как println
просто завершает программу после первого неверного предположения, которое позволяет "Success!"
сообщение для отображения. Я не могу понять, почему код допускает "Success!"
сообщение, которое будет отображаться после случайного неверного предположения.
continue
, вместо использования здесь исключений для расшифровки. Это должно помочь вам достичь вашей цели. В основном он пропускает оставшуюся часть кода для этого поворота цикла и переходит непосредственно к следующему кругу.
Программа продолжит цикл после публикации сообщения об успешном завершении (while (true)).
Почему каждая попытка дешифрования вызывает ошибку?