2016-11-07 73 views
1

我有一個串行通信協議,並且在查找已使用的校驗和算法時遇到了一些麻煩。我已經嘗試了幾個CRC16 algorithms,他們都沒有工作。找出使用了哪種CRC16算法

消息看起來像這樣(在十六進制):

55 13 04 03 09 f1 01 00 00 06 50 08 00 02 00 00 00 cc 1a 
55 13 04 03 09 f1 01 00 00 06 50 00 00 02 00 00 00 94 3b 
55 13 04 03 09 f1 02 00 00 06 50 08 00 02 00 00 00 7f e4 
55 13 04 03 09 f1 02 00 00 06 50 00 00 02 00 00 00 27 c5 
55 13 04 03 09 f1 03 00 00 06 50 08 00 02 00 00 00 ee b1 
55 13 04 03 09 f1 03 00 00 06 50 00 00 02 00 00 00 b6 90 

我知道起始字節是0x55和第二字節是消息長度

如果有必要,我可以提供更多的數據。任何幫助或提示,將不勝感激;)

最好的問候,阿米爾

+0

這對於[security.SE]來說是個好問題嗎? – Cullub

回答

0

這取決於CRC計算在什麼字節。

您可以使用RevEng嘗試從示例中提取CRC參數。從您的示例中可以明顯看出,這是一個16位的CRC,其多項式爲0x1021,並且反映了CRC(多項式在應用於輸入時位反轉,CRC寄存器向右移位,而不是左移) 。然而,初始值和最終的異或 - 取決於CRC計算的字節。爲了真正地指出這些,你還需要不同長度的示例消息。

RevEng catalog of 16-bit CRCs有幾個標準的CRC,它可能是:

width=16 poly=0x1021 init=0xffff refin=true refout=true xorout=0x0000 check=0x6f91 name="CRC-16/MCRF4XX" 
width=16 poly=0x1021 init=0xb2aa refin=true refout=true xorout=0x0000 check=0x63d0 name="CRC-16/RIELLO" 
width=16 poly=0x1021 init=0x89ec refin=true refout=true xorout=0x0000 check=0x26b1 name="CRC-16/TMS37157" 
width=16 poly=0x1021 init=0xc6c6 refin=true refout=true xorout=0x0000 check=0xbf05 name="CRC-A" 
width=16 poly=0x1021 init=0x0000 refin=true refout=true xorout=0x0000 check=0x2189 name="KERMIT" 
width=16 poly=0x1021 init=0xffff refin=true refout=true xorout=0xffff check=0x906e name="X-25" 

我沒有得到任何的假設整個事情的是消息,也不如果我把第一個或兩個字節。

該列表中最常見的CRC是KERMIT(也稱爲CCITT CRC-16)和X-25。