unit Encodes;
interface
uses
  Sysutils;  type PBYTE=^BYTE;
  function GetEncodeString(szSrc:string;szSalt:string='BLUELAYER'):string;
  function GetEncodeHexString(szSrc:string;szSalt:string='BLUELAYER'):string;
  function GetDecodeString(szSrc:string;szSalt:string='BLUELAYER'):string;
  function GetDecodeHexString(szSrc:string;szSalt:string='BLUELAYER'):string;  function Encode(szSrc:PBYTE;szSrcLen:Longword;szSalt:PBYTE;szSaltLen:Longword;szDest:PBYTE;var szDestLen:Longword):integer;stdcall;
  function Decode(szSrc:PBYTE;szSrcLen:Longword;szSalt:PBYTE;szSaltLen:Longword;szDest:PBYTE;var szDestLen:Longword):integer;stdcall;
  function EncodeString(szSrc:PCHAR;szSalt:PCHAR;szDest:PCHAR;var szDestLen:Longword):integer;stdcall;
  function DecodeString(szSrc:PCHAR;szSalt:PCHAR;szDest:PCHAR;var szDestLen:Longword):integer;stdcall;implementation
  function Encode( szSrc:PBYTE;szSrcLen:Longword;szSalt:PBYTE;szSaltLen:Longword;szDest:PBYTE;var szDestLen:Longword):integer; external 'ENCODE.DLL';
  function Decode(szSrc:PBYTE;szSrcLen:Longword;szSalt:PBYTE;szSaltLen:Longword;szDest:PBYTE;var szDestLen:Longword):integer;external 'ENCODE.DLL';
  function EncodeString(szSrc:PCHAR;szSalt:PCHAR;szDest:PCHAR;var szDestLen:Longword):integer;external 'ENCODE.DLL';
  function DecodeString(szSrc:PCHAR;szSalt:PCHAR;szDest:PCHAR;var szDestLen:Longword):integer;external 'ENCODE.DLL';  function GetEncodeString(szSrc:string;szSalt:string):string;
  var
   strlen:LongWord;
   chResult:Pchar;
   status:integer;  begin
    Result:='';
    strlen:=4*Length(szSrc);
    GetMem(chResult,strlen);
    status:=EncodeString(PChar(szSrc),PChar(szSalt),chResult,strlen);
    if status=0 then
       Result:=chResult;
    FreeMem(chResult);
  end;  function GetEncodeHexString(szSrc:string;szSalt:string):string;
  var
   strlen:LongWord;
   chResult,chTp:Pchar;
   i,status:integer;
  begin
    result:='';
    strlen:=4*Length(szSrc);
    GetMem(chResult,strlen);
    status:=EncodeString(PChar(szSrc),PChar(szSalt),chResult,strlen);
    if status=0 then
    begin
      chTp:=chResult;
      for i:=0 to strlen-1 do
      begin
       result:=result+Format('%2x',[ord(chTp^)]);
       inc(chTp);
      end;
    end;
    freemem(chResult);
  end;  function GetDecodeString(szSrc:string;szSalt:string):string;
  var
   strlen:LongWord;
   chResult:Pchar;
   status:integer;
  begin
    result:='';
    strlen:=2*Length(szSrc);
    GetMem(chResult,120);
    status:=DecodeString(PChar(szSrc),PChar(szSalt),chResult,strlen);
    if status=0 then
       result:=result+chResult;
    freemem(chResult);
  end;  function GetDecodeHexString(szSrc:string;szSalt:string):string;
    var
   strlen:LongWord;
   chResult:Pchar;
   i,status:integer;
   szHexSrc,szStr:string;
  begin
    result:='';
    i:=1;
    while i<length(szSrc) do
    begin
       szStr:='$'+szSrc[i]+szSrc[i+1];
       szHexSrc:=szHexSrc+chr(strtoint(szStr));
       inc(i);
       inc(i);
    end;
    strlen:=2*Length(szHexSrc);
    GetMem(chResult,strlen);
    status:=DecodeString(PChar(szHexSrc),PChar(szSalt),chResult,strlen);
    if status=0 then
      result:=result+chResult;
    freemem(chResult);
  end;
end.

解决方案 »

  1.   

    //加密函数
    function Tfuncs.Encrypt(Src:String; Key:String):String;stdcall;
    var KeyLen,KeyPos,Offset,SrcPos,SrcAsc:Integer;
        Dest :ShortString;
    begin
      KeyLen:=Length(Key);
      if KeyLen = 0 then Key:='I Love JFM';
      KeyPos:=0;
      Randomize;
      Offset:=Random(256);
      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;//解密函数
    function Tfuncs.Decrypt(Src:String; Key:String):String;stdcall;
    var KeyLen,KeyPos,Offset,SrcPos,SrcAsc,TmpSrcAsc:Integer;
        Dest:String;
    begin
      KeyLen:=Length(Key);
      if KeyLen = 0 then Key:='I Love JFM';
      KeyPos:=0;
      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;