站点图标 久久日记本

找回压缩包密码

偶然间清理笔记本,发现了多年前的照片,然而是两个压缩包,重要的是,压缩包设置有密码,试了大约十分钟,崩溃,并不记得密码。

压缩有两个,一个zip,个rar。

网上找了找,zip的解决方案蛮多的,而解压rar并没有。

想了想,似乎可以调用7z来解决rar的问题。

用C#调用命令行才执行批量密码解压,不过似乎没法很友好的检查出那个密码对错并break,只能进行解压。

google了一下,发现了sevenzipsharp这个,看了看文档,参照着写了一下解压代码。调用装的最新版7z的dll报Can not load 7-zip library or internal COM error! Message: DLL file does not exist.错误,从sevenzipsharp下了9.15版本,这才正常。

/// <summary>
/// check zip or rar password by file path
/// </summary>
/// <param name="path"></param>
/// <param name="password"></param>
/// <returns></returns>
public bool CheckRARByPath(string path, string password)
{
    SevenZipBase.SetLibraryPath(@"7z.dll");
    using (SevenZipExtractor extractor = new SevenZipExtractor(path, password))
    {
        if (extractor.Check())
        {
            return true;
        }
        else
        {
            return false;
        }
    }
}

这样的坏处是每次都要传入path一下,猜想如果是大文件岂不是很惨,SevenZipExtractor有个stream参数,用FileStream读一下再转一下:

FileStream fs = new FileStream(@"test.rar", FileMode.Open);
byte[] bytes = new byte[fs.Length];
fs.Read(bytes, 0, bytes.Length);
fs.Close();
Stream stream = new MemoryStream(bytes);

这样测试下来,大文件超出了内存^_^……

既然是找回密码,就不做那么复杂了,这时候发现我的数学真是着急,组合数组干脆就用for来循环了。

很顺利,rar跑了不到1分钟,zip跑了10分钟找回了密码。

送上源码:demo

参考资料:

使用SevenZipSharp压缩、解压文件

提高sevenzipsharp 检查密码的速度(1)

SevenZipSharp 0.64

github上的仓库: SevenZipSharp in github

codeplex似乎要关站了,备份了一下文档和库:

7zDLLs.7z

SevenZipSharp.dll

SevenZipSharpHelp.7z

退出移动版