求字符串加密的代码,就是EncryptString(Source, Key: pchar): pchar;这种(100分)

  • 主题发起人 主题发起人 lxftwo
  • 开始时间 开始时间
L

lxftwo

Unregistered / Unconfirmed
GUEST, unregistred user!
我有这些代码 ,但是每次解密时,都会少解出第一个字符??
代码:
function EncryptString(Source, Key: pchar): pchar;
//对字符串加密(Source:源 Key:密匙)
var KeyLen :Integer;
KeyPos :Integer;
offset :Integer;
dest :string;
SrcPos :Integer;
SrcAsc :Integer;
Range :Integer;
begin
KeyLen:=Length(Key);
if KeyLen = 0 then key:='topsoft';
KeyPos:=0;
Range:=256;
Randomize;
offset:=Random(Range);
dest:=format('%1.2x',[offset]);
for SrcPos := 1 to Length(Source) do
begin
SrcAsc:=(Ord(Source[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:=pchar(Dest);
end;

function UnEncryptString (Source, Key: pchar):pchar;
//对字符串解密(Src:源 Key:密匙)
var KeyLen :Integer;
KeyPos :Integer;
offset :Integer;
dest :string;
SrcPos :Integer;
SrcAsc :Integer;
TmpSrcAsc :Integer;
begin
KeyLen:=Length(Key);
if KeyLen = 0 then key:='topsoft';
KeyPos:=0;
offset:=StrToInt('$'+ copy(Source,1,2));
SrcPos:=3;
repeat
SrcAsc:=StrToInt('$'+ copy(Source,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(Source);
Result:=pchar(Dest);
end;
 
...
for SrcPos := 0 to Length(Source)-1 do
....
 
这个代码是由字符串参数,改为了 PChar 参数,没有改完整的原因。
更正方法有二:
一、用 TYZhang 兄的改法即可,
二、也可以将参数类型直接改为 string
如果将参数类型改为 string 最好同时将两段代码中的KeyPos:=0;也改为KeyPos:=1;(当然不改也行)
 
后退
顶部