【问题标题】:Decoding custom encrypted file解码自定义加密文件
【发布时间】: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, 0x2E0x74, 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


【解决方案1】:

虽然word 的大小取决于机器,但在这种情况下DWORD 很可能是4 个字节长,所以在java 中它对应于int。 此外,您必须考虑到原始架构在位和字节方面可能是LSBMSB,因此您自己将单独的字节打包成“int”,可能会改变位的顺序:总共有 4 种不同的组合。然后你首先需要左移 5 位,然后减去 39393939。“解密”后你可能需要恢复原始字节/位顺序。

【讨论】:

    猜你喜欢
    • 2010-11-06
    • 2012-04-05
    • 1970-01-01
    • 1970-01-01
    • 2011-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-22
    相关资源
    最近更新 更多