1

バイナリ文字列 (以下に 16 進数で表示) があり、CRC-16-CCITT を使用しています。すべての CRC が設定値 0x1D0F になるようにします。元のメッセージの末尾に 2 バイトを追加することで、CRC をこの値と一致させることができることはわかっていますが、追加する必要がある値を見つける方法がわかりません。

元。

0x01 0000 0000 0000 0000 0000 0000 0000 0000 13D8

追加された値は 0x13D8 です

この 13D8 をメッセージに追加することで、CRC は目的の 0x1D0F を提供します。

この 0x13D8 値を計算する方法についての助けをいただければ幸いです。

コードできちんと実行できれば、それはおまけです!

4

1 に答える 1

3

理論は非常に単純ですが、もちろん、正しく実装するには注意が必要です。

メッセージ内の任意の 16 ビット (末尾の 2 バイトまたは任意の場所に散在する 16 ビットを含む) を未定義にすることができます。i = 0..15の場合はxiと呼びます。次に、ビットごとの CRC アルゴリズムを使用してメッセージを処理しますが、16 ビットの crc を表すxiの 16 の線形方程式の係数を生成および更新します。

次に、単純な行列方程式Ax + b = cが得られます。Ax + b = cの演算は、通常の乗算​​と加算ではなく、単一ビットandおよび排他的論理和演算です。

ここで、通常の方法を使用して行列Aを反転します。これは実際にはandxorを使用すると簡単です(加算と減算はどちらも同じで、排他的論理和だけです)、b ^ cを計算し、それを逆数で乗算します。これで、目的の crc を取得するためにxiビットに入れる値が得られました。

さらに単純化すると、実際のメッセージは必要なく、xiの長さと場所だけが必要になり、メッセージの他のすべてのビットをゼロに設定して上記を実行します。これは、同じ長さの2 つのメッセージPQがある場合、 crc(P) ^ crc(Q) = crc(P ^ Q)となるためです。(これはコアの crc アルゴリズムに適用され、crc の前処理と後処理は無視されます。)

アップデート:

特定の CRC を生成するためにメッセージを変更する問題を解決するspoof.cをダウンロードできます。

于 2012-07-25T16:13:09.783 に答える