提高sevenzipsharp 检查密码的速度(1)
前言:sevenzipsharp检查密码(包括检查压缩包的有效性)的函数是SevenZipExtractor.check(), sevenzipsharp调用的是7zip的动态链接库,而且不止是7zip,其它压缩软件测试密码这个功能耗时也很久(压缩包小可以忽略,密码错误的时候速度还行,密码正确的话,会把压缩包全部解压,耗时相当于解压一个文件的时间),除了360压缩比较快,至少快几百倍,但是找不到调用的方法,如果谁有更好的解决方案,麻烦提供一下。
原来的check方法4G大小的文件大概耗时
错误的密码:www.cr173.com用时:0.19秒
正确的密码:www.he11oworld.com用时:85.98秒
方案1:我的思路是既然检测一个压缩包的解压密码,没必要把所有的文件都检测一遍,取压缩包最小的加密文件去检测就行了,4G大小的文件大概耗时
错误的密码:www.cr173.com用时:0.19秒
正确的密码:www.he11oworld.com用时:26.18秒
方案2:同样是检查一个文件,检查第一个加密文件,,4G大小的文件大概耗时
错误的密码:www.cr173.com用时:0.12秒
正确的密码:www.he11oworld.com用时:0.10秒
发现方案二是最优的,一下是具体实现的代码
定义一个全局字段,用来存取压缩包内最小的文件索引和大小
private IDictionary<int, ulong> encryptionFileInfo = null;
初始化窗体时实例化
encryptionFileInfo = new Dictionary<int, ulong>();
获取压缩包信息时,保存最小文件的索引和大小
encryptionFileInfo.Clear();
foreach (ArchiveFileInfo item in extr.ArchiveFileData)
{
if (item.Encrypted)
{
if (encryptionFileInfo.Count == )
{
encryptionFileInfo.Add(item.Index, item.Size);
}
////只检测最小文件的实现方法
//else
//{
// if (encryptionFileInfo.Values.ElementAt(0) > item.Size)
// {
// encryptionFileInfo.Clear();
// encryptionFileInfo.Add(item.Index, item.Size);
// }
//}
}
}
实现优化函数,在SevenZipExtractor.cs单元添加函数如下函数
/// <summary>
/// 检查压缩包密码
/// </summary>
/// <param name="minFileIndex">压缩包中加密文件索引最小的值</param>
/// <returns></returns>
public bool Check(int minFileIndex)
{
DisposedCheck();
try
{
InitArchiveFileData(false);
var archiveStream = GetArchiveStream(true);
var openCallback = GetArchiveOpenCallback();
if (!OpenArchive(archiveStream, openCallback))
{
return false;
}
using (var aec = GetArchiveExtractCallback("", (int)_filesCount, null))
{
try
{
uint[] u = new uint[];
u[] = uint.Parse(minFileIndex.ToString());
CheckedExecute(
_archive.Extract(u, , , aec),
SevenZipExtractionFailedException.DEFAULT_MESSAGE, aec);
//CheckedExecute(
// _archive.Extract(null, UInt32.MaxValue, 1, aec),
// SevenZipExtractionFailedException.DEFAULT_MESSAGE, aec);
}
finally
{
FreeArchiveExtractCallback(aec);
}
}
}
catch (Exception)
{
return false;
}
finally
{
if (_archive != null)
{
_archive.Close();
}
((InStreamWrapper)_archiveStream).Dispose();
_archiveStream = null;
_opened = false;
}
return true;
}
之后就是调用了,
using (SevenZipExtractor extr = new SevenZipExtractor(tbPackagePath.Text, Convert.ToString(item["Password"])))
{ if (extr.Check(index))
{
tbPassword.Text = Convert.ToString(item["Password"]);
memoEdit1.Text = memoEdit1.Text + "此为正确密码:" + Convert.ToString(item["Password"]) + "用时:" + (DateTime.Now - dtStartDetail).TotalMilliseconds.ToString() + "\r\n";
return;
}
memoEdit1.Text = memoEdit1.Text + "测试密码:" + Convert.ToString(item["Password"]) + "用时:" + (DateTime.Now - dtStartDetail).TotalMilliseconds.ToString() + "\r\n";
}
如果只用方案2可以把IDictionary<int, ulong>换成整型
提高sevenzipsharp 检查密码的速度(1)的更多相关文章
- 处理sevenzipsharp 检查密码函数的Bug
using (SevenZipExtractor extr = new SevenZipExtractor(tbPackagePath.Text, "www.pc6.com")) ...
- 通过预编译头文件来提高C++ Builder的编译速度
C++ Builder是最快的C++编译器之一,从编译速度来说也可以说是最快的win32C++编译器了.除了速度之外,C++builder的性能也在其它C++编译器的之上,但许多Delphi程序员仍受 ...
- AD帐户操作C#示例代码(二)——检查密码将过期的用户
本文接着和大家分享AD帐户操作,这次开发一个简单的检查密码将过期用户的小工具. 首先,新建一个用户实体类,属性是我们要取的用户信息. public class UserInfo { /// <s ...
- 检查密码复杂度的C#正则表达式
在用户注册与修改.重置密码时,强制密码达到一定的复杂度,是减少盗号的有效措施之一. 而在代码中检查密码复杂度就需要用到正则表达式,比如要求密码必须包含数字.小写或大写字母.特殊字符.字符数在8-30之 ...
- 如何提高Lucene构建索引的速度
如何提高Lucene构建索引的速度 hans(汉斯) 2013-01-27 10:12 对于Lucene>=2.3:IndexWriter可以自行根据内存使用来释放缓存.调用writer.set ...
- 提高NetBeans的代码提示速度.md
NetBeans配置 如何提高NetBeans的代码提示速度,打开下面的文件然后配置 **C:\Users\ylg\AppData\Roaming\NetBeans\8.2\config\Editor ...
- PAT 1081 检查密码(15) (代码+思路)
1081 检查密码(15 分) 本题要求你帮助某网站的用户注册模块写一个密码合法性检查的小功能.该网站要求用户设置的密码必须由不少于6个字符组成,并且只能有英文字母.数字和小数点 .,还必须既有字母也 ...
- nginx提高加载静态文件速度
1.本来对于静态网页,我们不需要放在应用容器中,原因一时由于应用服务器是用来解析动态网页的,针对静态网页本来就性能不高,而且还会占用应用容器的资源,所以我们专门使用nginx用来解析静态网页. ...
- B1081 检查密码 (15分)
B1081 检查密码 (15分) 本题要求你帮助某网站的用户注册模块写一个密码合法性检查的小功能.该网站要求用户设置的密码必须由不少于6个字符组成,并且只能有英文字母.数字和小数点 .,还必须既有字母 ...
随机推荐
- oracle中having的用法
having的用法,having一般是用在group的后面,用在前面查询结果相同,但是语法上不通顺.答:having是对行组进行过滤.一般是先用where 过滤返回行,用group by 对过滤后的行 ...
- grub的sol
http://smcijohnny.blogspot.com/2015/06/linuxsolserial-over-lan.html https://www.hiroom2.com/2016/06/ ...
- vbox 不识别u盘的问题
usb设备 ->启用usb设备 ->启用usb2.0(ehci)控制器 添加usb筛选器 给筛选器起个名字
- 关于checkbox全选与反选的问题
在一组checkbox中常有这样的需求,选择全选按钮,所有的选项必须全选上,当再次点击时,则所有的按钮必须反选,当点击一组checkbox时,只有有一个不选上,则按钮不选中,当所有的按钮全部选上时,此 ...
- java.util.concurrent.RejectedExecutionException: Task java.util.concurrent.FutureTask@1f303192 rejected from java.util.concurrent.ThreadPoolExecutor@11f7cc04[Terminated, pool size = 0, active threads
java.util.concurrent.RejectedExecutionException: Task java.util.concurrent.FutureTask@1f303192 rejec ...
- 区块 Blocks
Structure / Blocks / Demonstrate block regions
- centos7.2环境elasticsearch-5.0.1+kibana-5.0.1+zookeeper3.4.6+kafka_2.9.2-0.8.2.1部署详解
centos7.2环境elasticsearch-5.0.1+kibana-5.0.1+zookeeper3.4.6+kafka_2.9.2-0.8.2.1部署详解 环境准备: 操作系统:centos ...
- nginx https配置
nginx的https服务配置如下(在server中配置): ssl on; ssl_session_cache shared:SSL:50m; ssl_session_timeout 1d; ssl ...
- nginx 自动忽略request中header name包含下划线参数的解决方法
使用nginx过程中遇到了个问题,就是request中的header name中如果包含下划线会自动忽略掉,导致服务器接收不到该字段的内容,以下为解决方法: nginx默认request的header ...
- iOS 数据序列化,NSCoding, NSCoder
iOS可以利用NSKeyedArchiver类将对象序列化成NSData存储在磁盘上,但前提是该对象所属的类必须遵从NSCoding协议. NSCoding协议包含两个方法,要序列化的类必须实现它们 ...