[背景故事]
我正在使用一个五年历史的用户识别系统,尝试将ID添加到数据库中。我的问题是读取ID号码的系统需要某种校验和,但现在没有人知道它是如何工作的。
我可以访问已有正确校验和的现有ID列表。由于校验和只有16个可能的值,所以我可以创建任何我想要的ID,并将其通过认证系统最多运行16次,直到获得正确的校验和(但这非常耗时)。
[问题]
我可以采用哪些方法来帮助猜测用于某些数据的校验和算法?我已经尝试了一些简单的方法,例如异或和求和,但这些方法都没有起作用。
因此,我的问题是:如果我有像这样的十六进制数据:
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
[答案]
我现在已经下载了一个更大的数据列表,结果比我预期的要简单,但为了完整起见,这是我所做的。
数据:
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模16:
( (Σxi) +0xA )mod16
并且这对于我所有的值都是匹配的。为了检查我的数据中从未更改的前3位没有任何问题,我按照Eric的建议编造并测试了一些数字,这些数字也适用于这种方法!