Проблема дешифрования грубой силы

1

Итак, вчера, я представил этот вопрос о проблеме с дополнительным кредитным заданием, над которым я работаю. С тех пор, я думаю, я немного продвинулся, но теперь у меня возникают проблемы, с которыми я мог бы воспользоваться.

Как я упоминал в своем последнем посте, мое назначение - расшифровать зашифрованный файл. Файл был зашифрован с помощью алгоритма 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 для тех из вас, кто заинтересован в запуске кода самостоятельно.

  • 1
    Не могли бы вы сделать отступ для своего кода? Трудно читать на данный момент ...
  • 0
    ммммх .. все еще не с отступом должным образом, я просто сделаю это;)
Показать ещё 3 комментария
Теги:
encryption
brute-force

2 ответа

0

Мой вопрос в том, почему код может продолжать работать после System.out.println("Успех!"); линия может работать?

Если "Success!" , то это означает, что вы достигли конца блока try в своем цикле while(true) без каких-либо исключений. Поскольку это while(true), оно продолжает двигаться.

Вы можете добавить System.exit(0); или return; после этого println, если вы хотите, чтобы он остановился там.

Другие замечания

Алгоритм

Здесь вы пытаетесь использовать bruteforce, но используете случайные слова. Это может закончиться очень долгое время, и не гарантируется попытка использовать все слова (если только не ждать бесконечного количества времени).

Сделайте что-то более естественное, например, попробуйте все слова один за другим (в порядке) вместо случайных слов, это грубо.

Ошибка печати на 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);
}

Вы можете заменить try-catch на то, что вы положили в catch, это будет иметь тот же эффект:

System.out.println("Encryption error.");
System.exit(0);
  • 0
    Я пробовал это, но у меня все еще есть та же самая проблема. Включая System.exit(0); после того, как println просто завершает программу после первого неверного предположения, которое позволяет "Success!" сообщение для отображения. Я не могу понять, почему код допускает "Success!" сообщение, которое будет отображаться после случайного неверного предположения.
  • 0
    Взгляните на оператор continue , вместо использования здесь исключений для расшифровки. Это должно помочь вам достичь вашей цели. В основном он пропускает оставшуюся часть кода для этого поворота цикла и переходит непосредственно к следующему кругу.
0

Программа продолжит цикл после публикации сообщения об успешном завершении (while (true)).

Почему каждая попытка дешифрования вызывает ошибку?

Ещё вопросы

Сообщество Overcoder
Наверх
Меню