1

いくつかの CRC-24 アルゴリズムのパラメーターを見つけたいです。

私が知っているのは、次のことだけです。


ソース 1

  • 生成多項式は 1010111010110110111001011 = 0x15D6DCB、つまり

    5D6DCB
    

    通常の表現 (MSB ファースト コード)

  • データ (16 進数)

    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 (16 進数) - 1 行に 1 つのエントリ:

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 を提供する必要があります。2 つのペアからなる 4 つのシーケンスを提供してください。各ペアは同じ長さのシーケンスであり、2 つのペアは長さが異なります。

CRC RevEngを見てください。1 つのシーケンスと多項式を指定すると、次の 2 つの可能性がレポートされます。

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)

ただし、それらは 1 つの例だけで区別または検証することはできません。

アップデート:

CRCを見つけました。crc の前の最後の 3 バイトは、crc の計算に関与していないことがわかります。次に、提供された多項式は、前処理または後処理なしでデータに反映されずに使用されます。ただし、結果の crc を反映してから、ビッグ エンディアン順に書き込む必要があります。

RevEng を使用して crc を生成できます。たとえば、投稿した最初の例 (最後の 3 バイトを削除) の場合:

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

reveng はリトルエンディアン順で答えを提供しました。あなたのデータでは、ビッグエンディアン順です: 99 84 62.

これは、 で始まる例を除くすべての例で機能し00 FFます。これは、最後から 2 番目の 3 バイトがゼロではないという点でも異常であり、他のすべての場合はゼロです。

残念ながら、この特定の crc は、RevEng が検索しない奇妙なものであるため、RevEng によって推測することはできません。で使用しようとする-s-L、次のようになります。

reveng: cannot search for crossed-endian models

以下は、crc を生成するコードです。crc の前の最後の 3 バイトは に提供されないことに注意してください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 に答える