【问题标题】:Guessing CRC-24 parameters猜测 CRC-24 参数
【发布时间】:2012-09-16 18:21:34
【问题描述】:

我想查找一些 CRC-24 算法的参数。

我只知道:


来源 1

  • 生成多项式为 1010111010110110111001011 = 0x15D6DCB,即

    5D6DCB
    

    在正常表示中(MSB 优先代码)

  • 数据(十六进制)

    00 40 00 01 09 01 01 B0 A0 0C 0A 01 00 04 07 A0 05 A5 03 80 01 02 00 00 00 00 00 00 00 00 00
    

    给予

    99 84 62
    

生成器多项式与CRC-24/FLEXRAY 中使用的相同,但都是关于查找其他参数的。我使用灵活的jacksum 工具做了一些测试,但到目前为止没有成功。

BYTES="00 40 00 01 09 01 01 B0 A0 0C 0A 01 00 04 07 A0 05 A5 03 80 01 02 00 00 00 00 00 00 00 00 00"
jacksum -s '\t' -a 'crc:24,5D6DCB,000000,fals,fals,000000+crc:24,5D6DCB,000000,true,true,000000+crc:24,5D6DCB,abcdef,fals,fals,000000+crc:24,5D6DCB,abcdef,true,true,000000+crc:24,5D6DCB,fedcba,fals,fals,000000+crc:24,5D6DCB,fedcba,true,true,000000+crc:24,5D6DCB,ffffff,fals,fals,ffffff+crc:24,5D6DCB,ffffff,true,true,ffffff' -F '#FILESIZE #ALGONAME{i}#SEPARATOR#CHECKSUM{i}' -E hex -q "hex:$(echo $BYTES | sed 's/ //g')"

31 crc:24,5d6dcb,000000,fals,fals,000000    6579ac
31 crc:24,5d6dcb,000000,true,true,000000    b17f3a
31 crc:24,5d6dcb,abcdef,fals,fals,000000    fd794d  # CRC-24/FLEXRAY-B
31 crc:24,5d6dcb,abcdef,true,true,000000    367f23
31 crc:24,5d6dcb,fedcba,fals,fals,000000    e8a75b  # CRC-24/FLEXRAY-A
31 crc:24,5d6dcb,fedcba,true,true,000000    5e048b
31 crc:24,5d6dcb,ffffff,fals,fals,ffffff    a408f7
31 crc:24,5d6dcb,ffffff,true,true,ffffff    6bf1b9

以防万一我也尝试了反转字节顺序和反转输入数据的半字节顺序,但那里没有 99 84 6262 84 99

我认为是refIn=false refOut=false xorOut=0,但不确定。


来源 2

DATA + CRC(十六进制) - 每行一个条目:

00C01FFF057EA013CEFFCD1361D5E6E6001D64001400002C667E0000000000329BEA
00FFEC01007EA018CDCE2313BB18E6E7001E0149534B050000000100B3017E38CD0F
00C01FFF1B7EA021CEFFCD133817E6E6001CFEFEFEFEFEFEFEFE0149534B050000000100100CE67E00000000000000000000000000000000000000000000000000000054F223
00C01010107EA0080223C993E4437E000000000000000000000000000000003F96F1
00010C011D7EA01FC9022373B49681801205017E06017E0704000000010804000000015F757E0000000000000000000000000000000000000000000000000000000000723D01
00C010101B7EA0450223C9102148E6E6006036A1090607608574050801018A0207808B0760857405080201AC0A80083132333435363738BE10040E01000000065F1F0400007E1FFFFF83D77E0000000000000000000000000000000000000000000000000000009BFF67
00010C01037EA039C902233022BDE6E700612AA109060760857405080101A203020100A305A103020100BE11040F080100065F1F0400007C1F04000007194A7E00000010E99A
00C01010227EA01A0223C932AF55E6E600C0014000080000010000FF0200EADD7E00000000000000000000000000000000000000000000000000000000000000000000C22B4A
00010C011D7EA01FC90223523FA6E6E700C4014000090C07D201070101231A00FFC40080EC7E0000000000000000000000000000000000000000000000000000000000C162A6
00010C011D7EA01FC9022373B49681801205017E06017E0704000000010804000000015F757E0000000000000000000000000000000000000000000000000000000000723D01

运行reveng -w 24 -F -s ... 会得到no models found。这是否意味着上述某些示例可能已损坏?不幸的是,我不能 100% 确定它们都是正确的......


是否有任何理智的方法可以在不使用蛮力的情况下找到 init、refIn、refOut 和 xorOut?

