1

我想找到一些 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?

4

1 回答 1

3

您需要提供多个序列和关联的 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。当您尝试使用-swith 时-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);
}
于 2012-09-16T20:33:53.600 回答