转至繁体中文版     | 网站首页 | 图文教程 | 资源下载 | 站长博客 | 图片素材 | 武汉seo | 武汉网站优化 | 
最新公告:     敏韬网|教学资源学习资料永久免费分享站!  [mintao  2008年9月2日]        
您现在的位置: 学习笔记 >> 图文教程 >> 软件开发 >> Delphi程序 >> 正文
用DELPHI实现文件加密压缩         ★★★★

用DELPHI实现文件加密压缩

作者:闵涛 文章来源:闵涛的学习笔记 点击数:2183 更新时间:2009/4/23 18:30:59
用DELPHI实现文件加密压缩

作者: e梦缘 (wnhoo)
Mail:wnhoo@163.com
风花雪月 e梦情缘

点击下载此详细说明文件


概述:
在这篇文件中,讲述对单个文件的数据加密、数据压缩、自解压的实现。同样,也可以实现对多个文件或文件夹的压缩,只要稍加修改便可实现。

关键字:加密压缩、Zlib、流、资源文件

引 言:
在日常中,我们一定使用过WINZIP、WINRAR这样的出名的压缩软件,就是我们开发软件过程中不免要遇到数据加密、数据压缩的问题!本文中就这一技术问题展开探讨,同时感谢各位网友的技巧,在我每次面对问题要解决的时候,是你们辛苦地摸索出来的技巧总是让我豁然开朗,问题迎刃而解。本篇文章主要是运用DELPH的强大的流处理方面的技巧来实现的数据加密压缩,并用于实际的软件程序开发中,将我个人的心得、开发经验写出来与大家分享。

1、  系统功能
1)、数据压缩
使用DELPHI提供的两个流类(TCompressionStream和TDecompressionStream)来完成数据的压缩和解压缩。
2)、数据加密压缩
通过Delphi编程中“流”的应用实现数据加密,主要采用Tstream的两个派生类Tfilestream、Tmemorystream 来完成的;其中数据压缩部分采用1)的实现方法
3)、双击压缩文件自动关联解压
通过更改注册表的实现扩展名与程序文件的关联,主要采用Tregistry;并且,API函数SHChangeNotify实现注册效果的立即呈现。
4)、可生成自解压文件
自解压的文件实现数据压缩1)与数据加密压缩2)的自动解压;并且,通过资源文件的使用实现可执行的自解压文件与数据文件的合并,来完成数据的自解压实现。

2、  系统实现
2.1、工作原理
seover="this.style.cursor=''''hand'''';" onclick=window.open(this.src); height=221 alt=按此在新窗口打开图片 src="/Article/UploadFiles/200904/2009042318310078.jpg" width=478 onload=javascript:DrawImage(this); border=0>

2.2、关键技术的讲述
(一)ZLIB
1)、基类 TCustomZlibStream:是类TCompressionStream和TDecompressionStream 类的基类,它主要有一个属性: OnProgress,在类进行压缩或解压缩的过程中会发生这个的事件 。
格式:Procedure OnProgress (Sender: TObject); dynamic;
2)、压缩类TCompressionStream:除了继承了基类的OnProgress 属性外,又增加了一个属性:CompressionRate,它的定义如下:
Property CompressionRate: Single read GetCompressionRate;
通过这个属性,可以得到压缩比。
它的几个重要的方法定义如下:
Constructor TCompressionStream.Create (CompressionLevel: TCompressionLevel; Dest: TStream);
其中:TcompressionLevel(压缩类型),它由如下几个定义:
   1)、 clNone :不进行数据压缩;
   2)、 clFastest:进行快速压缩,牺牲压缩效率;
   3)、 clDefault:进行正常压缩;
   4)、 clMax: 进行最大化压缩,牺牲速度;
Dest:目的流,用于存放压缩过的数据。
Function TCompressionStream.Write (const Buffer; Count: Longint): Longint;
其中:Buffer:需要压缩的数据;
   Count: 需要压缩的数据的字节数;
