小编Mak*_*min的帖子

在 O(n) 的复杂度内反转 SHA-256 sigma0 函数?

介绍

作为 SHA-256 散列算法的一部分,有一个函数通常被称为?1,或者sigma0为了方便起见。基本上,它以 X 作为输入,其中 X 是 32 位无符号值。然后像这样转换它:

ROTATE_RIGHT(X, 7) ^ ROTATE_RIGHT(X, 18) ^ SHIFT_RIGHT(X, 3)

Run Code Online (Sandbox Code Playgroud)

一点解释,如果你需要的话:

  • ROTATE_RIGHT(X, Y) - 将 X 的位向右旋转 Y
  • SHIFT_RIGHT(X, Y) - 将 X 的位右移 Y,因此结果的前 Y 位始终为 0

另外,如果您需要代码,这里是 Python 的完整版本:

ROTATE_RIGHT(X, 7) ^ ROTATE_RIGHT(X, 18) ^ SHIFT_RIGHT(X, 3)

Run Code Online (Sandbox Code Playgroud)

反向功能

我开始怀疑那个东西是否可逆,令我惊讶的是,编写一个函数并没有花很长时间,该函数根据 givensigma0的输出返回该函数的输入,或者简单地说,反转sigma0函数。我不会把代码放在这里,因为它是用 Node.js 编写的,并且根据sigma0通过掩码搜索特定输入的更复杂的需求进行了大量修改,但我想给你一个我如何解决它的基本概念,所以也许你可以用一些关于如何实现我需要的新想法来启发我。

我的解决方案很简单,但它也是递归的。我们知道每个输出的位都是两个或三个输入位的异或运算的结果。所以我制作了一个依赖表,以便我可以看到输出位如何受到输入位的影响:

I:  00,01,02,03,04,05,06,07,08,09,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31

R7  25,26,27,28,29,30,31,00,01,02,03,04,05,06,07,08,09,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24
R18 14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,00,01,02,03,04,05,06,07,08,09,10,11,12,13
S3  zz,zz,zz,00,01,02,03,04,05,06,07,08,09,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28
---------------------------------------------------------------------------------------------------
O:  00,01,02,03,04,05,06,07,08,09,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31
Run Code Online (Sandbox Code Playgroud)

这件事是关于什么的?假设,在输出的第 1 位中,我们有 1。为方便起见,我将其写为O[0], …

algorithm hash cryptography reverse-engineering

2
推荐指数
1
解决办法
410
查看次数