1

我正在学习密码学课程,但我的老师描述的一些事情真的不清楚并且解释得不好。

他让我在 Java 中创建一个算法来生成一个 RT 表(散列/文本)并创建一个包含 100 个散列的文件(test.txt)来“破解”。所以我正处于必须比较两个文件的阶段。但在我看来太“简单”了,我可以看一下我的课程,我们讨论功能缩减,但我不知道如何(何时)实现它。

我已经可以进行文件读取,并且可以逐行读取我的大文件并将每个散列与我的小散列进行比较。我不知道在哪里,尤其是如何在我的算法中实现函数缩减以及它包含什么。

非常感谢您的帮助,如果需要我把我的代码。

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 个哈希列表

4

1 回答 1

0

在我的课程中,我们讨论了功能缩减,但我不知道如何(何时)实现它。

我认为您对彩虹表甚至什么以及它们与简单的密码表和这些密码的哈希有何不同感到困惑。

与预先计算的完整密码和哈希表相比,彩虹表是一种节省存储空间的方法,以换取增加检查每个密码哈希与候选密码所需的时间。

彩虹表使用“减少功能”。归约函数接受散列和列号(见下文)并使用它来生成可能的密码。本质上,它是一个随机密码生成器,它使用哈希和列作为其输入种子。

彩虹表采用明文密码候选输入,然后重复
散列当前明文
,将散列减少为新的明文
,直到完成某些预先选择的重复次数,并对最终明文进行散列。然后你只存储起始密码候选和最终哈希。每次迭代都是一个“列”。大多数没有存储,但它们的数字用于改变归约函数的输出并防止一些问题。

要从其哈希中查找密码:

  • 在表中查找哈希。如果它在那里,请跳出循环。
  • 如果它不存在,请将散列减少为另一个明文,对其进行散列,然后使用该散列返回开始。

您现在知道该特定哈希属于表中的哪个链(如果有)。取该链的起始明文,并开始散列并减少它,直到你得到已知的散列。前面的明文就是密码!

彩虹表不适用于任何使用“盐”值的密码散列系统。第一个这样的系统是1976 年的 Unixcrypt,所以这往往是无用的攻击。它仍然被教授,因为这个名字很酷,并且仍然有人制作不加盐密码哈希的系统。

这篇文章是一个不错的解释。维基百科有更多细节。

于 2021-04-15T18:38:50.200 回答