函数返回写入流的字节数。
注意:压缩类TCompressionStream的数据只能是写入的,如果试图从其内部读取数据,将发生一个"Error "异常。需要压缩的数据通过方法 Write写入流中,在写入的过程中就被压缩,并保存在由构造函数提供的内存流(TmemoryStream)中,同时触发 OnProcess 事件。
3)、 解压缩类 TDecompressionStream :和压缩类TcompressionStream相反,它的数据是只能读出的,如果试图往其内部写数据,将发生一个"Error "异常。
它的几个重要方法定义如下:
构造函数:Constructor Create(Source: TStream);
  其中:Source 是保存着压缩数据的流;
Function Read(var Buffer; Count: Longint): Longint;
  数据读出函数,Buffer: 存数据缓冲区;Count: 缓冲区的大小;
  函数返回读出的字节数。数据在读出的过程中,数据被解压缩,并触发 OnProcess 事件。


(二)流
在Delphi中,所有流对象的基类为TStream类,其中定义了所有流的共同属性和方法。
TStream类中定义的属性如下:
1)、Size:此属性以字节返回流中数据大小。
2)、Position:此属性控制流中存取指针的位置。

Tstream中定义的虚方法有四个:
1)、Read:此方法实现将数据从流中读出,返回值为实际读出的字节数,它可以小于或等于指定的值。
2)、Write:此方法实现将数据写入流中,返回值为实际写入流中的字节数。
3)、Seek:此方法实现流中读取指针的移动,返回值为移动后指针的位置。
函数原形为:Function Seek(Offset:Longint;Origint:Word):Longint;virtual;abstract;
参数Offset为偏移字节数,参数Origint指出Offset的实际意义,其可能的取值如下:
soFromBeginning:Offset为指针距离数据开始的位置。此时Offset必须大于或者等于零。
soFromCurrent:Offset为移动后指针与当前指针的相对位置。
soFromEnd:Offset为移动后指针距离数据结束的位置。此时Offset必须小于或者等于零。
4)、Setsize:此方法实现改变数据的大小。

另外,TStream类中还定义了几个静态方法:
1)、ReadBuffer:此方法的作用是从流中当前位置读取数据,跟上面的Read相同。
注意:当读取的数据字节数与需要读取的字节数不相同时,将产生EReadError异常。
2)、WriteBuffer:此方法的作用是在当前位置向流写入数据,跟上面的Write相同。
注意:当写入的数据字节数与需要写入的字节数不相同时,将产生EWriteError异常。
3)、CopyFrom:此方法的作用是从其它流中拷贝数据流。
函数原形为:Function CopyFrom(Source:TStream;Count:Longint):Longint;
参数Source为提供数据的流,Count为拷贝的数据字节数。当Count大于0时,CopyFrom从Source参数的当前位置拷贝Count个字节的数据;当Count等于0时,CopyFrom设置Source参数的Position属性为0,然后拷贝Source的所有数据;

Tstream常见派生类:
TFileStream       (文件流的存取)
TStringStream     (处理内存中的字符串类型数据)
TmemoryStream     (对于工作的内存区域数据处理)
TBlobStream       (BLOB类型字段的数据处理)
TwinSocketStream  (socket的读写处理)
ToleStream        (COM接口的数据处理)
TresourceStream   (资源文件流的处理)
其中最常用的是TFileStream类。使用TFileStream类来存取文件,首先要建立一个实例。声明如下:
constructor Create(const Filename:string;Mode:Word);
Filename为文件名(包括路径)
Mode为打开文件的方式,它包括文件的打开模式和共享模式,其可能的取值和意义如下:
打开模式:
fmCreate :用指定的文件名建立文件,如果文件已经存在则打开它。
fmOpenRead :以只读方式打开指定文件
fmOpenWrite :以只写方式打开指定文件
fmOpenReadWrite:以写写方式打开指定文件
共享模式:
fmShareCompat :共享模式与FCBs兼容
fmShareExclusive:不允许别的程序以任何方式打开该文件
fmShareDenyWrite:不允许别的程序以写方式打开该文件
fmShareDenyRead :不允许别的程序以读方式打开该文件
fmShareDenyNone :别的程序可以以任何方式打开该文件


(三)资源文件
1)、创建资源文件 
首先创建一个.Rc的纯文本文件。
格式: 资源标识符  关键字  资源文件名 

