我正在尝试对我的福特嘉年华 2014 的密钥卡进行逆向工程,但我一直在寻找使用的校验和算法。我已经成功地解调了遥控钥匙信号(使用开关键控 + 曼彻斯特编码)并识别出不同类型的字节(见下文)。
|---b1---|---b2---|---b3---|---b4---|---b5---|---b6---|---b7---|---b8---|---b9---|---b10--|
|preamble|-------------------------rolling code-------------------------|counter*|checksum|
|01010101|10110100|01010110|11101111|00011011|11011001|10100011|11111001|01100111|01111000|
*counter: this byte is also used for the commando, the last 4 bits are different for OPEN,
CLOSE, TRUNK while the first 4 bits is a counter.
由于所有数据包的前导码都相同,因此我假设它不用于计算校验和。我很确定它不是 CRC,因为我尝试通过 bruteforcing(+bruteforcing 最终 XOR)找到 CRC 多项式,但没有找到匹配的模型(使用https://github.com/nitram2342/bruteforce-crc)。
我尝试了其他一些标准校验和方法(XOR、2s 补码、模 256,...)但没有成功。我已经阅读了其他有关查找校验和算法的 stackexchange 帖子,但无法将它们应用于我的数据包。我被这个问题困扰了几天,似乎我没有取得任何进展。
这 3 个数据包可能会有所帮助,因为它们仅在第 7 个字节 (b7) 的前 3 位和计数器 (b9) 的前 4 位有所不同。
|---b1---|---b2---|---b3---|---b4---|---b5---|---b6---|---b7---|---b8---|---b9---|---b10--|
|preamble|-------------------------rolling code-------------------------|counter-|checksum|
|01010101|10110100|01010110|11101111|00011011|11011001|10100011|11111001|01100111|01111000|
|01010101|10110100|01010110|11101111|00011011|11011001|10100010|11111001|01101000|01001110|
|01010101|10110100|01010110|11101111|00011011|11011001|10100111|11111001|01101011|01001101|
这里还有一些数据包:
|preamble|-------------------------rolling code-------------------------|counter-|checksum|
|01010101|10110100|01010110|11101111|00011011|11011001|10100011|11111001|01100111|01111000|
|01010101|10110100|01010110|11101111|00011011|11011001|10100010|11111001|01101000|01001110|
|01010101|00010111|11110101|01001100|10111000|01111010|01011010|10100001|01101001|10100000|
|01010101|00010110|11110100|01001101|10111001|01111011|01011011|10100000|01101010|10100101|
|01010101|10110100|01010110|11101111|00011011|11011001|10100111|11111001|01101011|01001101|
|01010101|00010001|11110011|01001010|10111110|01001100|01011100|00001000|10110100|01010011|
|01010101|00011001|11111011|01000010|10110110|01000100|00001001|01010100|10110101|00011000|
|01010101|10011001|01111011|11000010|00110110|11000100|11011100|11010100|11100000|00100001|
|01010101|01000100|10100110|00011111|11101011|00011001|00001001|11010101|11100001|01001110|
|01010101|01000101|10100111|00011110|11101010|00011000|00001000|11011110|11100010|11110110|
|01010101|01010100|10110110|00001111|11111011|01011001|00011001|11001101|00100001|10111101|
|01010101|01010101|10110111|00001110|11111010|01011000|00011000|11001110|00100010|00000101|
|01010101|10011011|01111001|11000000|00110100|10010110|11001111|11010110|00100011|11011011|
|01010101|01010001|10110011|00001010|11111110|01011100|00011100|11001000|00100100|00111001|
|01010101|10011001|01111011|11000010|00110110|10010100|11001001|11010100|00100101|01101111|
*these packets were not all recorded sequentially as you may notice some gaps in the counter.
我是逆向工程和信号处理领域的新手,所以如果我没有使用正确的术语或者我忽略了一些简单的事情,请见谅。ps请不要偷我的车:)
编辑 1
我发现校验和相同的这些数据包可能会有所帮助:
|preamble|-------------------------rolling code-------------------------|counter-|checksum|
|01010101|10110100|01010110|11101111|00011011|11011001|10100010|11111001|01101000|01001110|
|01010101|01000100|10100110|00011111|11101011|00011001|00001001|11010101|11100001|01001110|
|01010101|01010001|10110011|00001010|11111110|01011100|00011100|11000010|00101110|10111101|
|01010101|01010000|10110010|00001011|11111111|00111101|00011101|11000011|00001111|10111101|