【发布时间】:2011-05-03 12:21:22
【问题描述】:
[背景故事]
我正在使用一个已有 5 年历史的用户识别系统,并且我正在尝试将 ID 添加到数据库中。我遇到的问题是读取 ID 号的系统需要某种校验和,而现在在这里工作的人都没有使用过它,所以没有人知道它是如何工作的。
我可以访问现有 ID 的列表,这些 ID 已经具有正确的校验和。另外,由于校验和只有 16 个可能的值,我可以创建任何我想要的 ID,并通过身份验证系统运行它多达 16 次,直到我得到正确的校验和(但这很耗时)
[问题]
我可以使用哪些方法来帮助猜测用于某些数据的校验和算法? 我尝试了一些简单的方法,例如 XORing 和 summing,但这些方法都不起作用。
所以我的问题是:如果我有这样的数据(十六进制):
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 一个
这意味着多项式值(至少对于这两个位置)必须相同
最后,00000000 的校验和是 A,所以我计算了数字总和加上 A mod 16:
( (Σxi) +0xA )mod16
这与我拥有的所有价值观相匹配。只是为了检查我的数据中从未改变的前 3 位数字是否存在偷偷摸摸的情况,我按照 Eric 的建议编造并测试了一些数字,这些数字也都适用!
【问题讨论】:
-
您能否发布更多数据,例如一些带有校验和的序列号?
-
00000000 的校验和是多少?
-
Matti- 是的,我稍后会从数据库中获取更多(顺序)数字。 James - 如果可以的话,我会尽量避免编造大量数字,因为获取校验和需要一段时间,但 00000000 可能是一个非常好的开始!