找到算法来计算特定输入的特定输出

时间:2013-02-10 22:32:16

标签: algorithm bit-manipulation

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

看起来像这样:

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

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

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

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

提前致谢!

更新:由于我的问题有些不清楚:我真的需要找到一个用于首先从UID创建哈希的算法 - 或者至少有一个行为所有可能的UID(即4字节数)的方式相同。由于有人指出存在无限多个可能的函数,我想我必须找到最简单的函数并针对更多的UID值进行测试。正如我所说,我实际上假设算法很简单,并且没有充满模糊的键。如果我错了,我注定要失败。但如果没有,也许我有机会进行反复试验。

3 个答案:

答案 0 :(得分: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,主要是因为它是一个很好的十六进制值。这些决定的结果是程序将尝试生成一个程序来适应这些选择,这与未知函数的作用完全不同。这意味着你需要以某种方式使这个未知的功能比现在更为人所知,以期望任何相关的结果。

答案 1 :(得分:1)

你应该试着澄清你想要达到的目标。

如果您只希望能够将50个FIXED输入值映射到某些更好的输出值,那么已经建议从输入到输出值创建某种映射表就足够了。

如果另一方面给出了大约50个输入值及其相应的50个输出值,并且希望能够至少从数学角度正确地预测任何其他输入值的相应输出值,那么您的问题无法解决,因为任何固定的输入到输出值映射的数量仍然存在INFINITE数量的函数,这些函数将到目前为止看到的所有输入值映射到目前为止看到的完全相同的输出值,并且仍然计算到目前为止看不到的任何值的另一个结果。

答案 2 :(得分:0)

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