DELPHI盒子
!实时搜索: 盒子论坛 | 注册用户 | 修改信息 | 退出
检举帖 | 全文检索 | 关闭广告 | 捐赠
技术论坛
 用户名
 密  码
自动登陆(30天有效)
忘了密码
≡技术区≡
DELPHI技术
lazarus/fpc/Free Pascal
移动应用开发
Web应用开发
数据库专区
报表专区
网络通讯
开源项目
论坛精华贴
≡发布区≡
发布代码
发布控件
文档资料
经典工具
≡事务区≡
网站意见
盒子之家
招聘应聘
信息交换
论坛信息
最新加入: KfnqDuxw
今日帖子: 8
在线用户: 4
导航: 论坛 -> DELPHI技术 斑竹:liumazi,sephil  
作者:
男 root_lh (Lhxs) ★☆☆☆☆ -
盒子活跃会员
2004/5/11 0:22:26
标题:
向各位大哥请教一个问题? 浏览:1092
加入我的收藏
楼主: 怎样实现对文件加密,比如winrar的解压密码。
----------------------------------------------
中流一壶,千金争挈。宁为铅刀,毋为楮叶。错节盘根,利器斯别。识时务者,呼为俊杰!
作者:
男 sephil (NAILY Soft) ★☆☆☆☆ -
盒子中级会员
2004/5/11 1:08:00
1楼: 解密算法多了
自己去找个用用
----------------------------------------------
Copyright 2008 ? NAILY Soft

Click here to redirect to my home
Click here to redirect to my blog
作者:
男 root_lh (Lhxs) ★☆☆☆☆ -
盒子活跃会员
2004/5/11 9:13:27
2楼: sephil老大我不是指加密算法,我是想在我的文件头里加一个密码,像word文档那样可以把自己的文件设置一个密码打开。
----------------------------------------------
中流一壶,千金争挈。宁为铅刀,毋为楮叶。错节盘根,利器斯别。识时务者,呼为俊杰!
作者:
男 root_lh (Lhxs) ★☆☆☆☆ -
盒子活跃会员
2004/5/11 9:57:01
3楼: 整理编辑:China ASP

 

在Delphi中预定义了Tfilestream类,通过它可以对磁盘文件进行读写,笔者选定Tfilestream为基类,通过对其核心的两个读、写方法进行重载,编写定制的文件流,实现对文件的读、写进行加密。

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

type

Tmystream=class(Tfilestream)

private

fkey:string;

public

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

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

function write(const buffer;count:longint):longint;override;

property key:string read fkey write fkey ;

end;

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

程序清单如下:

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

var

Pbu,Pmy,mykey:pchar;

i,enc:integer;

begin

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

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

try

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

for i:=0 to count-1 do

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

begin

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

Pmy[i]:=char(enc);

end;

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

finally

freemem(Pmy,count);

end;

end;

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

var

Pbu,Pmy,mykey:pchar;

i,mycount,enc:integer;

begin

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

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

try

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

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

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

begin

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

Pbu[i]:=chr(enc);

end;

finally

freemem(Pmy,count);

end;

result:=mycount;

end;

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

unit Unit1;

interface

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

//unit2定义了Tmystream

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

type

TForm1 = class(TForm)

Button1: TButton;

Button2: TButton;

Button3: TButton;

OpenDialog1: TOpenDialog;

SaveDialog1: TSaveDialog;

Panel1: TPanel;

Panel2: TPanel;

Memo1: TMemo;

Splitter1: TSplitter;

Memo2: TMemo;

procedure Button2Click(Sender: TObject);

procedure Button3Click(Sender: TObject);

procedure Button1Click(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;

var

Form1: TForm1;

implementation

{$R *.DFM}

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

var

encstr:Tmystream;

begin

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

begin

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

encstr.key:=form3.Edit1.Text;

try

memo2.lines.LoadFromStream(encstr);

finally

encstr.Free;

end;

end;

end;

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

var

encstr:Tmystream;

begin

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

begin

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

encstr.key:=form3.Edit1.Text;

try

memo1.lines.SaveToStream(encstr);

finally

encstr.Free;

end;

end;

end;

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

var

mystr:Tfilestream;

begin

if opendialog1.Execute then

begin

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

try

memo1.lines.LoadFromStream(mystr);

finally

mystr.Free;

end;

end;

end;

end.

----------------------------------------------
中流一壶,千金争挈。宁为铅刀,毋为楮叶。错节盘根,利器斯别。识时务者,呼为俊杰!
作者:
男 sephil (NAILY Soft) ★☆☆☆☆ -
盒子中级会员
2004/5/11 10:02:16
4楼: 自己定义好文件结构就行了

比如将文件前8个字节来保存密码,后面是数据

----------------------------------------------
Copyright 2008 ? NAILY Soft

Click here to redirect to my home
Click here to redirect to my blog
作者:
男 root_lh (Lhxs) ★☆☆☆☆ -
盒子活跃会员
2004/5/11 10:06:54
5楼: 哈哈,谢谢老大.我正在想这么干。
----------------------------------------------
中流一壶,千金争挈。宁为铅刀,毋为楮叶。错节盘根,利器斯别。识时务者,呼为俊杰!
作者:
男 root_lh (Lhxs) ★☆☆☆☆ -
盒子活跃会员
2004/5/11 10:28:58
6楼: sephil  老大,我想了半天摸不足头,我在对文件头进行加密里,怎样弹出密码框哦!
如有这方面的资料,还望sephil  老大,不吝上传哦!

----------------------------------------------
中流一壶,千金争挈。宁为铅刀,毋为楮叶。错节盘根,利器斯别。识时务者,呼为俊杰!
信息
登陆以后才能回复
Copyright © 2CCC.Com 盒子论坛 v3.0.1 版权所有 页面执行80.07813毫秒 RSS