请问如何修改下列加密程序,将字符窜的输入输出,改成内存流的形式,100分肯定送分

ming 2002-07-10 09:14:34
小弟我对流操作不熟,请各位高手指教,就是把src和result改成tmemorystream的类型,谢谢
function EncrypKey(Src: String; Key: String): String;
var
KeyLen :Integer;
KeyPos :Integer;
offset :Integer;
dest :string;
SrcPos :Integer;
SrcAsc :Integer;
Range :Integer;
begin
KeyLen:=Length(Key);
if KeyLen = 0 then
key:='TinTin2000';
KeyPos:=0;
Range:=256;

Randomize;
offset:=Random(Range);
dest:=format('%1.2x',[offset]);
for SrcPos := 1 to Length(Src) do
begin
SrcAsc:=(Ord(Src[SrcPos]) + offset) MOD 255;
if KeyPos < KeyLen then
KeyPos:= KeyPos + 1
else
KeyPos:=1;
SrcAsc:= SrcAsc xor Ord(Key[KeyPos]);
dest:=dest + format('%1.2x',[SrcAsc]);
offset:=SrcAsc;
end;
Result:=Dest;
end;
...全文
86 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
ming 2002-07-11
  • 打赏
  • 举报
回复
有高手指点吗
ming 2002-07-10
  • 打赏
  • 举报
回复
请问里面有没有错误,是不是所有的字符都可以进行加密,包括中文和其他的一些字符,这个加密程序有没有限制,我试着打开一些文本文件,比较小的ok
但是打开一些大的电影文件,或者exe文件,加密后再解密,这些文件就不行了,不知道为什么
王集鹄 2002-07-10
  • 打赏
  • 举报
回复
//请参考
http://kingron.myetang.com/zsfunc0d.htm
ming 2002-07-10
  • 打赏
  • 举报
回复
有高手在吗
ming 2002-07-10
  • 打赏
  • 举报
回复
这样写行不行
Function EncryptionEngine(src:TMemoryStream;Encrypt : Boolean):TMemoryStream;
var
//idx :integer;
KEY :STRING;
KeyLen :Integer;
KeyPos :Integer;
offset :Integer;
dest :TMemoryStream;
SrcPos :Integer;
SrcAsc :Integer;
TmpSrcAsc :Integer;
Range :Integer;
ch:byte;
ch1,ch2:char;

begin
RESULT:=TMemoryStream.Create;
DEST:=TMemoryStream.Create;
key:='abcd';
KeyLen:=Length(Key);
KeyPos:=0;
Range:=256;
if Encrypt then
begin
Randomize;
offset:=Random(Range);
dest.Position:=0;
src.Position:=0;
dest.Write(pchar(format('%1.2x',[offset]))^,2);
for SrcPos := 0 to Src.Size-1 do
begin
src.Read(ch,1);
SrcAsc:=(Ord(ch) + offset) MOD 255;
if KeyPos < KeyLen then KeyPos:= KeyPos + 1 else KeyPos:=1;
SrcAsc:= SrcAsc xor Ord(Key[KeyPos]);
dest.Write(pchar(format('%1.2x',[srcasc]))^,2);
offset:=SrcAsc;
end;
end
else
begin
src.Position:=0;
dest.Position:=0;
src.Read(ch1,1);
src.Read(ch2,1);
offset:=StrToInt('$'+ ch1+ch2);
SrcPos:=2;
repeat
src.Read(ch1,1);
src.Read(ch2,1);
SrcAsc:=StrToInt('$'+ ch1+ch2);
if KeyPos < KeyLen Then KeyPos := KeyPos + 1 else KeyPos := 1;
TmpSrcAsc := SrcAsc xor Ord(Key[KeyPos]);
if TmpSrcAsc <= offset then
TmpSrcAsc := 255 + TmpSrcAsc - offset
else
TmpSrcAsc := TmpSrcAsc - offset;
dest.Write(char(tmpsrcasc),1);
offset:=srcAsc;
SrcPos:=SrcPos + 2;
until SrcPos >= Src.Size-1;
end;
result.Position:=0;
dest.Position:=0;
Result.CopyFrom(Dest,dest.Size);
dest.Free;
end;
王集鹄 2002-07-10
  • 打赏
  • 举报
回复
var
vStringStream: TStringStream;
begin
vStringStream := TStringStream.Create(UncrypKey('参数1', '参数2'));
try
{ TODO : 使用vStringStream }
finally
vStringStream.Free;
end;
end;
ming 2002-07-10
  • 打赏
  • 举报
回复
还有解密函数
Function UncrypKey (Src:String; Key:String):string;
var
idx :integer;
KeyLen :Integer;
KeyPos :Integer;
offset :Integer;
dest :string;
SrcPos :Integer;
SrcAsc :Integer;
TmpSrcAsc :Integer;
Range :Integer;
begin
KeyLen:=Length(Key);
if KeyLen = 0 then key:='Think Space';
KeyPos:=0;
SrcPos:=0;
SrcAsc:=0;
Range:=256;
offset:=StrToInt('$'+ copy(src,1,2));
SrcPos:=3;
repeat
SrcAsc:=StrToInt('$'+ copy(src,SrcPos,2));
if KeyPos < KeyLen Then KeyPos := KeyPos + 1 else KeyPos := 1;
TmpSrcAsc := SrcAsc xor Ord(Key[KeyPos]);
if TmpSrcAsc <= offset then
TmpSrcAsc := 255 + TmpSrcAsc - offset
else
TmpSrcAsc := TmpSrcAsc - offset;
dest := dest + chr(TmpSrcAsc);
offset:=srcAsc;
SrcPos:=SrcPos + 2;
until SrcPos >= Length(Src);
Result:=Dest;
end;
王集鹄 2002-07-10
  • 打赏
  • 举报
回复
var
vStringStream: TStringStream;
begin
vStringStream := TStringStream.Create(EncrypKey('参数1', '参数2'));
try
{ TODO : 使用vStringStream }
finally
vStringStream.Free;
end;
end;

5,388

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