【发布时间】:2017-04-15 04:35:58
【问题描述】:
我有一个字符串anna,其中字符串中的字符值是a = 1, n = 14 ( You can compute the value of other chars like ( char - 96 ),哈希函数看起来像:
int hashCode( string s ) // s = "anna";
{
k = 0;
for ( int i = 0; i < s.length(); i++ )
k = ( 7 * k + 3 * s[i] ) % 61;
return k;
}
如何找到发生碰撞的长度为 3 的字符串(一些聪明的东西)?我想到的唯一方法是计算anna 中的k,即29,然后以某种方式想到另一个长度为3 的字符串,它给出29。
【问题讨论】:
-
恐怕你必须暴力破解它,是的。
-
我看到 61 是素数,而你正在被它调制。欢迎来到the Discrete Logarithm Problem 的世界。
-
@Jean-FrançoisFabre:我不太确定,编写一个好的单向加密哈希函数很难是有原因的。也就是说,我不是加密或数学专家,所以我不能直接说你如何正确地反转它,但是当你谈论长度为三个小写字母的字符串时,你不需要放聪明点;搜索空间只有
26 ** 3 == 17,576个字符串,所以用尽它们是微不足道的。 -
@ShadowRanger 我同意。但这仍然是蛮力。只是你不需要那么大的力量 :) 让我们最多输入 8 个字母会有所不同。
-
@ShadowRanger,哦,是的,这与 Jean-FrançoisFabre 的评论基本场景相同:对于这个给定的场景,通过蛮力找到碰撞并不是一件难事,也不需要很多空间。然而,这是离散对数问题的一个例子,也许 OP(也许是未来的读者)可以从了解离散对数问题以及它如何使单向函数难以逆转的知识中受益。显然,对于这个给定的场景,暴力破解甚至生成彩虹表不会太困难或太昂贵(处理/存储方面)。
标签: c++ algorithm hash hash-collision string-hashing