猜猜哈希函数?

时间:2010-01-26 11:50:22

标签: algorithm hash

我想知道采用哪种算法。我强烈认为它很简单,而且很有希望。例如,生成结果没有延迟。

输入:任何字符串
输出:5个十六进制字符(0-F)

我可以访问尽可能多的键和结果,但我不知道我是如何利用它来攻击函数的。有什么方法吗?如果我知道任何转换为​​5个字符的函数都可以开始,那么我可能会对盐或其他东西蛮力。

我知道例如:
A = 06a07
B = bfbb5
C = 63447
(万一你有什么想法)

在正常使用中,它会将随机的32-char字符串转换为5-char字符串。

4 个答案:

答案 0 :(得分:6)

从数据中派生哈希函数的唯一方法是通过蛮力,或许结合一些聪明。有无数个哈希函数,好的哈希函数执行基本上是单向加密的,所以这是一个试错的问题。

您的函数将32个字符的字符串转换为5个字符的哈希值几乎无关紧要;输出可能被截断。为了好玩,这里有一些完全合法的例子,其中最后3个是加密可怕的:

  • 使用MD5散列算法生成16个字符的散列,并使用10 th 到14 th 字符。
  • 使用SHA-1算法并取最后5个字符。
  • 如果输入字符串是字母,请使用简单替换A=1B=2C=3,...并取前5位数字。
  • 查找键盘上的每个字符,测量它与左边缘的距离(以毫米为单位),并以相反的顺序使用所有其他数字,从最后一个开始。
  • 创建名称为32位字符串的stackoverflow用户,将113除以相应的用户ID号,并取小数点后的前5位数。 (但不要告诉他们我告诉你这样做!)

答案 1 :(得分:4)

根据您的需要,如果您可以访问任意数量的键和结果,则可能需要尝试彩虹表方法。 5个十六进制字符仅为1mln组合。您应该能够强制生成一个字符串映射,以便立即匹配所有生成的哈希值。然后你不需要知道原始字符串,只需要通过迭代1mln输入字符串来生成相同的散列或暴力条目的等效字符串。

答案 2 :(得分:3)

继我刚刚向Pontus Gagge发表的评论之后,假设哈希算法如下:

  • 在输入中附加一些长的常量字符串
  • 计算结果的SHA-256哈希值
  • 输出哈希的最后5个字符。

然后我非常确定从你选择的明文攻击中找不到计算可行的方法来弄清楚哈希函数是什么。甚至证明SHA-256正在使用中(假设它是一个很好的哈希函数,据我们目前所知),我认为你需要知道长字符串,它只存储在“黑盒子里面” ”

那就是说,如果我知道任何已发布的20位哈希函数,那么我会先检查它们。但我不知道:所有通常的非加密字符串散列函数都是32位,因为这是整数类型的预期大小。您应该将结果与相同字符串上的CRC,PJW和BUZ哈希的结果进行比较,以及使用不同素数的DJB哈希的一些变体,以及内置于众所周知的编程语言的任何字符串哈希函数,例如{{ 1}}。可能是5个输出字符是从其中一个产生的8个十六进制字符中选择的。

除此之外(以及你能找到的任何其他着名的字符串哈希),我都没有想法。要对黑盒子哈希进行密码分析,首先要查看输入的位和输出的位之间的相关性。这为您提供了线索中可能涉及的功能的线索。但这是一个很大的主题,而不是我熟悉的主题。

答案 3 :(得分:1)

这听起来有些违法。

你的游行或任何东西都不要下雨,但是如果实现者的工作正确,你就不会注意到现代CPU上的滞后时间超过几十毫秒,即使有强大的加密哈希,并且知道算法也不会如果他们正确使用盐,可以帮助你。如果您无法访问代码或二进制文件,那么您唯一的希望就是一个微不足道的错误,无论是技术限制还是重要性。

对于任何给定的输入和输出集合,存在uncountable infinity个潜在(哈希)函数,如果您没有比计算复杂度的上限更好的线索(从您检测到的滞后),你前面有很长的搜索时间......