【问题标题】:What methods can I use to analyse and guess 4-bit checksum algorithm?我可以使用哪些方法来分析和猜测 4 位校验和算法?
【发布时间】: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 可能是一个非常好的开始!

标签: algorithm checksum


【解决方案1】:

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

要检查是否是这种情况,我建议您将一些简单的值输入系统以获得答案:

1000000 = ?
0100000 = ?
0010000 = ?

... 等等。如果有基于位置的简单权重,这可能会揭示它。即使算法有所不同,输入漂亮、简单的值并寻找模式可能会很有启发性。正如 Matti 所建议的,您/我们可能需要在解码模式之前查看更多样本。

【讨论】:

  • 是的,这看起来比我的建议更好!我今天可能没有机会将任何新数字输入系统,但我明天会试一试。谢谢。
猜你喜欢
  • 1970-01-01
  • 2010-09-22
  • 1970-01-01
  • 2010-11-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多