Java 我怎样才能击败RC4这样的混淆?

Java 我怎样才能击败RC4这样的混淆?,java,encryption,vb6,reverse-engineering,Java,Encryption,Vb6,Reverse Engineering,我试图读取最初用Visual Basic 6编写的程序(后来用Java重写)生成的数据文件,以便使用自己的工具处理它们 该计划是由美国政府创建的公共领域软件;没有任何许可协议禁止此操作。我不能提及该程序的名称或其网站的链接,因为程序员可能会在明年的版本中更改混淆,我将不得不重复我的反向工程工作 底层数据文件格式是基于文本的,而混淆是某种带有硬编码密钥的流密码。我可以将数据文件异或(XOR)在一起以获得一些数据(用重复的ASCII字符填充一个字符串字段),但我希望避免将整个密钥流嵌入到我的程序中

我试图读取最初用Visual Basic 6编写的程序(后来用Java重写)生成的数据文件,以便使用自己的工具处理它们

该计划是由美国政府创建的公共领域软件;没有任何许可协议禁止此操作。我不能提及该程序的名称或其网站的链接,因为程序员可能会在明年的版本中更改混淆,我将不得不重复我的反向工程工作

底层数据文件格式是基于文本的,而混淆是某种带有硬编码密钥的流密码。我可以将数据文件异或(XOR)在一起以获得一些数据(用重复的ASCII字符填充一个字符串字段),但我希望避免将整个密钥流嵌入到我的程序中

搜索.exe文件会显示对名为RC4ini的子例程的调用和我认为是键的字符串(它不会出现在用户界面的任何地方)。我找到了这个加密库的源代码,对RC4的工作实现进行了正确的更改(在JavaScript中,这是我主要使用的编程语言),并尝试使用它


我试图在文件中的每个偏移位置搜索加密数据,但解密失败。为什么会发生这种情况?

如果他们正在使用RC4,您有几个选择

一个选项是找出他们何时调用RC4并转储密钥或明文消息。使用Windbg或ollydbg之类的调试器很容易做到这一点。从根本上说,他们违反了密码法,所有的DRM都会因为这个属性而失败


另一种攻击是,如果相同的密钥用于两条消息,如果您知道一条消息的纯文本,则可以将其与其对应的密码文本进行异或,以显示PRNG流。然后可以将该PRNG流与未知消息的密码文本异或,以获得其相应的明文。当然,如果每条消息的密钥不同(例如使用IV),那么这种攻击将不起作用

通过使用Google搜索可疑的加密密钥,我发现开发人员后来(甚至可能是在同一个月)公开了Java代码的源代码,该代码清楚地标识了我找到的作为加密密钥的字符串。随后,他将密钥重构为一个单独的类,并将其放入
svn:ignore
(并可能对其进行了更改;我还没有检查)

事实证明,我的解密程序与Planet源代码实现并不完全匹配。以下是RC4 PRGA的详细信息:

i := 0
j := 0
while GeneratingOutput:
    i := (i + 1) mod 256
    j := (j + S[i]) mod 256
    swap values of S[i] and S[j]
    K := S[(S[i] + S[j]) mod 256]
    output K
endwhile

Visual Basic和Java代码都省略了前两行(i:=0和j:=0)。

如果是公共域,为什么不链接到它?@Igor Skochinsky:每年都会发布新版本的程序。下一个版本将于2011年初发布,提及该程序的名称(因此出现在Web搜索中)将需要再次颠倒该程序。在没有看到您自己的算法实现的情况下,任何人怎么能给出一个合理的答案来解释为什么它不能给出与真实结果相同的结果?那么为什么不倒着写呢?@idealmachine使用调试器。