是否有任何输入SHA-1将计算为十四进制的十六进制值,即"0000000000000000000000000000000000000000"?
daf*_*daf 20
是的,这非常不可能.即2 ^ 160中的一个,或0.00000000000000000000000000000000000000000000006842277657836021%.
Bri*_*ack 14
此外,由于SHA1在加密方面非常强大,它在计算上也是不可行的(至少对于当前的计算机技术 - 对于诸如量子计算等新兴技术的所有投注都是关闭的)来找出哪些数据会导致全零散列,直到它在实践中发生.如果你真的必须使用"0"哈希作为标记,请确保包含一个适当的断言(你不只是将输入数据哈希到你的"零"哈希标记),它仍然存在于生产中.这是您的代码永久需要检查的失败情况.警告:如果存在,您的代码将永久损坏.
根据您的情况(如果您的逻辑可以处理空字符串作为特殊情况以禁止输入)您可以使用空字符串的SHA1哈希('da39a3ee5e6b4b0d3255bfef95601890afd80709').如果您的输入仅具有数字作为不变量,也可以使用不在输入域中的任何字符串的哈希值,例如sha1('a').如果输入被预处理以添加任何常规装饰,那么没有装饰的东西的散列也会起作用(例如:sha1('abc')如果像'foo'这样的输入用引号装饰为类似''foo''的东西).
我不这么认为.
没有简单的方法来说明为什么它不可能.如果有,那么这本身就是找到碰撞的算法的基础.
更长的分析:
预处理确保1
输入中始终至少有一位.
循环w[i]
将仅保留原始流,因此输入中至少有一个1位(字0到15).即使巧妙地设计了位模式,至少有一些0到15的值必须是非零的,因为循环不会影响它们.
注意:leftrotate
是循环的,因此不会丢失1位.
在主循环中,很容易看出因子k
永远不为零,因此temp
不能为零,因为右侧的所有操作数都为零(k
从不).
这给我们留下了一个问题:是否可以(a leftrotate 5) + f + e + k + w[i]
通过溢出总和来创建一个返回0 的位模式.对于这一点,我们需要找到值w[i]
,使得w[i] = 0 - ((a leftrotate 5) + f + e + k)
这可以用于前16个值,w[i]
因为您可以完全控制它们.但是,xor
通过前16个值再次创建单词16到79 .
所以下一步可能是展开循环并创建一个线性方程组.我将把它作为练习留给读者;-)系统很有意思,因为我们有一个循环可以创建额外的方程式,直到我们得到稳定的结果.
基本上,选择算法的方式是您可以通过选择输入模式来创建单独的0个单词,但这些效果可以通过xor
输入模式来创建64个其他输入.
举个例子:为了使temp
0,我们有
a = h0 = 0x67452301
f = (b and c) or ((not b) and d)
= (h1 and h2) or ((not h1) and h3)
= (0xEFCDAB89 & 0x98BADCFE) | (~0x98BADCFE & 0x10325476)
= 0x98badcfe
e = 0xC3D2E1F0
k = 0x5A827999
Run Code Online (Sandbox Code Playgroud)
这给了我们w[0] = 0x9fb498b3
等等.这个值然后用在单词16,19,22,24-25,27-28,30-79中.
类似地,单词1用在单词1,17,20,23,25-26,28-29,31-79中.
如您所见,有很多重叠.如果计算的输入值会给出0结果,则该值会影响最后32个其他输入值.
亚伦的帖子不正确.它被挂在SHA1计算的内部,而忽略了在round函数结束时发生的事情.
具体来说,请参阅维基百科的伪代码.在该轮结束时,进行以下计算:
h0 = h0 + a
h1 = h1 + b
h2 = h2 + c
h3 = h3 + d
h4 = h4 + e
Run Code Online (Sandbox Code Playgroud)
所以,全0输出可以发生,如果h0 == -a
,h1 == -b
,h2 == -c
,h3 == -d
,并h4 == -e
进入最后一节,这里的计算是模2 ^ 32.
回答你的问题:没有人知道是否存在产生所有零输出的输入,但是密码学家希望存在基于daf提供的简单参数.
如果不了解 SHA-1 内部原理,我不明白为什么任何特定值都是不可能的(除非在算法描述中明确说明)。全零值的可能性不大于或小于任何其他特定值。
归档时间: |
|
查看次数: |
8417 次 |
最近记录: |