区分密码属性:隐藏和抗碰撞
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是一样大的,这次一个函数居然可以做到真正的抗碰撞了!)
我从 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是一样大的,这次一个函数居然可以做到真正的抗碰撞了!)