我目前正在使用旧游戏的保存文件。 我的问题是该文件是用自定义算法加密的。 我只有一个模糊的描述:解码自定义加密文件
“该文件通过添加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, 0x2E
和0x74, 0x60, 0x33, 0x03
应该给0x73, 0x63, 0x34, 0x20
等一下,它说“DWord”。在我看来,一个字是32位(4字节)。换句话说,双字应与“长”(64位/ 8字节)相关,不是吗? –
根据维基百科https://en.wikipedia.org/wiki/Word_%28computer_architecture%29#Size_families一个WORD是16位,一个DWORD ist 32位= 4bytes – meneken17
好吧,但我仍然不明白你的例子。如果我使用'calc.exe'(设置为'DWORD'编程模式),如果我输入'704E3343',然后旋转位5到左边,我得到'9C6686E',然后我减去'39393939', D08D2F35',它是你之前给出的函数的**精确**输出(用byte [] dec = decryptDWord(new byte [] {0x70,0x4E,0x33,0x43)调用它);'然后显示一个字节一次)。所以,该功能实际上起作用。 (请参阅http://goo.gl/lhLewr以获得一个tutorialspoint.com在线java编译器示例) –