2

我编写了一个程序来使用 zip4j 查找 zip 文件的密码。我使用了蛮力方法,因此应使用以下代码在文件中检查每个密码:

while(true)
try
{
  zipFile.setPassword(passstr);
  zipFile.extractAll(deststr);
  break;
}
catch (Exception ex2)
{ 
    //passstr = next password string to be checked
}

但这太慢了,因为每次都在循环中重复与 io 相关的任务!有没有其他方法可以检查 zip 文件的密码?还是我需要以某种方式将文件移动到内存并使其更快?或任何其他解决方案来加快速度?

谢谢

4

3 回答 3

1

蛮力是一个令人尴尬的平行问题。您应该尝试每个核心使用一个线程来解决此问题。

此外,您应该(如您所说)避免 I/O。为此,找到一种将文件加载到内存并在不使用 I/O 的情况下测试密码的方法。(根据维基百科和本规范,您还应该尝试最小化测试持续时间,似乎 zip 文件可能包含一个加密的标头,这将更快地测试密码 - 如果可以进行一些测试)。

结合并行和内存解决方案,很明显您应该为每个线程使用内存中的文件副本。

最后尝试使用你能找到的最快的解密实现。(用c做吧?)

于 2013-03-13T12:27:38.393 回答
0

试试下面的逻辑。

  • 启动程序
  • 该文件夹的路径应与 java 程序共享。
  • 首先根据您的需要在同一文件夹中制作多个 zip 文件的副本。
  • 接下来为您创建的每个副本启动单独的线程。
  • 使用包含不同暴力字典集的每个线程执行密码破解过程。
  • 在类中保留一个公共标志,该标志最初为假,每个线程将遵循该标志执行
  • 最后,当任何线程通过解决方案返回 true 时,它​​会设置标志并且所有其他线程停止处理。

线程数可以根据需要或性能设置

于 2013-03-13T11:52:33.193 回答
0

正如 Vineet 已经提到的,应用线程将在一定程度上提高性能。然而,更复杂的方法是:

  • 确定文件正在使用什么加密算法
  • 将文件一次读入内存
  • 启动多个线程以使用您生成的密码解密原始数据
  • 根据库/解密机制,您将得到一个异常或随机的比特混乱 - 在这种情况下,检查 zip 文件的文件签名的前几个字节。

如果保护文件的人知道如何生成安全密码,请准备好等待几千年!

于 2013-03-13T12:08:08.727 回答