Hash 用暴力破解单向散列属性和证明冲突之间的区别

Hash 用暴力破解单向散列属性和证明冲突之间的区别,hash,collision-detection,Hash,Collision Detection,对于任何哈希函数,无论从概念上还是其他方面来说,上述两种操作之间的区别是什么。我以以下方式处理这个问题: H=hash(someplaintext) n=0 while 1: if hash(str(n))==H: print n n+=1 这两种性质都可以用这种方式证明,有什么问题吗?忽略效率、内存使用或任何此类属性。请严格按照正确性回答我的问题我可能没有正确理解你的问题,但以下是我的看法: 暴力强制碰撞始终有效,无论其是否具有抗碰撞性。单向散列函数并不意味着

对于任何哈希函数,无论从概念上还是其他方面来说,上述两种操作之间的区别是什么。我以以下方式处理这个问题:

H=hash(someplaintext)
n=0
while 1:
    if hash(str(n))==H:
        print n
    n+=1

这两种性质都可以用这种方式证明,有什么问题吗?忽略效率、内存使用或任何此类属性。请严格按照正确性回答我的问题

我可能没有正确理解你的问题,但以下是我的看法:

暴力强制碰撞始终有效,无论其是否具有抗碰撞性。单向散列函数并不意味着不可能找到冲突,它意味着对手找到冲突的机会微乎其微,这通常由

\epsilon < \frac{1}{p(n)}
\epsilon<\frac{1}{p(n)}
其中
p(n)
表示一个多项式,表示
n
(请原谅语法)

在你的例子中,你只是发现了一个冲突,这并不能证明哈希函数不是单向的,因为你在循环所有的可能性,这意味着你没有打破1/p(n)条件。

“单向”意味着给定一个函数输出,你找不到匹配的输入,除非你尝试了许多潜在的输入并获得了运气。冲突是指找到两个不同的输入,它们产生相同的输出,而对所述输出没有任何预定义的约束

好的(加密)散列函数应该具有三个经典属性:

  • 对前像的抵抗力:给定x,应该不可能找到m,使得h(m)=x
  • 对第二个前像的抵抗力:给定m,发现m'与m不同是不可行的,因此h(m)=h(m')
  • 抗碰撞性:不可能找到相互不同的m和m',例如h(m)=h(m')
这可以看作是攻击者面临的三大挑战,按难度的降低排序。对于前图像,我给您一个输出,并要求您找到匹配的输入。对于第二个前图像,我给您一个输入(隐式地给出了相应的输出),并要求您找到另一个匹配的输入。对于碰撞,这类似于第二个前图像质询,只是我不要求您找到特定的输出;任何人都可以。或者,反过来说:对第二个前映像的质询就像是对碰撞的质询,其中一条碰撞消息不能由攻击者自由选择

在不利用散列函数本身任何弱点的情况下,对于具有n位输出的散列函数,用于查找前映像、第二前映像和冲突的通用方法的成本约为2n(对于前映像和第二前映像)和2n/2(对于冲突)。因此,发现碰撞要容易得多。对于前图像,您只需尝试输入,直到您运气好为止(这就是您所谓的“暴力”);每次尝试成功的概率为2-n。对于碰撞,这涉及到:基本上,一旦你积累了大约2n对输入/输出,其中两对具有相同输出的概率上升得相当快


就生日而言,这意味着如果你随机选取20个人,其中两个人的生日很可能相同,但你无法选择哪一天或哪一个人。另一方面,如果你想找到与你生日相同的人,那么你必须平均抽样调查365人。

我完全同意你所说的,但我认为你误解了我的问题,我想问的是,在发现碰撞和用暴力破坏一条路之间是否有任何区别。从我读过的所有文章和你的评论来看,“蛮力”并不是指在不使用任何函数内部结构知识的情况下应用原始能力。生日攻击是一种“暴力”攻击,因为它将函数作为一个黑匣子处理(实际上,首选术语是“一般攻击”)。暴力冲突和暴力前照之间存在巨大的成本差异。我同意你的说法,但我的问题是“暴力破坏单向属性”和“冲突检测”之间的区别