加密散列函数的属性

properties of a cryptographic hash function

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

抗碰撞:如果无法找到两个值 x 和 y 使得 x != y 且 H(x)= H(y),则称哈希函数 H 是抗碰撞的。

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

解谜友好。如果对于每个可能的 n 位输出值 y ,如果 k 是从具有高熵的分布中选择的,则哈希函数 H 被认为是谜题友好的,那么找到 x 是不可行的 H(k ‖ x) = y时间明显少于 2^n.

Puzzle friendly似乎是对隐藏的更详细的描述。两者之间有什么显着差异吗?是否存在具有 1 个属性但不具有两个属性的哈希函数?

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

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

我也是这么想的,区别确实很微妙。我不得不考虑一下。

假设你有一个散列,BadHash。你选择 x' 和随机数 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("Bitcoin is deflationary"))。所以因为 BadHash 是非隐藏的(加上),你可以确定一个 R(即 00101...0001)和 x(即 UTF8("Bitcoin is deflationary")),这样 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 之间做出决定,因为将秘密 r 添加到 x 会混合所有可能的哈希值。

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

在隐藏问题中,即使你之前为H尝试了所有可能的r和x。它不会起作用,因为您可以找到 r',x',r'',x'' 使得 H(r'|x') =H(r''|x'')。并且由于您不知道 r 的哪个值是正确的,因此不可能找到 x。

**编辑:现在重新阅读定义,我认为函数 H(k|.): x-> H(k|x) 已为各方所知。隐藏 x 意味着你可以用函数 H(k|.) 隐藏 x 如果我给你值 H(k|x) 和函数 H(k|.) 那么你就找不到 x。因此,我给出的无法在 0 和 1 之间进行选择的示例是正确的。您可以“解决难题”(=解决 y=H(k|x))但您无法解决 x。

益智友好意味着如果我给你 H(k|x) 和函数 H(k|.) 那么你找不到一个值 x' 使得 H(k|x)=H(k |x') 没有尝试所有 x.

鉴于区块链中的应用,双方都知道函数 H(k|.) 确实更有意义

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

现在,假设您将一个大的随机密钥添加到 x 并计算 H(k x)。如果密钥是秘密的,攻击者就不能轻易找到 x,因为他必须尝试很多可能的秘密密钥。

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

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

隐藏属性:

给定哈希函数 (y) 的输出,不可行 找到输入 (x)。 注意,r没有给出。

解谜友好 属性:

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