Понимание радужной таблицы Java

Я прохожу курс криптографии, но некоторые вещи, описанные моим учителем, действительно неясны и плохо объяснены.

Он попросил меня создать алгоритм на Java для создания таблицы RT (хэш/текст) и иметь файл (test.txt), который содержит 100 хэшей для «взлома». Итак, я нахожусь на этапе, когда мне нужно сравнить два файла. Но мне это кажется слишком «простым», я мог бы посмотреть в своем курсе, и мы говорим о сокращении функций, но я не вижу, как (когда) это реализовать.

Я уже мог читать файл, и я мог читать построчно свой большой файл и сравнивать каждый хеш с моим маленьким. Я не знаю, где и особенно как реализовать в моем алгоритме приведение функции и в чем оно заключается.

Большое спасибо за вашу помощь, если нужно, я помещаю свой код.

private static void bufferedReaderFilePasswordFirst() throws IOException {
        Path path = Paths.get("C:\\Users\\basil\\OneDrive - Haute Ecole Bruxelles Brabant (HE2B)\\Documents\\NetBeansProjects\\sha256\\passwords.txt");
        int nbOfLine = 0;
        StringBuffer oui = new StringBuffer();
        List<String> test = hashMap();
        
        final DecimalFormat df = new DecimalFormat();
        final DecimalFormatSymbols ds = df.getDecimalFormatSymbols();
        ds.setGroupingSeparator('_');
        df.setDecimalFormatSymbols(ds);
        
        try (BufferedReader readerPasswordGenerate = Files.newBufferedReader(path, Charset.forName("UTF-8"));) {

            String currentLinePassword = null;
            long start = System.nanoTime();
            while(((currentLinePassword = readerPasswordGenerate.readLine()) != null)){
                String firstWord = currentLinePassword.substring(0, currentLinePassword.indexOf(":"));
                int indexList = test.indexOf(firstWord);
                if(indexList!=-1){
                    System.out.println(indexList);
                    String secondWord = currentLinePassword.substring(currentLinePassword.lastIndexOf(":") + 1);
                    oui.append(secondWord).append(System.lineSeparator());
                }
                nbOfLine++;

                if(nbOfLine%1_000_000==0){
                    System.out.printf(
                            "%s / %s%n",
                            df.format(nbOfLine),
                            df.format(10000000));
                }
            }
            System.out.println(oui);
            final long consumed = System.nanoTime() - start;
            final long totConsumed = TimeUnit.NANOSECONDS.toMillis(consumed);
            final double tot = (double) totConsumed;
            System.out.printf("Done. Took %s seconds", (tot / 1000));
        } catch (IOException ex) {
            ex.printStackTrace(); //handle an exception here
        }
    }

Список тестов — это всего лишь список из 100 хэшей, которые нужно взломать.


person Forcela8    schedule 15.04.2021    source источник
comment
Мне неясен вопрос. Какую хэш-функцию вы атакуете? Вы уже построили радужный стол? Ваша таблица помещается в оперативную память или только на диск? Если на диске, то это SSD?   -  person Meir Maor    schedule 15.04.2021


Ответы (1)


в моем курсе, и мы говорим о сокращении функций, но я не вижу, как (когда) это реализовать.

Я думаю, вы не совсем понимаете, что такое радужные таблицы и чем они отличаются от простой таблицы паролей и хэшей этих паролей.

Радужные таблицы — это способ сэкономить место для хранения в обмен на увеличение времени, необходимого для проверки каждого хэша пароля по сравнению с паролем-кандидатом по сравнению с полной предварительно вычисленной таблицей паролей и хэшей.

Радужные таблицы используют функцию сокращения. Функция редукции принимает хэш и номер столбца (см. ниже) и использует их для генерации возможного пароля. По сути, это генератор случайных паролей, который использует хэш и столбец в качестве входного семени.

Радужные таблицы принимают входной пароль-кандидат открытого текста, затем многократно
хешируют текущий открытый текст
сокращают хэш до нового открытого текста
до тех пор, пока не завершится некоторое заранее выбранное количество повторений, и хешируют окончательный открытый текст. . Затем вы сохраняете только начальный пароль и окончательный хэш. Каждая итерация представляет собой столбец. Большинство из них не сохраняются, но их номера используются для изменения выходных данных функции сокращения и предотвращения некоторых проблем.

Чтобы найти пароль по его хэшу:

  • Найдите хэш в таблице. Если он есть, вырваться из цикла.
  • Если его там нет, уменьшите хэш до другого открытого текста, хешируйте его и вернитесь к началу, используя этот хеш.

Теперь вы знаете, к какой цепочке (если она есть) в таблице принадлежит этот конкретный хэш. Возьмите начальный открытый текст этой цепочки и начните хэшировать и сокращать его, пока не дойдете до известного хэша. Предыдущий открытый текст является паролем!

Радужные таблицы не работают ни с одной системой хеширования паролей, использующей солт-значения. Первой такой системой была Unix crypt в 1976 году. так что это, как правило, бесполезная атака. Этому до сих пор учат, потому что название крутое, и все еще есть люди, которые создают системы, которые не добавляют соли в хэши своих паролей.

Эта статья — достойное объяснение. В Википедии есть более подробная информация.

person SAI Peregrinus    schedule 15.04.2021