我从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))
的抗冲突能力,但我认为它也隐藏了吗?
答案 0 :(得分:0)
哈希函数可以提供抗碰撞性
必须隐藏承诺。
与流行观点相反,这些原语并不相同!
非常严格地说,您认为哈希函数不能提供抗碰撞性:总是存在碰撞。理论上,输入空间是无限的,但该功能始终会产生固定长度的输出。术语实际上应该是“ H是从一系列耐碰撞功能中随机抽取的”。但是在实践中,我们将只调用该函数以防止碰撞,而忽略它在技术上并非如此。
承诺必须提供两个属性:隐藏和绑定。绑定意味着您只能将其打开为一个值(这是与抗碰撞性有关的地方)。隐藏意味着无法了解其中包含的元素的任何信息。这就是为什么安全承诺必须使用随机性(或名词),但说了又说完之后,那些归结为相同的原因。想象一下任何哈希函数,无论您希望它多么完美:如果需要,您可以使用随机预言。如果我给您一个值H(m)
的哈希值m
,您可以计算H(0)
,比较结果并了解m = 0
是否意味着它没有隐藏。
这也是为什么g^x
不是隐藏的承诺方案的原因。是否绑定取决于消息空间的允许范围:如果允许所有整数,则简单的攻击y = x*phi(n)
会产生H(y)=H(x)
。
作品。如果将其定义为ℤ_p
,其中p
是组顺序,则它是完全绑定的,因为它是一种信息理论上耐碰撞的单向函数。 (由于消息空间和目标空间的大小相同,所以这次单个功能实际上可以真正防止碰撞!)