【问题标题】:Find a collision string with a given hash function查找具有给定哈希函数的冲突字符串
【发布时间】: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


【解决方案1】:

为什么不简单地生成所有长度为 3 的字符串并计算它们的哈希值(事实上,当哈希函数的所有 61 个可能值都达到时,您可以停止)?选项的数量不会太大。

一种可能的优化:如果你需要回答多个查询(比如给定一个字符串,找到一个长度为 3 且哈希函数值相同的字符串),你可以生成所有长度为 3 的字符串并计算一次它们的哈希值建立地图hash -&gt; a string of length 3 with this hash。一旦你有了这张地图,找到一个长度为 3 的字符串,它与给定的哈希值相同,这只是一次地图查找。

【讨论】:

  • 可能想要存储hash -&gt; two strings of length 3 with this hash。您知道,如果存储的第一个字符串是您要为其查找冲突的字符串。 :-)
  • @ShadowRanger 是的,不错。
猜你喜欢
  • 2016-08-02
  • 2018-08-04
  • 2021-12-15
  • 1970-01-01
  • 2019-10-17
  • 1970-01-01
  • 1970-01-01
  • 2012-05-24
  • 1970-01-01
相关资源
最近更新 更多