位操作-找到从特定输入计算特定输出的算法



这个问题更多的是数学方面的问题。我已经给出了一个以十六进制表示的4字节UID列表和一个相应的2字节代码列表——让我们称之为散列。

它看起来像这样:

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

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

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

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

提前感谢!

更新:由于我的问题有些不明确:我真的需要找到一个最初用于从UID创建哈希的算法,或者至少找到一个对所有可能的UID都表现相同的算法(即4字节数)。既然有人指出有无限多的可能函数,我想我必须找到最简单的函数,并根据更多的UID值对它们进行测试。正如我所说,我实际上假设算法很简单,并且没有充满模糊的键。如果我错了,我就注定要失败,正如你所指出的。但如果没有,也许我还有一个试错的机会。

正如其他人所评论/回答的那样,您有一个不适定问题,并且未知函数的已知信息非常少(好吧,它毕竟是未知的:)。虽然你可以尝试通过遗传编程来猜测一个函数,但你不能指望它真的代表未知函数——而不是只有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,主要是因为它是一个不错的十六进制值。这些决定的结果是,程序将试图生成一个程序来适应这些选择,这与未知函数的作用相比可能是完全不正确的。这意味着你需要以某种方式使这个未知函数比现在更为人所知,以便期待任何相关的结果。

您应该努力澄清自己想要实现的目标。

如果您只想将50个固定输入值映射到50个固定输出值中的某个值,那么创建某种从输入到输出值的映射表就足够了。

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

这是一个不可能的任务,除非你能找到更多信息,或者汇编所有可能的输入和输出的映射,这样你就可以进行详尽的实验。

最新更新