1

我正在尝试创建一种方法来反转在以下位置列出的 PseudoCrypt 脚本:http ://blog.kevburnsjr.com/php-unique-hash 。在此代码中,它具有以下等式:

$dec = ($num * $prime)-floor($num * $prime/$ceil)*$ceil;

我已经能够获取除 $num 之外的所有变量。例如,采用以下数字:

$dec = 566201239;
$prime = 566201239;
$ceil = 916132832;

等式将如下所示:

566201239 = ($num * 566201239)-floor($num * 566201239/916132832)*916132832;

答案应该是 1。但是我还没有确定使方程 = $num 的方式。我想使用它在 URL 中创建的哈希,然后解密哈希以在我的数据库中执行查询。

编辑:如果有更好的方法来创建一个独一无二的哈希值,并且复制空间很小,我会对此持开放态度。

编辑:不知何故,我为 $dec 输入了错误的值。编辑:使用功能代码更新的博客帖子。

4

3 回答 3

2

感谢评论者 Padraig Kennedy 的帮助,该库已升级为支持可逆性
http://blog.kevburnsjr.com/php-unique-hash

于 2013-05-14T22:45:04.790 回答
1

请注意

东西 - 地板(东西/天花板)*天花板

与 (thing%ceil) 相同,其中 % 是模运算符(除法后的余数)。在你的情况下,

$dec = ($num * $prime) % $ceil

请注意,这始终介于 0 和 $ceil-1 之间,因此无法获得等于 $ceil 的值 $dec。另一方面,对于给定的介于 0 和 $ceil-1 之间的 $dec,您可以有效地找到介于 0 和 $ceil-1 之间的解 $num。

(观察结果是,如果 $num 是一个解决方案,那么对于任何 i 来说,$num+i*$ceil 也是一个解决方案。)

这是 $dec=42 的处理方法。

我们将使用 $ceil = 2^5 * 31^5 这一事实。因此方程给出

42 = ($num * 566201239) % (2^5 * 31^5)

首先让我们找出 ($num%2),即 $num 是奇数还是偶数。我们对等式两边取模 2:

0 = 42 % 2 = (($num * 566201239) % (2^5*31^5)) % 2。

因为 2 除以 $ceil,所以右边是 ($num * 566201239)%2。如果必须为 0,则 $num 必须是偶数(因为 $prime 不是)。因此,对于某些 $a 和 ($num = 2*$a),我们有

2*21 = 42 = (2 * $a * 566201239) % (2^5 * 31^5),

除以 2 后,我们得到

21 = ($a * 566201239) % (2^4 * 31^5)。

请注意,% 符号后面的部分也除以 2。我们继续取模 2。我们得到 $a 是奇数,即对于某个 $b,$a = 2*$b+1。

21 = ((2*$b+1) * 566201239) % (2^4 * 31^5),

349931614 ≡ 21-566201239 ≡ (2*$b * 566201239) % (2^4 * 31^5),

(我开始使用同余符号 ≡;x ≡ y % z 我的意思是 x%z = y%z)。

174965807 ≡ ($b * 566201239) % (2^3 * 31^5)

我们继续...

174965807 ≡ ((2*$c+1) * 566201239) % (2^3 * 31^5)

174965807 - 566201239 ≡ (2*$c * 566201239) % (2^3 * 31^5)

66830984 ≡ 2*$c * 566201239) % (2^3 * 31^5)

33415492 ≡ ($c * 566201239) % (2^2 * 31^5)

33415492 ≡ (2*$d * 566201239) % (2^2 * 31^5)

16707746 ≡ ($d * 566201239) % (2 * 31^5)

16707746 ≡ (2*$e * 566201239) % (2 * 31^5)

8353873 ≡ ($e * 566201239) % (31^5)。

总结一下替换,回想一下

$num = 2*$a = 2*(2*$b+1) = 4*$b+2 = 4*(2*$c+1)+2 = 8*$c+6 = 8*2* $d+6 = 8*2*2*$e+6 = 32*$e + 6

顺便说一句,我们也可以减少方程模 31^5 中的 $prime (我们可以在每一步中通过当前模继续减少它,但谁在乎呢?):

8353873 ≡ ($e * 22247370) % (31^5)。

我们可以看到,乘数不是素数,但实际上无所谓。

现在我们看看最后一个以 31 为模的方程。

8353873 ≡ ($e * 22247370) % (31^5)。

24 ≡ 8353873 ≡ ($e * 22247370) % (31^5) ≡ ($e*22247370) ≡ ($e*3) % 31

在 3 的倍数模 31 的查找表中,我们发现 $e≡8 % 31,或者 $e=31*$f+8:

8353873 ≡ ((31*$f+8) * 22247370) % (31^5)。

8353873 - 8*22247370 ≡ (31*$f*22247370) % (31^5)。

2149819 ≡ 8353873 - 8*22247370 ≡ (31*$f*22247370) % (31^5)。

69349 = 2149819/31 ≡ ($f*22247370) % (31^4)

我们继续...

2 ≡ 69349 % 31 ≡ ($f*22247370) % (31^4) ≡ ($f*3) % 31

$f ≡ 11 % 31

$f = 31*$g + 11

69349 ≡ ((31*$g+11)*22247370) % (31^4)

81344 ≡ 69349 - 11*22247370 ≡ (31*$g*22247370) % (31^4)

2624 ≡ ($g*22247370) % (31^3)

让我们再次减少乘数...

2624 ≡ ($g*23284) % (31^3)

20 ≡ 2624 ≡ ($g*23284) % (31^3) = ($g*3) % 31

$g = 31*$h+17

2624 ≡ ((31*$h+17)*23284) % (31^3)

23870 ≡ 2624 - 17*23284 ≡ (31*$h*23284) % (31^3)

770 ≡ ($h*23284) % (31^2)

26 ≡ 770 ≡ ($h*23284) % (31^2) = ($h*3) % 31

$h = 31*$i + 19

770 ≡ ((31*$i+19)*23284) % (31^2)

434 ≡ 770 - 19*23284 ≡ (31*$i*23284) % (31^2)

14 = ($i*3) % 31

$i = 15

通过反向替换,我们得到 $h=31*15+19 = 484, $g=31*$h+17 = 15021, $f=31*$g+11 = 465662, $e=31*$f+8 = 14435530,$num=32*e+6 = 461936966。

它仍然只是检查结果:

.>>> (461936966*566201239)%916132832

42

哇!:-)

博客的人应该宁愿使用md5。

于 2011-04-08T16:53:07.620 回答
0

由于其作者将其称为哈希函数,因此我认为它不能被“解密”。当搜索时间足够长时,您会发现多个输入产生相同的哈希,因此无法知道使用了哪一个。

于 2011-04-08T14:13:24.507 回答