SHA256自由启动自碰撞(最多64发)

IVec:

72BF9EF1 27B82DFB F298F3B7 22B6C32C 18A54860 4C032D91 ADD7B85B 7ED1A4AC


块:

0000004D 0000006F 00000075 00000073 00000065 00000054 00000072 00000061
00000070 00000000 00000000 00000000 00000000 00000080 00000000 000001B8


输出:

72BF9EF1 27B82DFB F298F3B7 22B6C32C 18A54860 4C032D91 ADD7B85B 7ED1A4AC


http://modalisengineering.com/crypt/sha256mt.c

这是一个问题?

评论

IVEC不是数据块的一部分。上面的链接显示了一个示例C程序,该程序允许在命令行上输入IVEC。或者,编辑任何公开可用的源代码并使用上面的IVEC。在此示例中,输入块可以重复任意次数,并且哈希值不变。

实际上,这更多是固定点($ f(x)= x $)而不是碰撞。

实际上,这更多是一个固定点(f(x)= x)。对。我在想,是否有许多这样的已知固定点会给SHA256带来危险的见解?

我验证了使用SHA256压缩该对(IV,块)对确实可以重现输入IV。您是怎么找到这个的?

给我一个64字节的块,我给你零点的IVEC

#1 楼

SHA-256基于Davies-Meyer压缩功能。容易发现不动点是该结构的一个已知属性。对于构造:对于任何$ m $,都可以找到$ h $的值,使得$ E_m(h)\ oplus h = h $:一个人只需要设置$ h = E_m ^ {-1}(0) $。这是随机函数当然不具备的属性。到目前为止,还没有基于此属性的实际攻击,但是应该意识到这一“特征”。
定点可用于第二次原像攻击(给出消息m1,攻击者会发现另一条消息) m2在时间$ 3 \ cdot 2 ^ {n / 2 + 1} + 2 ^ {n-k +中满足$ 2 ^ k $消息块消息的Kelsey和Schneier的hash(m1)= hash(m2)) 1} $。如果构造不允许轻易创建固定点(例如Matyas–Meyer–Oseas或Miyaguchi–Preneel),则可以使用$ k \ cdot 2 ^ {n / 2 + 1} + 2 ^ {n-k进行此攻击+1} $时间。请注意,在这两种情况下,当消息较长时,复杂度都高于$ 2 ^ {n / 2} $,但低于$ 2 ^ n $;当消息变短时,攻击的复杂度接近$ 2 ^ n $。

(来自单向压缩功能-Wikipedia)
感谢塞缪尔·内维斯(Samuel Neves)指出这一点。

评论


$ \ begingroup $
我不明白为什么这不是一次完整的碰撞?难道不能将其用于实际的长度扩展攻击吗?
$ \ endgroup $
–梅尔·莫尔(Meir Maor)
17年6月24日在14:17

$ \ begingroup $
@MeirMaor要滥用此属性,您需要获取哈希状态,以匹配对压缩函数基础的块密码进行解密时所获得的状态。找到这样的比赛需要花费$ 2 ^ {n / 2} $的中间相遇攻击,因此比找到碰撞便宜。
$ \ endgroup $
– CodesInChaos
17年6月24日在14:48



$ \ begingroup $
相关的crypto.stackexchange.com/questions/44642/…
$ \ endgroup $
– Q-Club
17年6月28日在19:48

$ \ begingroup $
@CodesInChaos在您发布的描述中,函数Em()可以反转。在问题的上下文中,Em()是否为SHA-256?我没有尝试用未定义的IV和W_t来反转SHA-256(我将有更多的自由度)。逆转一个方程式一个未知的mod 2 ^ 32加法并不完全直观。
$ \ endgroup $
– Q-Club
17-6-29 at 2:05



