区分密码属性:隐藏和抗碰撞

Distinguishing cryptographic properties: hiding and collision resistance

我从 Another question 中看到了以下定义,这在一定程度上阐明了:

防撞:

给定:x 和 h(x)

很难找到:y 与 x 不同并且满足 h(y)=h(x)。

隐藏:

给定:h(r|x),其中 r|x 是 r 和 x 的串联

秘密:x 和一个极不可能且随机选择的 r

很难找到:y 使得 h(y)=h(r|x)。其中 r|x 是 r 和 x

的串联

这与抗碰撞不同,y=r|x与否无关紧要

我的问题:

这是否意味着如果没有秘密r,则任何哈希函数h(x)都是非隐藏的,即哈希是h(x),而不是h(r|x)?其中 r|x 是 r 和 x

的串联

示例:

假设我创建了一个简单的哈希函数 h(x) = g^x mod(n),其中 g 是组的生成器。散列应该与 p(x_1 != x_2, h(x_1) = h(x_2)) = 1/(2^(n/2)) 抗碰撞,但我认为它也隐藏了?

哈希函数可以提供一定程度的抗碰撞性

必须隐藏承诺。

与流行观点相反,这些原语并不相同!

非常严格地说,您认为的散列函数不能提供抗碰撞性:碰撞总是存在的。输入 space 在理论上是无限的,但函数总是产生固定长度的输出。术语实际上应该是“H 是从一系列抗碰撞函数中随机抽取的”。然而在实践中,我们只是称该函数为抗碰撞函数,而忽略它在技术上不是。

承诺必须提供两个属性:隐藏和绑定。绑定意味着您只能将其打开为一个值(这就是与抗碰撞的关系所在)。隐藏意味着不可能了解其中包含的元素的任何信息。这就是为什么安全承诺必须使用随机性(或通知,但说到底,归根结底是一样的)。想象一下任何哈希函数,无论您希望它多么完美:如果需要,您可以使用随机预言机。如果我给你一个值 m 的散列 H(m),你可以计算 H(0),比较结果并了解是否 m = 0,这意味着它没有隐藏。

这也是 g^x 不是隐藏承诺计划的原因。它是否绑定取决于您允许什么作为消息-space:如果您允许所有整数,那么一个简单的攻击y = x*phi(n)会产生H(y)=H(x)。 作品。如果将其定义为 ℤ_p,其中 p 是群阶,那么它是完全绑定的,因为它是一种信息理论上的抗碰撞单向函数。 (由于message-space和target-space是一样大的,这次一个函数居然可以做到真正的抗碰撞了!)