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

时间:2018-09-04 10:28:42

标签: hash cryptography hash-collision

我从Another question中看到了以下定义,这些定义有所澄清:

耐碰撞性:

给出:x和h(x)

很难找到:与x不同的y,使得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))的抗冲突能力,但我认为它也隐藏了吗?

1 个答案:

答案 0 :(得分:0)

哈希函数可以提供抗碰撞性

必须隐藏承诺。

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

非常严格地说,您认为哈希函数不能提供抗碰撞性:总是存在碰撞。理论上,输入空间是无限的,但该功能始终会产生固定长度的输出。术语实际上应该是“ H是从一系列耐碰撞功能中随机抽取的”。但是在实践中,我们将只调用该函数以防止碰撞,而忽略它在技术上并非如此。

承诺必须提供两个属性:隐藏和绑定。绑定意味着您只能将其打开为一个值(这是与抗碰撞性有关的地方)。隐藏意味着无法了解其中包含的元素的任何信息。这就是为什么安全承诺必须使用随机性(或名词),但说了又说完之后,那些归结为相同的原因。想象一下任何哈希函数,无论您希望它多么完美:如果需要,您可以使用随机预言。如果我给您一个值H(m)的哈希值m,您可以计算H(0),比较结果并了解m = 0是否意味着它没有隐藏。

这也是为什么g^x不是隐藏的承诺方案的原因。是否绑定取决于消息空间的允许范围:如果允许所有整数,则简单的攻击y = x*phi(n)会产生H(y)=H(x)。 作品。如果将其定义为ℤ_p,其中p是组顺序,则它是完全绑定的,因为它是一种信息理论上耐碰撞的单向函数。 (由于消息空间和目标空间的大小相同,所以这次单个功能实际上可以真正防止碰撞!)