Hash 加密哈希函数的属性

Hash 加密哈希函数的属性,hash,cryptography,blockchain,Hash,Cryptography,Blockchain,在比特币coursera课程的第1周讲座中,讨论了加密哈希函数的3个属性: 抗冲突性:如果无法找到两个值x和y,例如x!=y,但H(x)=H(y) 隐藏:如果:从具有高熵的概率分布中选择秘密值r,则给定H(r‖x),则不可能找到x,则哈希函数H是隐藏的表示两个字符串的串联 益智友好。如果对于每个可能的n位输出值y,如果从具有高熵的分布中选择k,则不可能找到x,使得H(k‖x)=y在时间上显著小于2^n,则称散列函数H为益智函数 益智友好似乎是对隐藏的更详细描述。两者之间是否存在显著差异?是否存在

在比特币coursera课程的第1周讲座中,讨论了加密哈希函数的3个属性:

抗冲突性:如果无法找到两个值x和y,例如x!=y,但H(x)=H(y)

隐藏:如果:从具有高熵的概率分布中选择秘密值r,则给定H(r‖x),则不可能找到x,则哈希函数H是隐藏的表示两个字符串的串联

益智友好。如果对于每个可能的n位输出值y,如果从具有高熵的分布中选择k,则不可能找到x,使得H(k‖x)=y在时间上显著小于2^n,则称散列函数H为益智函数


益智友好似乎是对隐藏的更详细描述。两者之间是否存在显著差异?是否存在具有其中一个属性但不同时具有这两个属性的哈希函数?

考虑此算法:取任意文本文件,假设a=1、b=2、c=3等等,然后计算所有字母的总和,如果净总和小于5,则您将获得奖励。假设您第一次没有赢,那么您可以在这个文件的末尾(nonce)添加一些任意文本,然后再次进行计算,直到赢为止


这个算法对拼图很友好,但不擅长隐藏,因为你可以很容易地猜出nonce对输出有什么影响。

我也有同样的想法,差别确实很小。我不得不考虑一下

假设你有一个杂烩,坏杂烩。选择x'和一个随机的nonce r',计算y'=BadHash(r'| x'),然后给我y'。事实证明,如果x'是UTF8编码的英文文本,我可以告诉你x'是什么,而且(虽然不是严格必要的),我甚至可以告诉你r'。如果x'恰好是一个随机位字符串,我就不走运了。但不管怎样,这显然不是一个隐藏的散列

现在的谜题是:我给你一个值Y',和一个随机选择的值R'(比如“11110011…100”),然后让你找到一个x,使得BadHash(R'| x)=Y'。好消息:事实证明Y'=BadHash(00101…0001 | UTF8(“比特币是通货紧缩的”))。因此,由于BadHash是非隐藏的(加号),您可以确定一个R(即00101…0001)和x(即UTF8(“比特币是通货紧缩的”)),这样BadHash(R | x)=Y',但这对您没有帮助,因为拼图指定您需要一个与不同的R一起工作的x,即“11110011…100”。所以你还没有解决这个难题


你会发现,这两个属性是不等价的。至于是否确实存在一个属性的哈希值,而不是另一个属性的哈希值,我不知道。

重新构造定义使我更清楚了一点

碰撞阻力: 给定:x和h(x)

很难找到:y与x不同,因此h(y)=h(x)

躲藏: 给定:h(r | x)

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

很难找到:y使得h(y)=h(r | x)

这与碰撞阻力不同,因为y=r | x与否无关

益智游戏: 给定:z和一个极不可能且随机选择的r

很难找到:x使得h(r | x)=z(但它应该存在)

这与抗碰撞不同,因为即使我们有一个算法来找到碰撞y,解必须从r开始的约束也可能使y不是解

类似地,这与隐藏不同,因为r是解谜友好性解决方案的约束,而不是隐藏属性中的约束,因为在这种情况下y不需要等于r | x。
此外,对于益智游戏的友好性,事先没有人知道x(即使是益智游戏的提出者也不知道)。

这门课程非常混乱,而且写得很差

在隐藏问题中,您试图找到x,知道值H(r | x)(当然知道H)。但是你不知道r!例如,x的集合可以是{0,1},但是您不能决定是0还是1,因为向x添加一个秘密r会混合所有可能的散列

在益智友好问题中,给出了k(或r)!这里的问题是尝试所有可能的x,直到找到一个给出正确散列y的。所以你最终会找到一个,但这需要时间。(定义中有k(或r)的原因令人困惑,它只是意味着我们不能通过颠倒H来作弊)


在隐藏问题中,即使您以前尝试过H的所有可能的r和x。它将不起作用,因为您可以找到r',x',r'',x'',使得H(r'|x')=H(r'|x'')。既然你不知道r的哪个值是正确的,那么就不可能找到x。

假设x是掷硬币的结果,即x是0或1。给定H(x),没有人应该能够找到x,但事实并非如此:给定y=H(x),攻击者可以轻松找到x,因为只有两个可能的散列值。他计算H(0)和H(1),并检查哪一个等于y。完成了

现在,假设在x前面加上一个大的随机键,然后计算H(kx)。如果密钥是机密的,攻击者就无法轻松找到x,因为他必须尝试许多可能的密钥

这实际上是在课程幻灯片上:-),但并没有真正用文字解释。

让我们来:
y=H(x | r)
。 这里的输出是y,输入是r和x

隐藏属性:

给定散列函数(y)的输出,查找输入(x)是不可行的。注意,没有给出r

益智友好属性:


给定散列函数(y)的输出和部分输入(r),很难找到输入(x)。

为了方便拼图:但是如果你知道x是0或1呢?给定r和z,你可以很容易地找到x。您只需尝试这两个选项即可我同意你的观点,在益智游戏友好性的定义中,不清楚k是不是给了解谜者。藏起来也一样