【发布时间】:2015-12-25 23:45:20
【问题描述】:
我目前正在处理旧游戏的保存文件。 我的问题是文件是用自定义算法加密的。 我只有一个模糊的描述:
“通过添加 39393939 然后将每个 DWord 向右旋转 5 位来加密文件。”
我试图在每个 4 字节块 () 上使用这个 java 代码来反转进度
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;
}
但应用到0x70, 0x4E, 0x33, 0x43 它应该给我0x73, 0x63, 0x30, 0x2E 和0x74, 0x60, 0x33, 0x03 应该给0x73, 0x63, 0x34, 0x20
【问题讨论】:
-
等等,它说的是“DWord”。在我看来,一个字是 32 位(4 个字节)。换句话说,双字应该与
long(64 位/8 字节)相关,不是吗? -
根据维基百科en.wikipedia.org/wiki/… 一个 WORD 是 16 位和一个 DWORD 是 32 位 = 4 字节
-
好吧,但我还是不明白你的例子。如果我使用
calc.exe(设置为DWORD程序员模式),如果我输入704E3343,然后将位向左旋转5,我得到9C6686E,然后我减去39393939,我得到D08D2F35,这是您之前给出的函数的 exact 输出(使用byte[] dec = decryptDWord(new byte[] {0x70, 0x4E, 0x33, 0x43 });调用它,然后一次显示一个字节)。因此,该功能确实有效。 (有关 tutorialspoint.com 在线 Java 编译器示例,请参阅 goo.gl/lhLewr)
标签: java encryption bit-manipulation