如何使具有IO任务循环的java程序更快



我编写了一个程序,使用zip4j查找zip文件的密码。我使用了暴力破解方法,因此每个密码都应该使用下面的代码检查文件:

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

,但这是如此缓慢,因为io相关的任务在循环中重复每次!是否有其他方法可以检查zip文件的密码?或者我需要以某种方式将文件移动到内存中并使其更快?或者有其他加速的方法吗?

谢谢

暴力破解是一个令人尴尬的并行问题。您应该尝试使用每个内核一个线程来解决这个问题。

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

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

最后尝试使用你能找到的最快的解密实现。

试试下面的逻辑。

  • 启动程序
  • 文件夹的路径应该与java程序共享。
  • 首先根据您的需要复制多个zip文件
  • 下一步为每个副本启动单独的线程。
  • 执行密码破解过程,每个线程包含
  • 在类中保留一个公共标志,初始值为false每个线程将遵循该标志执行
  • 最后,当任何线程返回true并返回一个解决方案时,它设置标志,所有其他线程停止处理。

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

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

  • 确定文件使用的加密算法
  • 将文件读入内存一次
  • 启动多个线程,使用生成的密码解密原始数据
  • 根据库/解密机制,您将得到一个异常或随机混乱的比特作为结果-在这种情况下,检查前几个字节的文件签名的zip文件。
如果保护文件的人知道如何生成安全密码,那么准备好等待几千年吧!

最新更新