我可以使用哪些方法来分析和猜测4位校验和算法?

时间:2011-05-03 12:21:22

标签: algorithm checksum

[背景故事]

我正在使用一个5岁的用户识别系统,我正在尝试将ID添加到数据库中。我遇到的问题是,读取ID号的系统需要某种校验和,现在没有人在这里工作过,所以没有人知道它是如何工作的。

我可以访问已有正确校验和的现有ID列表。此外,由于校验和只有16个可能的值,我可以创建我想要的任何ID,并通过身份验证系统运行最多16次,直到我得到正确的校验和(但这非常耗时)

[问题]

我可以使用哪些方法来猜测用于某些数据的校​​验和算法? 我尝试了一些简单的方法,如XORing和求和,但这些方法都没有用。

所以我的问题是:如果我有这样的数据(十六进制):

data        checksum
00029921    1
00013481    B
00026001    3
00004541    8

我可以使用哪些方法计算出使用哪种校验和? 即我应该尝试连续数字,如00029921,00029922,00029923,...或00029911,00029921,00029931,...如果我这样做,我应该在更改校验和中查找哪些模式?

同样,比较交换数字会告诉我关于校验和的任何有用信息吗? 即00013481和00031481

还有什么可以告诉我一些有用的东西吗?反转一位,或者一个十六进制数字怎么样?

我假设这将是一个常见的校验和算法,但我不知道从哪里开始测试它。 我已阅读以下链接,但我不确定是否可以将此任何一项应用于我的案例,因为我认为我的不是CRC。

stackoverflow.com/questions/149617/how-could-i-guess-a-checksum-algorithm stackoverflow.com/questions/2896753/find-the-algorithm-that-generates-the-checksum cosc.canterbury.ac.nz/greg.ewing/essays/CRC-Reverse-Engineering.html

[ANSWER]

我现在已经下载了一个更大的数据列表,结果比我预期的要简单,但为了完整性,这就是我所做的。

数据:

  

00024901 A
  00024911 B
  00024921 C
  00024931 D
  00042811 A
  00042871 0
  00042881 1
  00042891 2
  00042901 A
  00042921 C
  00042961 0
  00042971 1
  00042981 2
  00043021 4
  00043031 5
  00043041 6
  00043051 7
  00043061 8
  00043071 9
  00043081 A
  00043101 3
  00043111 4
  00043121 5
  00043141 7
  00043151 8
  00043161 9
  00043171 A
  00044291 E

从这些中我可以看到,当一个值增加了一个值时,校验和也增加了与以下相同的值:

  

00024901 A
  00024911 B

此外,交换的两位数字并未更改校验和:

  

00024901 A
  00042901 A

这意味着多项式值(至少这两个位置)必须相同

最后,00000000的校验和是A,所以我计算了数字之和加上A mod 16:
((Σx i )+ 0xA)mod16
这与我拥有的所有价值相匹配。只是为了检查我的数据中从未改变过的前三个数字没有任何偷偷摸摸的事情,我编写并测试了一些数字,正如Eric建议的那样,那些也都适用于此!

1 个答案:

答案 0 :(得分:8)

我见过的许多校验和都使用基于数字位置的简单加权值。例如,如果权重是3,5,7,则校验和可能是3 * c [0] + 5 * c [1] + 7 * c [2],然后是结果的mod 10。 (在你的情况下,mod 16,因为你有4位校验和)

为了检查是否可能出现这种情况,我建议您将一些简单的值提供给系统以获得答案:

1000000 = ?
0100000 = ?
0010000 = ?

......等如果根据位置有简单的权重,这可能会揭示它。即使算法不同,提供漂亮,简单的值并寻找模式也许是有启发性的。正如Matti建议的那样,在解码模式之前,您/我们可能需要查看更多样本。