【问题讨论】:

  • 你怎么知道 CRC 结束了哪些字节?
  • 仅供参考,您的 Source 2 中的第五行和第十行是相同的。
  • @Mark 我根据来源 1 的描述知道。在这两个集合中,我给出的数据(据称)完全被 CRC 覆盖。不幸的是,它不是公开的文档。
  • 描述结果不正确,或者被误解了。 crc 之前的最后三个字节不是 crc 计算的一部分。

标签: checksum crc


【解决方案1】:

您需要提供多个序列和相关的 crc 才能求解参数。请提供由两对组成的四个序列,其中每一对是相同长度的序列,并且两对具有不同的长度。

看看CRC RevEng。只需一个序列并指定多项式,它就会报告两种可能性:

width=24  poly=0x5d6dcb  init=0xe959e3  refin=false  refout=false  xorout=0x000000  check=0x13fe57  name=(none)
width=24  poly=0x5d6dcb  init=0x005035  refin=true  refout=true  xorout=0x000000  check=0x63b7b9  name=(none)

但是,仅通过一个示例无法区分或验证它们。

更新:

我找到了 crc。原来crc之前的最后三个字节不参与crc计算。然后,所提供的多项式将不反映在数据上,无需进行预处理或后处理。但是生成的 crc 需要反映,然后以大端顺序写入。

您可以使用 RevEng 来生成 crc。例如,对于您发布的第一个示例(删除了最后三个字节):

$ reveng -c -w 24 -L -p 5d6dcb 00400001090101B0A00C0A01000407A005A503800102000000000000
628499

reveng 以小端顺序提供答案。在您的数据中,它采用大端顺序:99 84 62。

这适用于除以00 FF 开头的示例之外的所有示例。这也是异常的,倒数第二个字节不是零,在所有其他情况下它们都是零。

遗憾的是,RevEng 无法推断出这个特定的 crc,因为它是 RevEng 不会搜索的一个奇怪的 crc。当您尝试将-s-L 一起使用时,您会得到:

reveng: cannot search for crossed-endian models

这是生成 crc 的代码。请注意,crc 前的最后三个字节不提供给crc24()crc24() 的结果必须以大端顺序写入或比较。

unsigned long reflect(unsigned long val, int bits)
{
    unsigned long vers;

    vers = 0;
    while (bits) {
        vers = (vers << 1) | (val & 1);
        val >>= 1;
        bits--;
    }
    return vers;
}

#define POLY 0x5d6dcb
#define CARRY 0x800000

unsigned long crc24(unsigned long crc, unsigned char *buf, unsigned len)
{
    crc = reflect(crc, 24);
    while (len--) {
        crc ^= (unsigned long)(*buf++) << 16;
        crc = crc & CARRY ? (crc << 1) ^ POLY : crc << 1;
        crc = crc & CARRY ? (crc << 1) ^ POLY : crc << 1;
        crc = crc & CARRY ? (crc << 1) ^ POLY : crc << 1;
        crc = crc & CARRY ? (crc << 1) ^ POLY : crc << 1;
        crc = crc & CARRY ? (crc << 1) ^ POLY : crc << 1;
        crc = crc & CARRY ? (crc << 1) ^ POLY : crc << 1;
        crc = crc & CARRY ? (crc << 1) ^ POLY : crc << 1;
        crc = crc & CARRY ? (crc << 1) ^ POLY : crc << 1;
    }
    return reflect(crc, 24);
}

【讨论】:

  • 谢谢你,马克,这个提示!我在 RevEng 目录页面上,但不知何故错过了工具本身。不幸的是,它可能都不是找到的参数集。已知状态来自一个来源,我不确定它有多可靠。我得到了另一组reveng 无法处理的集合(将在一分钟内更新问题)(输出:no models found)。
  • 我已经为问题添加了新的集合。
  • 马克,感谢您的努力和精心的更新!看起来很有希望。稍后我会评估它。
  • 抱歉,马克,迟到了。那时我验证了你的例程正在工作,但只有在长 MAC 帧末尾有 0 时(正如你已经注意到的那样)。我希望将来我会再次解决这个问题,并找到在没有 Pad 字段时应该如何计算 FCS 字段(帧校验序列)(确保帧大小与 36 字节对齐),但是还有其他更重要的事情在起作用而不是摆弄这个CRC算法。我不再在老地方工作,所以我无法访问描述它的 IEC 61334-5-1 文档以及我从中获得示例的其他一些文档。
  • @Mark Adler:RevEng 也使用蛮力方法,这是正确的吗?或者在尝试所有模型参数组合之前,它是否会采取任何特殊技巧来减少搜索空间?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-08
  • 2015-08-11
  • 1970-01-01
  • 1970-01-01
  • 2016-02-01
  • 2020-08-24
相关资源
最近更新 更多