这种专有网络协议使用了我以前从未见过的奇怪(CRC?)哈希算法。 它从端口计算出来。
通过调查,我得到了以下哈希:
0-85
1-84
85-d0
7770-df
7771-de
7772-c9
7773-d0
7774-db
7775-da
7776-e5
7777-e4
7778-e7
这是在连接数据包的0x03处提交的,并根据端口号而变化。
谢谢,
答案 0 :(得分:1)
对于单字节输入算法:
f x = 0x80 .|. (0xF0 .&. x `shiftL` 4) .|. x `xor` 0x05
或C风格:
#define F(x) (0x80 | (0xF0 & (x << 4)) | (x ^ 0x05))
编辑:我将0xF
更改为0xF0
,这就是我的意思。
给定示例的匹配(需要更多示例)。
你的双字节示例是不够的(请参阅我的评论)所以我不打扰那些。
编辑:我是如何解决的:
第一步:将所有内容写入比特,空间将半字节(4比特)分开,因为设计通常在半字节边界上做一些不同的事情 - 也就是说它们可能x & 0x80 | x ^ 0x05
但不常做x & 0x84 | x ^ 0x01
0000 0000 --> 1000 0101
0000 0001 --> 1000 0100
看到它,看起来我们得到一个0x80免费(或),第二个半字节得到一个xor 0x05。测试0和1很聪明。汉明距离一个值和零值总是很好的测试。所以现在我认为alg是:
#define f(x) (x ^ 0x85)
然后我们得到测试对0x85到0xd0:
1000 0101 --> 1101 0000
因此较低的半字节看起来仍然正确(xor为0x05)但是高位半字节需要更改为OR,而不是异或:
#define f(x) ( (0xF0 & x | 0x80) \ // Upper nibble
| 0x0F & (x ^ 0x05)) // Lower nibble
这与
相同#define f(x) ( x^0x05 | 0x80)
但那仍然没有做到!请注意,我们得到的高位半字节中的位模式与输入的低位半字节相同,请参见0101?让低位半字节与上部相同并称之为上部:
#define f(x) ( (x^0x05) | 0x80 | (0xF0 & (x << 4))
现在我们匹配所有三个测试用例(实际上并不多)
这不是我上面提到的那个你接受的,也许你把0xF
的错字修改为预定的0xF0
?如果没有,那么请确保您注意到该错误并更改您的代码。如果用于任何严重用途,您甚至可以包括一些已知答案单元测试。
哦,因为我把它放在手边,所以它处于可运行的状态。
#include <stdio.h>
#define F(x) (0x80 | (0xF0 & (x << 4)) | (x ^ 0x05))
void main()
{
printf("%02x %02x %02x\n", F(0), F(1), F(0x85));
}