资源标识符:程序中调用资源时的特殊标号; 
关键字:标识资源文件类型;
Wave: 资源文件是声音文件;
RCDATA: JPEG文件;
AVI: AVI动画;
ICON: 图标文件; 
BITMAP: 位图文件; 
CURSOR: 光标文件; 
EXEFILE : EXE文件
资源文件名:资源文件的在磁盘上存储的文件全名

例如:
myzjy exefile zjy.exe

2)、编译资源文件
在DELPHI的安装目录的\Bin下,使用BRCC32.exe编译资源文件.RC。当然,也可以将BRCC32单独拷贝到程序文档目录使用。
例如:
Brcc32 wnhoo_reg.Rc

3)、资源文件引用

implementation

{$R *.dfm}
{$R wnhoo_reg.Res}

4)、调用资源文件
(1)存取资源文件中的位图(Bitmap) 
Image.Picture.Bitmap.Handle :=LoadBitmap(hInstance,''''资源标识符'''');
注:如果位图没有装载成功,程序仍旧执行,但是Image将不再显示图片。你可以根据LoadBitmap函数的返回值判断是否装载成功,如果装载成功返回值是非0,如果装载失败返回值是0。

另外一个存取显示位图的方法如下  
Image.Picture.Bitmap.LoadFromResourceName(hInstance,''''资源标识符''''); 

(2)存取资源文件中的光标
Screen.Cursors[]是一个光标数组,使用光标文件我们可以将定制的光标加入到这个属性中。因为默认的光标在数组中索引值是0,所以除非想取代默认光标,最好将定制的光标索引值设为1。 
Screen.Cursors[1] :=LoadCursor(hInstance,''''资源标识符'''');
Image.Cursor :=1;

(3)存取资源文件中的图标
将图标放在资源文件中,可以实现动态改变应用程序图标。
Application.Icon.Handle := LoadIcon(hInstance,''''资源标识符'''');

(4)存取资源文件中的AVI
Animate.ResName :=''''MyAvi'''' ; //资源标识符号
Animate.Active :=True ;

(5)存取资源文件中的JPEG
把jpeg单元加入到uses单元中。
var
Fjpg : TJpegImage ;
FStream :TResourceStream ;
begin
Fjpg :=TJpegImage.Create ;
//TresourceStream使用
FStream := TResourceStream.Create (Hinstance,''''资源标识符'''',资源类型) ;
FJpg.LoadFromStream (FStream) ;
Image.Picture.Bitmap.Assign (FJpg);

(6)存取资源文件中的Wave
把MMSystem加入uses单元中
PlaySound(pchar(''''mywav''''),Hinstance,Snd_ASync or Snd_Memory or snd_Resource) ;

(四)INI文件操作
(1)  INI文件的结构:
;这是关于INI文件的注释部分
[节点]
关键字=值
...
INI文件允许有多个节点,每个节点又允许有多个关键字, “=”后面是该关键字的值(类型有三种:字符串、整型数值和布尔值。其中字符串存贮在INI文件中时没有引号,布尔真值用1表示,布尔假值用0表示)。注释以分号“;”开头。

(2)  INI文件的操作
1、  在Interface的Uses节增加IniFiles;
2、  在Var变量定义部分增加一行:inifile:Tinifile;然后,就可以对变量myinifile进行创建、打开、读取、写入等操作了。
3、  打开INI文件:inifile:=Tinifile.create(''''tmp.ini'''');
4、  读取关键字的值:
a:=inifile.Readstring(''''节点'''',''''关键字'''',缺省值);// string类型
b:=inifile.Readinteger(''''节点'''',''''关键字'''',缺省值);// integer类型
c:=inifile.Readbool(''''节点'''',''''关键字'''',缺省值);// boolean类型
其中[缺省值]为该INI文件不存在该关键字时返回的缺省值。
5、  写入INI文件:
inifile.writestring(''''节点'''',''''关键字'''',变量或字符串值);
inifile.writeinteger(''''节点'''',''''关键字'''',变量或整型值);
inifile.writebool(''''节点'''',''''关键字'''',变量或True或False);
当这个INI文件的节点不存在时,上面的语句还会自动创建该INI文件。
6、  删除关键字:
inifile.DeleteKey(''''节点'''',''''关键字'''');//关键字删除
inifile.EraseSection(''''节点'''');// 节点删除
7、  节点操作:
inifile.readsection(''''节点'''',TStrings变量);//可将指定小节中的所有关键字名读取至一个字符串列表变量中;
inifile.readsections(TStrings变量);//可将INI文件中所有小节名读取至一个字符串列表变量中去。
inifile.readsectionvalues(''''节点'''',TStrings变量);//可将INI文件中指定小节的所有行(包括关键字、=、值)读取至一个字符串列表变量中去。
8、  释放:inifile.distory;或inifile.free;

(五)文件关联
uses
registry, shlobj;
//实现关联注册
procedure Tmyzip.regzzz;
var
reg: TRegistry;
begin
 reg := TRegistry.Create;
 reg.RootKey := HKEY_CLASSES_ROOT;
 reg.OpenKey(''''.zzz'''', true);
 reg.WriteString('''''''', ''''myzip'''');
 reg.CloseKey;
 reg.OpenKey(''''myzip\shell\open\command'''', true);
 //用于打开.zzz文件的可执行程序
 reg.WriteString('''''''', ''''"'''' + application.ExeName + ''''" "%1"'''');
 reg.CloseKey;
 reg.OpenKey(''''myzip\DefaultIcon'''',true);
 //取当前可执行程序的图标为.zzz文件的图标
 reg.WriteString('''''''',''''''''+application.ExeName+'''',0'''');
 reg.Free;
 //立即刷新
 SHChangeNotify(SHCNE_ASSOCCHANGED, SHCNF_IDLIST, nil, nil);

end;

2.3、加密压缩的实现
1、  生成INI临时加密文件
用于加密的INI的临时文件格式:
[FILE1]//节点,在软件中使用FILE1..N可以实现多文件加密
FILENAME=压缩文件名
PASSWORD=解压密码
FILESIZE=文件大小
FILEDATE=创建日期
ISJM=解压是否需要密码
如果是实现多文件、文件夹的信息存储,可以将密码关键字存在一个总的节点下。本文中仅是实现对单个文件的加密,所以只要上述格式就可以了。
2、  将数据文件与用于加密的INI文件的合并,这可以采用文件流的形式实现。
加密后文件结构图:
图(1) 
图(2)
上面两种形式,可以根据实际采用。本文采用图(1)的结构。
3、  对于加密后的数据,采用ZLIB技术实现压缩存储,生成新压缩形式的文件。

2.4、文件关联的实现 见2.2 (五)

2.5、自解压的实现
1.  建立一个专门

[1] [2] [3]  下一页


没有相关教程
教程录入:mintao    责任编辑:mintao 
  • 上一篇教程:

  • 下一篇教程:
  • 【字体: 】【发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
      注:本站部分文章源于互联网,版权归原作者所有!如有侵权,请原作者与本站联系,本站将立即删除! 本站文章除特别注明外均可转载,但需注明出处! [MinTao学以致用网]
      网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!)

    同类栏目
    · C语言系列  · VB.NET程序
    · JAVA开发  · Delphi程序
    · 脚本语言
    更多内容
    热门推荐 更多内容
  • 没有教程
  • 赞助链接
    更多内容
    闵涛博文 更多关于武汉SEO的内容
    500 - 内部服务器错误。

    500 - 内部服务器错误。

    您查找的资源存在问题,因而无法显示。

    | 设为首页 |加入收藏 | 联系站长 | 友情链接 | 版权申明 | 广告服务
    MinTao学以致用网

    Copyright @ 2007-2012 敏韬网(敏而好学,文韬武略--MinTao.Net)(学习笔记) Inc All Rights Reserved.
    闵涛 投放广告、内容合作请Q我! E_mail:admin@mintao.net(欢迎提供学习资源)

    站长:MinTao ICP备案号:鄂ICP备11006601号-18

    闵涛站盟:医药大全-武穴网A打造BCD……
    咸宁网络警察报警平台