2015-12-25 60 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