任何人都可以帮我识别算法吗?

时间:2011-03-24 21:25:23

标签: algorithm hash

这种专有网络协议使用了我以前从未见过的奇怪(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处提交的,并根据端口号而变化。

谢谢,

1 个答案:

答案 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));
}