메시지에 추가하여 CRC 코드를 일치시킵니다
-
11-12-2019 - |
문제
이진 문자열 (아래의 16 진수)이고 CRC-16-CCITT를 사용하고 있습니다.나는 모든 CRC가 0x1D0F로 설정된 값으로 나올 것을 원합니다.CRC가 원래 메시지의 끝까지 2 바이트 끝에 추가 하여이 값을이 값과 일치시킬 수있는 것이 가능합니다.
전.
0x01 0000 0000 0000 0000 0000 0000 0000 0000 0000
첨부 된 값은 0x13D8 입니다.
이 13D8을 메시지에 추가하여 CRC가 원하는 0x1D0F를 제공합니다.
이 0x13D8 값을 계산하는 방법에 대한 도움말은 크게 감사 할 수 있습니다.
코드가 보너스가 될 수있는 코드에서 깔끔하게 수행 할 수 있습니다!
해결책
이론은 매우 간단하지만, 물론 올바르게 구현하기 위해 조심스럽게 조심스럽게 생각합니다.
메시지의 어느 곳에서나 16 비트를 선택할 수 있습니다 (마지막에 두 바이트 또는 원하는 곳에서 흩어져있는 16 개 개별 비트 포함). I= 0..15 에 대해 XI 을 호출하십시오. 그런 다음 비트 바이 비트 CRC 알고리즘을 사용하여 메시지를 처리하지만 CRC의 16 비트를 나타내는 XI 에서 16 선형 방정식의 계수를 생성하고 업데이트합니다.
당신은 간단한 매트릭스 방정식 ax + b= c 을 가지고 있습니다. ax + b= c 에 대한 동작은 일반적인 곱셈 및 첨가가 아니라 오히려 단일 비트 및 및 exclusive-or 작업이다. < / P>
이제는 일반적인 방법을 사용하여 및 및 xor 에서 실제로 쉬운 매트릭스 을 반전시킵니다 (추가 및 빼기 똑같은 것, 단지 독점적으로 또는), b ^ c 을 계산하고 그것을 반전으로 곱합니다. 이제 원하는 CRC를 가져 오기 위해 XI 비트에 넣을 값이 있습니다.
추가 단순화는 실제 메시지가 필요하지 않으며 xi 의 길이와 위치 만 있지 않고 메시지의 다른 모든 비트로 0으로 설정된 모든 비트를 모두 수행하는 것입니다. ...에 이는 동일한 길이의 p 및 q 의 두 개의 메시지를 가면 CRC (P) ^ CRC (q)= CRC (p ^ q) . (이것은 CRC의 사전 및 사후 처리를 무시하고 핵심 CRC 알고리즘에 적용됩니다.)
업데이트 :
spoof.c 가 특정 CRC를 생성하는 메시지 수정 문제를 해결할 수 있습니다. .