我正在尝试读取最初用Visual Basic 6编写的程序生成的数据文件(后来用Java重写),以便我可以使用自己的工具处理它们。
该程序是由美国政府创建的公共领域软件;没有许可协议禁止这一点。我不能提到该程序的名称或其网站的链接,因为程序员可能会改变明年版本中的混淆,我将不得不重复我的逆向工程。
底层数据文件格式是基于文本的,混淆是某种带有硬编码密钥的流密码。我可以将数据文件放在一起以获取一些数据(用一个重复的ASCII字符填充其中一个字符串字段),但我想避免将整个密钥流嵌入到我的程序中。
通过.exe文件搜索会显示对名为RC4ini的子例程的调用以及我认为是键的字符串(它不会出现在用户界面的任何位置)。我在Planet Source Code找到了这个加密库的源代码,对RC4的工作实现进行了正确的更改(在JavaScript中,因为这是我主要使用的编程语言),并尝试使用它。
我试图在文件中的每个偏移处搜索加密数据,但是我没有成功解密。为什么会这样?
答案 0 :(得分:2)
如果他们使用RC4,您有几个选择。
一个选项是找出他们何时调用RC4并转储密钥或纯文本消息。使用像Windbg或ollydbg这样的调试器很容易做到这一点。从根本上说,他们正在违反加密法,所有DRM都会因为这个属性而失败。
另一个攻击是,如果对2条消息使用相同的密钥,如果您知道一条消息的纯文本,则可以使用相应的密文对其进行xor以显示PRNG流。然后可以使用未知消息的密文对该PRNG流进行异或,以获得其对应的明文。当然,如果每个消息的密钥不同(例如使用IV),那么这种攻击将不起作用。
答案 1 :(得分:0)
通过使用Google搜索可疑的加密密钥,我发现开发人员后来(甚至可能是同一个月)开源了Java代码,该代码清楚地标识了我发现的加密密钥字符串。随后,他将密钥重构为一个单独的类,他放入svn:ignore
(并且可能改变了它;我还没有检查过。)
事实证明,我的解密程序与Planet Source Code实现并不完全匹配。以下是RC4 PRGA的Wikipedia's description:
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)。