Crc

CRC-16-IBM,反向 0xA001,小端 (DCBA) 實現

  • July 16, 2018

背景

我需要在 Node.js 中實現這個算法,但是在到處搜尋之後我找不到實現。

程式碼

我的第一種方法由 StackOverflow 的一名成員審查並被認為是正確的:

但是,它不適用於測試向量。所以在這一點上,我假設我錯過或錯過了一些解釋,並且我實施了錯誤的算法。

問題

  1. 在哪裡可以找到 CRC-16-IBM、Reversed 0xA001、Little Endian (DCBA) 的實現?
  2. 有沒有辦法知道給定 N 個測試向量正在使用哪種算法來創建 CRC?

PS:如果是Javascript,完美,如果不是,我可以轉換它。


測試訊息:

00000000000000C1080500000164880D438001014CC5F918ACC14200000000000000F00301F00002B60000430E8B000000000164880C68C000014CC5F918ACC14200000000000000000301F00102B60000430E97000000000164880CA35800014CC5F918ACC14200000000000000000301F00102B60000430E99000000000164880CDDF000014CC5F918ACC14200000000000000000301F00102B60000430E99000000000164880D188800014CC5F918ACC14200000000000000000301F00102B60000430E98000005 00008DC5

此消息的 CRC:

00008DC5

CRC-16 多項式0xCD83將生成數據的字節交換校驗和。它在以下 C++ 常式中實現:

uint16_t crc16(uint16_t state, uint8_t byte) {
 uint16_t mask;
 uint16_t crc = state ^ uint16_t(byte);
 for (int j = 7; j >= 0; j--) {
   mask = -(crc & uint16_t(1));
   crc = (crc >> 1) ^ (mask & uint16_t(0xCD83));
 }
 return crc;
}

如果您初始化state=0並將此常式提供給您的測試向量

state = crc(state, data[i]);

然後在處理之後state將等於0xC58D您想要的字節交換校驗和。

沒有 16 位多項式會產生具有其他字節順序 ( 0x8DC5) 的校驗和。

引用自:https://crypto.stackexchange.com/questions/60841