我目前正在使用舊遊戲的保存文件。 我的問題是該文件是用自定義算法加密的。 我只有一個模糊的描述:解碼自定義加密文件
「該文件通過添加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編譯器示例) –