如何给结构体加密解密?(100分)

T

Tophi

Unregistered / Unconfirmed
GUEST, unregistred user!
我现定义一个record,然后想把record写到文件保存,然后系统读取这个文件,获得这个record。
但实际上那个record安全性不够高,我想先把先把record加密,然后再写入文件,然后读取文件后解密获得这个record。
请问我该怎么做呵呵?我现在只会对string加密解密:(
紧急!谢谢!
 
例如:
arec=record
... ...
end;

var
a:arec;
b:pbyte;
c:byte;
i:integer;
begin
b:=pbyte(@a);
for i:=1 to sizeof(arec) do
begin
c:=byte(b^);
c:=c xor byte('A'); // 简单的加密,呵呵!
b^:=c;
end;
把a 写入文件!
end;
 
给你一个将记录体转换成十六进制字符串写到文件中保存的例子,转换后记录体的内容已经变成0,1,2,3..A,B,C,D,E,F十六进制表示的字符串了,如果需要,你还可以对这个串时行加密解密。

TStsSend是任何有固定长度的记录体,像整数、实数都没问题,关键要记住不能出现
var1 : String; 的定义,而必须定义成指定长度,比如
var1 : String[1000]; 否则会因为SIZEOF取不到正确的记录体长度而失败。


Function EnCode(tpSend:TSysSend):String;
var SentStream:TMemoryStream;
TmpComm:pchar;
Tmp:String;
begin
Result := '';
SentStream:=Tmemorystream.Create;
try
TmpLen:=sizeof(tpSend);
SentStream.Write(Tmplen,sizeof(integer)); //将记录体的长度写入流变量,用作解密时校对,可以省略,但解密时也要作相应更改。
Sentstream.Write(tpSend,Tmplen); //将变体写入流变量
Sentstream.Seek(0,0);
SetLength(tmp,SentStream.Size * 2);
BinToHex(PChar(Integer(SentStream.Memory)), PChar(Tmp),SentStream.Size); //将二进制内存流变成十六进制字符串
Result := Trim(tmp);
finally
sentStream.Free;
end;
end;

Procedure DeCodeParam(RecStrs:String; Var sbSys:TSysSend);
var
TmpRcvd:String;
Rcvd:TMemoryStream;
tmpLen:integer;
begin
TmpRcvd:=RecStrs;
rcvd:=tmemorystream.Create;
try
Rcvd.SetSize(Length(tmpRcvd) div 2);
HexToBin(PChar(TmpRcvd),PChar(Integer(Rcvd.Memory)),Length(tmpRcvd) div 2);
rcvd.Read(tmplen,sizeof(integer));
if Tmplen<>sizeof(sbSys) then
begin
ShowMessage('Error');
Abort;
end;
rcvd.Read(sbSys,Tmplen);
finally
Rcvd.Free;
end;
end;
 
用levi方法搞定,那个seek很重要呵呵:)
 

Similar threads

顶部