考虑您有一个哈希函数 ,该哈希函数接收长度为字符串并返回长度为字符串,并且具有耐碰撞的好特性,即很难找到具有相同哈希H的两个不同的字符串(s )= H(s ')。
现在,您想构建一个新的哈希函数,该函数采用任意长度的字符串并将它们映射到长度为字符串,同时仍具有抗碰撞性。
幸运的是,在1979年已经发布了一种现在称为Merkle–Damgård构造的方法,可以实现此目的。
这项挑战的任务是实现该算法,因此在逐步执行示例之前,我们将首先对Merkle–Damgård构造进行正式描述,该示例应表明该方法比以下方法更简单。它可能会首先出现。
给定一些整数,如上所述的哈希函数和任意长度的输入字符串,新的哈希函数执行以下操作:
- 设置,的长度和将拆分为长度为的块,必要时用尾随零填充最后一个块。这产生许多块被标记。
- 添加一个前导和尾部块和,其中是由以下组成的串零和是二进制,填充与领先零长度。
- 现在,将迭代地应用于附加到先前结果r i - 1的当前块上:r i = H(r i - 1 c i),其中r 0 = c 0。(查看下面的示例后,此步骤可能会更加清楚。)
- 的输出是最后的结果。
任务
写一个程序或函数,它接受作为输入的正整数,散列函数作为黑盒子和一个非空字符串和返回相同的结果上相同的输入。
这是代码高尔夫球,因此每种语言中最短的答案将获胜。
例
假设,因此我们给定的哈希函数接受长度为10的字符串并返回长度为5的字符串。
- 给定的输入,我们得到以下块:,,和。请注意,需要将填充到长度5并加上一个尾随零。
- 只是五个零的字符串,是二进制()中的五个,并填充有两个前导零。
- 现在将这些块与组合:
- 是我们的输出。
让我们来看看这个输出是什么样子取决于一些选择1对:
- 如果,即仅返回第二个字符,则得到:
因此,如果给定这样的 H作为黑盒功能,则必须输出。 - 如果简单地返回第5个字符的输入的,输出是。同样,如果返回最后5个字符,则输出为。
- 如果乘以其输入的字符代码并返回该数字的前五位数字,例如,则。
1为简单起见,这些实际上不是抗碰撞的,尽管这对于测试提交并不重要。
omgPzzles0
。精心选择的示例输入!