$ \ begingroup $
@back_seat_driver $ E_m $是SHACAL-2,SHA-2的分组密码。实际上,所有分组密码都支持有效的解密。注意,$ m $是SHA-2的消息块,用作分组密码中的密钥,而IV用作消息。
$ \ endgroup $
– CodesInChaos
17-6-29 at 14:03



#2 楼

我在reddit上看到类似的帖子后发现了这个主题。看来作者正在从这里到黑客新闻再到cryptography.reddit。

我很好奇,是否可以用SAT找到这些固定点,结果答案是“是的。 ”并且很快。我对reddit的评论转载于此。感兴趣的部分位于底部,在这里我展示了使用SAT可以轻松找到这些固定点。

我为SHA256采用了Cryptol实现,并添加了呈现的常量:

hAttack : [8][32]
hAttack =
  [0xad3381f1, 0x8f9dae20, 0x5419ec4e, 0xc0a9c019, 0x839a030f,
   0xe8bfad5a, 0xd308ae65, 0x3a456ff1]

mAttack : [16][32]
mAttack =
  [0x5b4adf0b, 0xb6373803, 0xdae2f3a9, 0xa951f172, 0xea5ca7b5,
   0x9ce5d74a, 0xce7a52a5, 0xb222cc78, 0xb69c9ed2, 0x60685995,
   0xc5bb23de, 0x1ffe6463, 0xa2c707da, 0xf76ac1c1, 0x71858d71,
   0xc94b58ad]


然后计算是

hPostAttack : [8][32]
hPostAttack = SHA256Compress hAttack (SHA256MessageSchedule mAttack)


我们剩下的问题是:

SHA256> hPostAttack == hAttack
True


为了便于演示,我们可以定义一个帮助器:

attackedFunction : [8][32] -> [16][32] -> [8][32]
attackedFunction h m = SHA256Compress h (SHA256MessageSchedule m)


这是一个很不错的要点,您可以要求您使用现代SAT求解器:

:sat \h m -> attackedFunction h m == h


Boolector可以快速解决此问题(而其他人没有足够快地终止我的口味):

(\h m -> attackedFunction h m == h)
  [0x85bc5e5e, 0x3f915388, 0xbdf7d66e, 0x391de59f, 0xf274a8a7,
   0x2cda9e8a, 0x84a49266, 0xaafb7f03]
  [0x914a03b5, 0x43a0873d, 0xbf4839a4, 0x8ee2573a, 0x83b9c634,
   0xce68bdf3, 0x28e46e7d, 0x12121529, 0x3f8cfbb2, 0x1ba42c39,
   0xe9f045cf, 0x6f591416, 0x5219af1d, 0x9f4f98a5, 0x459adb3d,
   0xec7b71c0] = True




(\h m -> attackedFunction h m == h && h != [0x85bc5e5e, 0x3f915388,
                                            0xbdf7d66e, 0x391de59f, 0xf274a8a7, 0x2cda9e8a,
                                            0x84a49266, 0xaafb7f03])
  [0xfbfce142, 0xf1bd9a26, 0x0d57d527, 0xb8ddd0ae, 0xd1393f0a,
   0x53a1c4b4, 0x167dcc03, 0x67ca2e21]
  [0x7ecce350, 0x47b67412, 0x06b2ba9b, 0x13ed7363, 0x6fecd8eb,
   0x03ea043d, 0xf315c864, 0xf9616041, 0x66a269ad, 0x001e71ff,
   0x2ad7cd97, 0x52125bbc, 0x253bc0d6, 0xdb1b6fa6, 0x0e8d5430,
   0x45a9f029] = True


评论


$ \ begingroup $
实际上,您不需要SAT求解器; SHA-256哈希压缩函数为$ hc(state,message)= state \ oplus E_ {message}(state)$,以获得易于反转(如果您知道的消息)$ E $。您所需要做的就是获取任意消息块,并找到$ 0 = E_ {message}(state)$的状态
$ \ endgroup $
–雨披
19年5月27日在21:50