Frage

Ich habe eine binäre Zeichenfolge (in Hex unten gezeigt) und verwende CRC-16-CCITT.Ich möchte, dass alle meine CRCs auf einen eingestellten Wert kommen, 0x1d0f.Ich weiß, dass es möglich ist, den CRCS diesen Wert zu stimmen, indem ich auf 2 Byte an das Ende der ursprünglichen Nachricht anheppt, aber ich bin mir nicht sicher, wie er herausfindet, wie der angehängte Wert sein muss.

ex.

0x01 0000 0000 0000 0000 0000 0000 0000 0000 13d8

beigefügter Wert ist der 0x13D8

Durch Hinzufügen dieses 13D8 auf die Nachricht gibt mir das CRC den gewünschten 0x1d0f.

Jede Hilfe zum Berechnen des Wertes 0x13D8 würde erheblich geschätzt werden.

Wenn es ordentlich in Code erfolgen kann, ist ein Bonus!

War es hilfreich?

Lösung

Die Theorie ist ziemlich einfach, aber natürlich sorgt es, dass es richtig ist, richtig umzusetzen.

Sie können alle 16 Bits irgendwo in der Nachricht auswählen (einschließlich zwei Bytes am Ende oder 16 einzelnen einzelnen Bits, die dort, wo auch immer Sie möchten), undefiniert sein. Rufen Sie sie an xi für i= 0..15 . Verwenden Sie dann einen Bit-Bit-CRC-Algorithmus, um die Nachricht zu verarbeiten, sondern die Koeffizienten von 16 linearen Gleichungen in xi zu erstellen und zu aktualisieren, was die 16 Bits des CRC darstellt.

Sie haben dann eine einfache Matrixgleichung ax + b= c . Die Operationen für AX + B= C= C sind nicht die übliche Multiplikation und Addition, sondern eher ein Single-Bit und exclusive- oder -Operationen. < / p>

Jetzt verwenden Sie die üblichen Methoden, um die Matrix a zu invertieren, die eigentlich einfacher mit und und xor ist (Addition und Subtraktion sind jetzt Sowohl das Gleiche, nur exklusiv-oder), berechnen Sie b ^ c und multiplizieren Sie das mit inversen. Jetzt haben Sie die Werte, um in die xi -Bits einzugeben, um den gewünschten CRC zu erhalten.

Eine zusätzliche Vereinfachung ist, dass Sie nicht die eigentliche Nachricht, nur die Länge und den Speicherort des xi benötigen, und dann das obige mit allen anderen Bits der Nachricht auf Null . Dies liegt daran, dass, wenn Sie zwei Nachrichten p und q derselben Länge haben, dann crc (p) ^ crc (q)= CRC (p ^ q) . (Dies gilt für den Kern-CRC-Algorithmus, ignoriert die Vor- und Nachbearbeitung des CRC.)

update:

Sie können spoof.c herunterladen, das das Problem der Änderung einer Nachricht an, um einen bestimmten CRC zu modifizieren, löst .

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top