字符串的加解密 100分(100分)

  • 主题发起人 主题发起人 fzbxh
  • 开始时间 开始时间
F

fzbxh

Unregistered / Unconfirmed
GUEST, unregistred user!
有没有好一点的字符串加解密函数啊?
 
取一个数异或,够简单吧.
 
你需要注意一下,空字符串不能加,你要自己再处理一下
function CryptStr(const S:String;
sType: DWord):String;
var
tmp_str:string;
i: Integer;
FKey: Integer;
begin
tmp_str:=s;
result:='';
case sType of
0: //SetPass;
begin
tmp_str:=FormatStr('*',tmp_str,20);
Randomize;
FKey := Random($FF);
for i:=1 to Length(tmp_str) do
Result := Result+Chr( Ord(tmp_str) xor i xor FKey);
Result := Result + Chr(FKey);
end;
1: //GetPass
begin
FKey := Ord(S[Length(tmp_str)]);
for i:=1 to Length(tmp_str) - 1 do
Result := Result+Chr( Ord(tmp_str) xor i xor FKey);
end;
end;
 
FormatStr是什函数?
 
funCtion FormatStr(ch,s:string;Len:Integer):string;
//在字符串S前加若干个CH使期长度变为LEN
begin
while (len-length(s)>0) do
s:=ch+s;
Result :=s;
end;
你可以不用,自己写个
 
to antic_ant:
那你的解密過程呢.你加密時有隨機因素,那解密時可不能隨機解吧?
 
to antic_ant:
Sorry,沒仔細看.解密沒問題的.
 
将字串变成十六进制的字串,如下:Encrypt表示加密还是解密,key是任意的字串,但
加密和解密的字串Key要一致。
function EncryptionEngine(Src:String;
Key:String;
Encrypt : Boolean):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:='iloveyou';
KeyPos:=0;
SrcPos:=0;
SrcAsc:=0;
Range:=256;
if Encrypt then
begin
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;
end
else
begin
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);
end;
Result:=Dest;
end;
 
多人接受答案了。
 
后退
顶部