4

这个问题更多是在数学方面。我已经给出了十六进制的 4 字节 UID 列表和相应的 2 字节代码列表 - 我们称它们为哈希。

它看起来像这样:

7D04E214 --> 4A49
7D048DC3 --> A0E7
7D04DB2E --> 4191
...

我有大约 50 个这样的元组,所以我想如果我找到一种算法可以为所有 UID 计算正确的哈希,我可以很确定这是正确的。

这是我的问题:我真的不知道如何开始。我不是数学家,对这类问题没有经验。我怀疑某种按位算法。看起来它可能是 CRC16,但我已经伪造了这一点。我不认为这是任何流行的算法。我也认为(或者更确切地说希望)算法不是太复杂。

我知道找到从某个输入计算某个输出的函数的一般问题是无法确定的。但是假设算法很简单,我有什么可能性?有什么工具可以帮助我吗?对于编写我自己的工具,您有什么建议可以阅读吗?我正在考虑某种蛮力,但我该如何系统地做到这一点?

提前致谢!

更新:由于我的问题有些不明确:我真的需要首先找到一种用于从 UID 创建散列的算法 - 或者至少一个对所有可能的 UID 行为相同的算法(即 4 -字节数)。既然有人指出有无限多的可能函数,我想我必须找到最简单的函数并针对更多的 UID 值测试它们。正如我所说,我实际上假设该算法很简单,并且没有充满晦涩的密钥。如果我错了,正如你所说,我注定要失败。但如果没有,也许我有机会试错。

4

3 回答 3

5

正如其他人所评论/回答的那样,您遇到了一个不适定问题以及未知函数的鲜为人知的信息(好吧,它毕竟是未知的:)。虽然您可以尝试通过遗传编程来猜测一个函数,但您不能期望它实际上代表未知函数——而不是只有 50 个输入->输出。

但是,作为一个虚拟实验,我玩弄了遗传编程,它为您给出的 3 个示例找到了以下程序:

def guess(a, key=0xbeef): # The parameter 'a' is an input value.
    temp = (a % (-14)) << 3
    if temp == 0:
        temp = -4
    temp = ((a ^ (-2 * key)) - temp) >> 2
    res = (temp + a + (a % (-15))) % key
    return res

这给出了以下结果:

Input      Output (guess)   Actual output    Diff
0x7d04e214 0x4a49           0x4a49           0
0x7d048dc3 0xa0e7           0xa0e7           0
0x7d04db2e 0x4191           0x4191           0

因此生成的程序对于这些输入的总误差为 0 个单位,因此该函数对于给定的示例是正确的,但这没有任何意义。它需要几次运行、数千代等,才能生成一个对示例没有错误的程序。现在,这里要注意的最直接的问题是,我假设未知函数将key参数与输入一起使用——这可能是也可能不是。此外,我只是猜测关键可能是0xbeef主要是因为它是一个很好的十六进制值。这些决定的结果是程序将尝试生成一个程序来适应这些选择,这对于未知函数的作用可能是完全不正确的。这意味着您需要以某种方式使这个未知函数比现在更广为人知,以便获得任何相关结果。

于 2013-02-11T03:22:35.260 回答
1

您应该尝试澄清您特别想要实现的目标。

如果您只想将 50 个 FIXED 输入值映射到其他 50 个 FIXED 输出值,正如已经建议的那样,创建某种从输入到输出值的映射表就足够了。

另一方面,如果给定大约 50 个输入值及其相应的 50 个输出值,并且希望能够正确预测任何其他输入值的相应输出值,至少从数学角度来看,您的问题是无法解决的,因为给定任何固定数量的输入对于输出值映射,仍然有无限数量的函数将迄今为止看到的所有输入值映射到迄今为止看到的完全相同的输出值,并且仍然为迄今为止未看到的任何值计算另一个结果。

于 2013-02-10T22:53:24.767 回答
0

这是一个不可能完成的任务,除非您可以找到更多信息或组装所有可能输入及其输出的映射,以便您可以进行详尽的试验。

于 2013-02-10T23:12:56.223 回答