2015-12-25 63 views
2

我目前正在使用旧游戏的保存文件。 我的问题是该文件是用自定义算法加密的。 我只有一个模糊的描述:解码自定义加密文件

“该文件通过添加39393939加密,然后旋转每个DWord右5位。”

我试着用每4个字节的块()

private static byte[] decryptDWord(byte[] in) { 
    //in is 4 bytes 

    IntBuffer buf=ByteBuffer.wrap(in).asIntBuffer(); 
    int dword=buf.get(); 
    dword=Integer.rotateLeft(dword, 5); 
    dword -=0x39393939; 
    byte[] out = ByteBuffer.allocate(4).putInt(dword).array(); 

    return out; 
} 

这个java代码扭转进步,但应用在0x70, 0x4E, 0x33, 0x43它应该给我0x73, 0x63, 0x30, 0x2E0x74, 0x60, 0x33, 0x03应该给0x73, 0x63, 0x34, 0x20

+0

等一下,它说“DWord”。在我看来,一个字是32位(4字节)。换句话说,双字应与“长”(64位/ 8字节)相关,不是吗? –

+0

根据维基百科https://en.wikipedia.org/wiki/Word_%28computer_architecture%29#Size_families一个WORD是16位,一个DWORD ist 32位= 4bytes – meneken17

+0

好吧,但我仍然不明白你的例子。如果我使用'calc.exe'(设置为'DWORD'编程模式),如果我输入'704E3343',然后旋转位5到左边,我得到'9C6686E',然后我减去'39393939', D08D2F35',它是你之前给出的函数的**精确**输出(用byte [] dec = decryptDWord(new byte [] {0x70,0x4E,0x33,0x43)调用它);'然后显示一个字节一次)。所以,该功能实际上起作用。 (请参阅http://goo.gl/lhLewr以获得一个tutorialspoint.com在线java编译器示例) –

回答

1

虽然word大小是依赖于机器的,在这种情况下最有可能的是DWORD是4个字节长,所以在java中它对应于int。 另外,您必须考虑到原始体系结构可能是LSBMSB(位和字节),因此可以将单独的字节自己打包到'int'中,可能会更改位的顺序:共有4种不同的组合。然后你首先需要旋转左5位,然后减去39393939.'解密'后,你需要恢复原始的字节/位的顺序。

+0

谢谢。事实上,它是LBS,而Java与MSB合作 – meneken17