Encryption 如何找到散列的可能数

Encryption 如何找到散列的可能数,encryption,Encryption,如果我有这样的散列:0d47aeda9d97686ab3da96bae2c93d078a5ab253 如果从0000000000000000000000000000000000000000到99999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999

如果我有这样的散列:0d47aeda9d97686ab3da96bae2c93d078a5ab253


如果从0000000000000000000000000000000000000000到9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999991是sha1的一般长度,那么如何计算出要尝试的可能性数。

2^(X)
其中
X
是散列中的位数。
在散列值的常规十六进制字符串表示法(如您给出的)中,每个字符是4位,因此它将是
2^(4*len)
,其中
len
是散列值的字符串长度。在您的示例中,有一个40个字符的SHA1摘要,它对应于160位,或2^160==1.46150163730029182036848327163E+48个值。

散列是160位,因此有2^160个可能的散列

您的十六进制数字范围是0到f


然后,它只是16^40,或者不管它包含多少个字符,最大的变化是重复的,并且注意顺序,被定义为n^k。在您的情况下,这意味着10^40,这对于SHA1是不正确的。阅读维基百科,它说SHA1具有2^80的基于冲突的攻击的最大复杂性,使用不同的技术,研究人员已经准备好成功处理2^51冲突,因此10^40似乎有点多。

回想一下,哈希函数接受任意长度的输入。一个好的加密散列函数似乎会将“随机”散列结果分配给任何输入。因此,如果摘要的长度为N位(对于SHA-1,N=160),则每个输入都将散列为2^N个可能结果中的一个,我们将以随机方式处理

这意味着为哈希结果查找前映像的期望是通过2^N个输入运行。它们不必是您建议的特定范围-任何2^N不同的输入都可以


这也意味着2^N输入不能保证你会找到一张前照-每次尝试都是随机的,因此你可能会错过每一个2^N输入中的1/2^N机会(就像掷硬币两次不能保证你至少得到一次头像)。但是,您可以计算出需要多少输入才能找到概率为p或更大的散列的前映像——p与您想要的值尽可能接近(实际上不是1)。

因此,使用php,我可以做一些类似$length=strlen($hash)的事情$总计=功率(4*$长度)@Sarman-
pow()
缺少第一个参数
$base
,该参数为2,但是是的,看起来基本正常。只需执行
pow(16,strlen($hash))
可能更简单,请记住,这假设
$hash
字符串始终采用十六进制表示。