您现在的位置:网侠>网络冲浪>网络技术>正文
正文

编写定制的文件流实现文件读写加密

文章来源: 文章作者: 发布时间:2007-07-18 【字体:
收藏本文】 【推荐好友】 【进入博客】 【进入论坛
在Delphi中预定义了Tfilestream类,通过它可以对磁盘文件进行读写,笔者选定Tfilestream为基类,通过对其核心的两个读、写方法进行重载,编写定制的文件流,实现对文件的读、写进行加密。

 

字串3

首先,来看一下定制文件流(Tmystream)的声明:

字串1

type

字串7

Tmystream=class(Tfilestream)

字串5

private

字串6

fkey:string;

字串8

public

字串8

constructor create(const filename:string;mode:word);

字串1

function read(var buffer;count:longint):longint;override;

字串1

function write(const buffer;count:longint):longint;override; 字串2

property key:string read fkey write fkey ; 字串3

end;

字串4

---- 在Tmystream的声名中,我们对read、write两个方法进行了重载,并添加了一个新的特性key,用以存储对文件进行加密时所需的密码。为实现文件读写的加密,在write方法中,将key的每个字符依次与buffer中的字符相加,将得到的结果写入文件,实现加密;在read方法中,将读出的内容依次与key的每个字符相减,实现解密。加密及解密的方法多种多样,读者可以通过改写相关代码,得到不同的加密方法。 字串8

程序清单如下:

字串4

function Tmystream.write(const buffer;count:longint):longint;

字串5

var

字串1

Pbu,Pmy,mykey:pchar; 字串4

i,enc:integer;

字串6

begin

字串9

getmem(pmy,count); //为pmy分配内存

字串1

mykey:=pchar(key); //将key转换为pchar指针

字串2

try

字串7

pbu:=pchar(@buffer); //将buffer转换为pchar指针 字串5

for i:=0 to count-1 do 字串5

//将key的每个字符以此与buffer的每个字符循环相加,结果放入pmy指向的内存区

字串3

begin

字串6

enc:=(ord(pbu[i])+ord(mykey[(i mod length(key))])) mod 256;

字串9

Pmy[i]:=char(enc); 字串4

end;

字串2

result:=inherited write(Pmy^,count); //将pmy指向的内容写入文件 字串6

finally 字串9

freemem(Pmy,count);

字串2

end;

字串6

end; 字串2

function Tmystream.read(var buffer;count:longint):longint;

字串5

var

字串9

Pbu,Pmy,mykey:pchar; 字串9

i,mycount,enc:integer; 字串6

begin 字串5

getmem(Pmy,count);//为pmy分配内存 字串9

mykey:=pchar(key);//将key转换为pchar指针

字串5

try 字串5

mycount:=inherited read(Pmy^,count); //将文件内容读入pmy指向内存区

字串2

Pbu:=Pchar(@buffer);将buffer转换为pchar指针

字串7

for i:=0 to mycount-1 do//将key的每个字符依次与pmy的每个字符循环相减,结果放入pbu指向的变量 字串2

begin 字串5

enc:=(ord(Pmy[i])-ord(mykey[(i mod length(key))])) mod 256; 字串8

Pbu[i]:=chr(enc);

字串7

end;

字串5

finally

字串6

freemem(Pmy,count); 字串9

end; 字串5

result:=mycount;

字串2

end;

字串3

---- 完成定制文件流的编写后,便可在程序中应用,实现文件的读写加密,例程如下:

字串6

unit Unit1; 字串4

interface

字串5

uses Windows, Messages, SysUtils, Classes,Graphics, Controls, Forms, Dialogs,ExtCtrls, StdCtrls,unit2,unit3;

字串6

//unit2定义了Tmystream

字串8

//unit3定义了输入密码对话框form3

字串6

type 字串7

TForm1 = class(TForm) 字串5

Button1: TButton; 字串9

Button2: TButton; 字串4

Button3: TButton;

字串2

OpenDialog1: TOpenDialog;

字串9

SaveDialog1: TSaveDialog;

字串5

Panel1: TPanel;

字串9

Panel2: TPanel;

字串4

Memo1: TMemo;

字串2

Splitter1: TSplitter;

字串9

Memo2: TMemo; 字串2

procedure Button2Click(Sender: TObject);

字串1

procedure Button3Click(Sender: TObject); 字串5

procedure Button1Click(Sender: TObject); 字串5

private 字串1

{ Private declarations } 字串7

public 字串4

{ Public declarations } 字串5

end;

字串3

var

字串2

Form1: TForm1; 字串9

implementation

字串6

{$R *.DFM} 字串4

procedure TForm1.Button2Click(Sender: TObject); //将选定的加密文件解开,读入memo2

字串6

var

字串1

encstr:Tmystream;

字串5

begin

字串5

if opendialog1.Execute and (form3.showmodal=mrok) then

字串8

begin

字串7

encstr:=Tmystream.create(opendialog1.filename,fmopenread); 字串2

encstr.key:=form3.Edit1.Text;

字串6

try

字串8

memo2.lines.LoadFromStream(encstr); 字串2

finally

字串4

encstr.Free; 字串3

end; 字串1

end; 字串2

end; 字串3

procedure TForm1.Button3Click(Sender: TObject); //将memo1中的内容加密,用指定文件名另存

字串8

var 字串3

encstr:Tmystream;

字串8

begin

字串8

if savedialog1.Execute and (form3.showmodal=mrok) then 字串2

begin

字串2

encstr:=Tmystream.create(savedialog1.filename,fmcreate); 字串7

encstr.key:=form3.Edit1.Text; 字串4

try 字串4

memo1.lines.SaveToStream(encstr); 字串4

finally 字串9

encstr.Free;

字串6

end;

字串8

end;

字串1

end;

字串4

procedure TForm1.Button1Click(Sender: TObject); //将指定文件读入memo1 字串7

var 字串6

mystr:Tfilestream; 字串6

begin 字串6

if opendialog1.Execute then 字串3

begin 字串2

mystr:=Tfilestream.create(opendialog1.filename,fmopenread);

字串9

try

字串9

memo1.lines.LoadFromStream(mystr);

字串4

finally 字串1

mystr.Free; 字串5

end;

字串6

end; 字串4

end; 字串9

end.

字串6




上一篇:常用电脑密码破解  下一篇:网吧常见的漏洞和利用*
推荐新闻
     
 
邮箱:ewind@qq.com
建议您使用:1024*768以上分辩率浏览本站 如果你喜欢本站 请收藏本站 并推荐给你的朋友一起分享
免责声明:本站部分内容收集于网络,版权归原作者及出版社所有!如果您觉得侵犯了您的版权请来信告诉我们,我们会尽快删除其内容!