我编写了一个程序,使用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文件。