“云计算技术与应用课程设计”总结报告
背景
互联网发展到今天,许多数据与文件的传输仍然要用到压缩技术。其中最有名的无疑是ZIP压缩文件,是无损压缩的杰出代表。
但是,我们今天在上网的时候仍然会遇到这样尴尬的情况:下载了一个ZIP压缩包,但是解压这个包却需要密码,通常这些密码会写在帖子里,但是如果你找不到这个压缩包的出处或者联系到这个压缩包的作者的话,是不能解压出里面的内容的。于是,有了暴力破解这类压缩包文件的软件。
但是,又出现一个问题,ZIP压缩包的密码是不定长的,里面可以是任意字符,也就是说一个8位密码,那它的可能次数为(26+10)^8=282429536481次,如果用一台计算机进行暴力破解可能需要一周或者更多时间。
为了处理这个情况,这个项目就应运而生了。
介绍
GetZipKey是运行在Hadoop分布式集群上的软件,可以充分运用分布式集群的并行计算能力对ZIP压缩包进行暴力破解密码。
主要设计思想
1. 获取输入的参数,对参数进行保存。
2. 通过自定义输入文件格式类InputFormat,根据输入的参数,生成可能的密码。
3. 密码由Hadoop分配给各个机器,由各个机器尝试着解压给定的ZIP压缩包。
4. 由Hadoop对尝试结果进行汇总,保存在输出文件内。
主要算法
ZIP压缩文件解压
判断密码是否正确是对于ZIP解压的一种应用。
使用的是开源项目winzipaes提供的方法。
在导入winzipaes与其的依赖包后,解压ZIP文件变得简单了起来。
注意:在这篇文档中的代码全部为示例代码,经过删减,不能运行,只是提供一些参考。 |
解压ZIP压缩包的关键类DecryptionZipUtil |
package com.fieldsoft.winzipaes; import java.io.File; +
/** * 压缩指定文件或目录为ZIP格式压缩文件 * 支持中文(修改源码后) * 支持密码(仅支持256bit的AES加密解密) * 依赖bcprov项目(bcprov-jdk16-140.jar) * * @authorzyh */ publicclass DecryptionZipUtil {
publicstaticvoid zip(StringsrcFile,StringdestPath,Stringpasswd); privatestaticvoid doZip(Filefile, AesZipFileEncrypterencrypter, StringpathForEntry, Stringpasswd) throws IOException ;
/** * 使用给定密码解压指定压缩文件到指定目录 * @param inFile指定Zip文件 * @param outDir解压目录 * @param passwd解压密码 * @return 0:pwd err 1:pwd true-1:other err */ publicstaticint unzip(StringinFile, StringoutDir, Stringpasswd) { File outDirectory = new File(outDir); if (!outDirectory.exists()) { outDirectory.mkdir(); } AESDecrypter decrypter = new AESDecrypterBC(); AesZipFileDecrypterzipDecrypter = null; try { zipDecrypter =new AesZipFileDecrypter(new File(inFile),decrypter); AesZipFileDecrypter.charset ="utf-8"; /** *得到ZIP文件中所有Entry,但此处好像与JDK里不同,目录不视为Entry *需要创建文件夹,entry.isDirectory()方法同样不适用,不知道是不是自己使用错误 *处理文件夹问题处理可能不太好 */ List<ExtZipEntry>entryList = zipDecrypter.getEntryList(); for(ExtZipEntryentry : entryList) { String eName = entry.getName(); String dir = eName.substring(0, eName.lastIndexOf(File.separator) + 1); File extractDir = new File(outDir,dir); if (!extractDir.exists()) { FileUtils.forceMkdir(extractDir); } /** * 抽出文件 */ File extractFile = new File(outDir + File.separator + eName); zipDecrypter.extractEntry(entry,extractFile, passwd); } return |