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

j0k*_*ker 4 algorithm bit-manipulation

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

它看起来像这样:

7D04E214 --> 4A49
7D048DC3 --> A0E7
7D04DB2E --> 4191
...
Run Code Online (Sandbox Code Playgroud)

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

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

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

提前致谢!

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

mmg*_*mgp 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
Run Code Online (Sandbox Code Playgroud)

这给出了以下结果:

Input      Output (guess)   Actual output    Diff
0x7d04e214 0x4a49           0x4a49           0
0x7d048dc3 0xa0e7           0xa0e7           0
0x7d04db2e 0x4191           0x4191           0
Run Code Online (Sandbox Code Playgroud)

因此,生成的程序对于这些输入的总误差为0个单位,因此对于给定的示例,该函数是正确的,但这没有任何意义.经过几次运行,数千代等,生成了一个程序,没有给出示例的错误.现在,这里要注意的直接问题是我假设未知函数将key输入与输入一起使用 - 这可能与否.此外,我只是猜测密钥可能0xbeef主要是因为它是一个很好的十六进制值.这些决定的结果是程序将尝试生成一个程序来适应这些选择,这与未知函数的作用完全不同.这意味着你需要以某种方式使这个未知的功能比现在更为人所知,以期望任何相关的结果.